- 基本的Token参数配置(代码中的解释很详细)
- 配置认证服务器TiHomAuthorizationServerConfig
- core中创建类OAuth2Properties和OAuth2ClientProperties,OAuth2Properties用来管理OAuth2ClientProperties对象,也就是多个第三方应用的client管理;OAuth2ClientProperties是对单个client属性的配置
- 把OAuth2Properties添加到SecurityProperties中
- 去application.properties中配置
tihom.security.oauth2.clients[0].clientId=tihom
tihom.security.oauth2.clients[0].clientSecret=tihomsecret
tihom.security.oauth2.clients[0].accessTokenValiditySeconds=3600
tihom.security.oauth2.clients[1].clientId=test
tihom.security.oauth2.clients[1].clientSecret=test
#tihom.security.oauth2.clients[1].accessTokenValiditySeconds=(默认为0) - 把securityProperties注入到我们的认证服务器里面去
- 配置令牌的存储:使用redis,令牌访问频繁,而且不需要去维护数据库表,性能比数据库好
- 定义一个TokenStoreConfig类,这个类的作用就是从连接工厂拿到redis的连接,然后连到redis服务器上,如果产生token,就会存到指定的redis中
- 使用JWT替换默认的Token
- JWT(Json Web Token)
- 1.自包含
原本的token形式依赖存储,如果存储挂掉了令牌就毫无用处了,因为token本身是没有信息的;而JWT则本身带有信息,拿到令牌后直接解析令牌包含的信息,而不用去存储里面读信息. - 2.密签
发出去的令牌可以使用指定的秘钥进行签名,签名不等于加密,只是防止别人去篡改信息,别人篡改我们可以知道,是一个开放的标准,对外界透明的,所以不要把敏感信息放在JWT中 - 3.可扩展
- 开发流程(代码中解释很详细)
- 在TokenStoreConfig中添加一个静态类JwtTokenConfig
- 将密钥写入OAuth2Properties中
- 在认证服务器中加入
@Autowired(required = false)
private JwtAccessTokenConverter jwtAccessTokenConverter;
并且在configure中做判断 - 将demo中的UserController中”/me”的传入参数改为(Authentication user)
- 在TokenStoreConfig的静态类JwtTokenConfig中添加
/**
<ul><li>token增强器
*/
@Bean
@ConditionalOnMissingBean(name = "jwtTokenEnhancer")
//在不同系统里面可能处理是不同的,这里只是提供默认的,系统可以通过自己加入一个叫jwtTokenEnhancer的bean覆盖掉这个默认的逻辑
public TokenEnhancer jwtTokenEnhancer(){
return new TiHomJwtTokenEnhancer();
}
- 写TokenEnhancer增强器的实现方法TiHomJwtTokenEnhancer
- 在认证服务器中加上
@Autowired(required = false)
private TokenEnhancer jwtTokenEnhancer;
同时在configure中的判断做处理 - (Authentication user)不知道你的自定义信息是什么的,如果要知道的话就需要自己写代码实现,先加依赖,在demo的pom中加
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
将(Authentication user)改为(Authentication user,HttpServletRequest request)
@GetMapping("/me")
public Object getCurrentUser(Authentication user/* Authentication authentication*/,HttpServletRequest request)
throws Exception {
//获取请求头里面Authentication的值
String header = request.getHeader("Authentication");
String token = StringUtils.substringAfter(header,"bearer ");
//JWT的解析器,把jwtToken转化成了claims对象
Claims claims = Jwts.parser().setSigningKey(securityProperties.getOauth2().getJwtSigningKey().getBytes("UTF-8"))
.parseClaimsJws(token).getBody();
String company = (String) claims.get("company");
//要用日志工具,不要用sout
System.out.println("-->"+company);
return user;
} - 令牌的刷新
- 令牌的时间在设置的失效时间后access_token就会失效了
- 令牌失效后当我们再去获取令牌的时候同时发一个refresh_token给它,refresh_token在用户无感知的情况下去刷新令牌,得到一个新的access_token
- refreshToken的失效时间在认证服务器中配置一下
今晚继续更新。。。