Springsceurity使用TokenEnhancer和JwtAccessConverter增强jwt令牌源码解析

泄露秘密 提交于 2020-02-04 20:50:16

springsecurity登录以后,默认会返回一个令牌(access_token):
在这里插入图片描述
通过查看源码,DefaultTokenServices中的createAccessToken方法,令牌其实就是一个uuid:

在这里插入图片描述
实际使用中,一般不会使用默认令牌,而是使用jwt令牌来替代默认令牌,这样做的好处是携带默认令牌访问资源,每次都要通过授权服务来认证令牌是否有效,而jwt则可以做到资源服务中自己解析从而判断令牌的有效性;另外一个优势就是jwt令牌有更高的安全性,可以使用公钥和私钥进行加密和解密,不容易被破解。

jwt令牌配置,定义JwtAccessTokenConverter,配置TokenStore

`@Bean
public TokenStore tokenStore() {
// 使用内存存储令牌
// return new InMemoryTokenStore();
return new JwtTokenStore(accessTokenConverter());

}

@Bean
public JwtAccessTokenConverter accessTokenConverter() {
    JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
    //对称秘钥,资源服务器使用该秘钥来验证
    converter.setSigningKey(JwtConstant.SING_KEY);

// DefaultAccessTokenConverter accessTokenConverter = (DefaultAccessTokenConverter) converter.getAccessTokenConverter();
// accessTokenConverter.setUserTokenConverter(customUserAuthenticationConverter);
return converter;
}`在这里插入图片描述

AuthorizationServerTokenServices配置中添加令牌增强,令牌增强的意思是,用jwt令牌来加强默认令牌,而不是替代。

// 令牌(token)管理服务
    @Bean
    public AuthorizationServerTokenServices tokenService(){
        DefaultTokenServices services = new DefaultTokenServices();
        // 客户端详情服务
        // 因为是向客户端颁发令牌,所以需要知道是哪一个客户端
        services.setClientDetailsService(myClientDetailsService);
        // 支持刷新令牌
        services.setSupportRefreshToken(true);
        // 令牌存储策略
        services.setTokenStore(tokenStore);

        //令牌增强
        TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
        tokenEnhancerChain.setTokenEnhancers(Arrays.asList(accessTokenConverter));
        services.setTokenEnhancer(tokenEnhancerChain);

        // 令牌默认有效期24小时
        services.setAccessTokenValiditySeconds(7200 * 12);

        // 刷新令牌默认有效期3天
        services.setRefreshTokenValiditySeconds(259200);
        return  services;
    }

在这里插入图片描述
运行结果:
在这里插入图片描述
这里可以看到,多了一个jti,这个jti就是默认的令牌,也就是uuid。
查看源码:JwtAccessTokenConverter中的enhance方法,对现有的token进行了增强:
在这里插入图片描述
其中,encode的方法将当前信息转化成jwt token令牌,而默认的token会被key为jti保存。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!