springboot2.0整合oauth2模式
Peter ⽼师继续聊聊项⽬5
Peter ⽼师继续聊聊项⽬5
⼀、总体流程与思路:
总体流程其实就是如下,这⾥很明确的,有资源服务器,认证服务器等。
-⽤户打开客户端后,客户端要求⽤户给予授权。
-⽤户同意给予客户端授权。
-客户端使⽤授权得到的code,向认证服务器申请token令牌。
-认证服务器对客户端进⾏认证以后,确认⽆误,同意发放令牌。
-客户端请求资源时携带token令牌,向资源服务器申请获取资源。
-资源服务器确认令牌⽆误,同意向客户端开放资源。
基本的思路就是:
实现OAuth2.0单点登陆需要准备3个Springboot服务
1)资源服务
2)授权服务
3)⽤户访问服务
⼆、代码详解:
项⽬5 其实不是要让学员实现什么,学员需要的代码,⼏乎都给出了,项⽬5 的⽬的其实是让学员把代码组成项⽬⼯程,⼀个完整的项⽬⼯程⽂件。其中同学问了⼀个很关键的问题:
configure⽬录是⼲啥的?其实configure⽬录是登陆的核⼼服务在那⾥。
- 资源服务:
/**
* 资源服务器
**/
@Configuration
@EnableResourceServer
public class MyResourceServerConfig extends ResourceServerConfigurerAdapter {
@Autowired
private MyAuthenticationSuccessHandler myAuthenticationSuccessHandler;
@Autowired
private MyAuthenticationFailHandler myAuthenticationFailHandler;
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.
antMatchers("/**/*.js","/**/*.html","/**/*.css",
"/oauth/**","/**/*.jpg","/**/*.png","/**/*.ttf","/**/*.woff","/**/*.woff2").permitAll()
//其他的请求都必须要有权限认证
.anyRequest()
.authenticated()
.and()
.formLogin()//允许⽤户进⾏基于表单的认证
.loginPage("/login.html")
.successHandler(myAuthenticationSuccessHandler)
.failureHandler(myAuthenticationFailHandler)
.and()
.
headers().frameOptions().disable()
.and()
// 暂时禁⽤CSRF,否则⽆法提交登录表单
.csrf().disable();
}
public MyAuthenticationSuccessHandler loginSuccessHandler(){
return new MyAuthenticationSuccessHandler();
}
}
由于登录分为成功和失败两种情况。
登录认证失败,则重新登录
登录认证成功,此处是密码授权⽅式,我们将成功信息包括tokenId返回给调⽤⽅,同时保存⽤户相关信息,包括⽤户名、token、登录次数等。可以定义失败处理器:
登录成功后的处理:
@Slf4j
@Component
public class MyAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
@Autowired
private ClientDetailsService clientDetailsService;
@Autowired
private AuthorizationServerTokenServices authorizationServerTokenServices;
@Autowired
private UserService userService;
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
logger.info("登录成功");
String username = Parameter("username");
String password = Parameter("password");
String clientId = Parameter("clientId");
String clientSecret = Parameter("clientSecret");
log.info("userName:"+username);
log.info("password:"+password);
log.info("clientId:"+clientId);
log.info("clientSecret"+clientSecret);
//获取 ClientDetails
ClientDetails clientDetails = clientDetailsService.loadClientByClientId(clientId);
if (clientDetails == null){
throw new UnapprovedClientAuthenticationException("clientId 不存在"+clientId);
//判断  ⽅⾔  是否⼀致
}else if (!StringUtils.ClientSecret(),clientSecret)){
throw new UnapprovedClientAuthenticationException("clientSecret 不匹配"+clientId);
}
//密码授权 模式, 组建 authentication
TokenRequest tokenRequest = new TokenRequest(new HashMap<String,String>
(),Scope(),"password");
OAuth2Request oAuth2Request = ateOAuth2Request(clientDetails);
OAuth2Authentication oAuth2Authentication = new OAuth2Authentication(oAuth2Request,authentication);        OAuth2AccessToken token = ateAccessToken(oAuth2Authentication);        log.info("token:"+JSON(token));
//根据⽤户名和token先查询是否已经存在
Integer count = untLogin(Value());
if(null != count && count > 0){
log.info("⽤户:"+username+"-"+" token:"+Value()+"已经存在");
}else{
//根据⽤户名称和tokenId保存 登录信息
userService.saveLogin(Value());
}
//登录次数 +1
userService.addLogin(username);
//将 authention 信息打包成json格式返回
response.setContentType("application/json;charset=UTF-8");
response.setStatus(HttpStatus.OK.value());
response.sendRedirect("/main.html?tokenId="+Value());
}
}
然后是登陆认证服务。先确定授权,即某某⼈,某某帐号可以登陆,如某某学员是极客营学员,可以访问极客营资源,再判断他(她)只能访问Java L2 课程资源,他(她)不能访问架构师课程资源。⼤致就是这个意思。
如果登录成功,我们需要配置认证服务,实现信息存储
认证服务
/**
* 认证服务器
*/
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
@Autowired
DataSource dataSource;
// 声明TokenStore实现 数据库存储
@Bean
public TokenStore tokenStore() {
return new JdbcTokenStore(dataSource);
springboot是啥}
/
/ 声明 ClientDetails实现 数据库存储
@Bean
public ClientDetailsService clientDetails() {
return new JdbcClientDetailsService(dataSource);
}
@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
// 配置token获取和验证时的策略 (Spring Security安全表达式),可以表单提交
}
/**

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。