之前的AuthorizationServer的文章总感觉写的不太清楚,这里新开一篇,结合具体代码再记录一下
密码验证
首先从密码验证开始,一般移动端都是直接调用认证服务的接口把密码传过去后台直接返回token,就一个交互,简单快捷。
客户端配置
authServer的ClientDetailsServiceConfigurer 的 配置
@Override
public void configure(ClientDetailsServiceConfigurer clients)
throws Exception {
clients.withClientDetails(clientDetailsService);
}
@Bean(name = "myClientDetailsService")
@Primary
public ClientDetailsService clientDetailsService() throws Exception {
InMemoryClientDetailsServiceBuilder b = new InMemoryClientDetailsServiceBuilder();
b
.withClient("net5ijy")
.secret("12345678")
.authorizedGrantTypes("password") //授权模式为password和refresh_token两种
.scopes("all");
return b.build();
}
以上,配置了客户端的记录,当然也可以使用数据库方式JdbcClientDetailsService
认证端点的配置
AuthorizationServerEndpointsConfigurer的配置
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.tokenServices(tokenServices)
.tokenStore(tokenStore)
.authorizationCodeServices(authorizationCodeServices)
.userDetailsService(userDetailsService)
.userApprovalHandler(userApprovalHandler())
.authenticationManager(authenticationManager)
;
}
tokenStore 处理token的保存,生成等。实现类包括InMemoryTokenStore,JdbcTokenStore,JwtTokenStore,RedisTokenStore。
- JwtTokenStore 这个实现方式不用管如何进行存储(内存或磁盘),因为它可以把相关信息数据编码存放在令牌里。JwtTokenStore 不会保存任何数据,但是它在转换令牌值以及授权信息方面与 DefaultTokenServices 所扮演的角色是一样的。
- 既然jwt是将信息存放在令牌中,那么就得考虑其安全性,因此,OAuth2提供了JwtAccessTokenConverter实现,添加jwtSigningKey,以此生成秘钥,以此进行签名,只有jwtSigningKey才能获取信息。
tokenServices 设置tokenStore,clientDetailsService,tokenEnhancer等,是处理token的业务实现类
authorizationCodeServices,帮我们完成code的生成过程。如果你想按照自己的规则生成授权码code请自定义
userDetailsService,根据用户名查询用户信息。可以使用数据库等,自己实现查询方法
authenticationManager,认证管理器,与spring-security意义相同,使用默认即可。
UserApprovalHandler
AuthorizationServerSecurityConfigurer的配置
定义令牌端点上的安全约束
总结
经过以上的配置,就完成了password方式授权的相关配置。
网友评论