/*** 使用redis存儲token的配置* Created by macro on 2019/10/8.*/@ConfigurationpublicclassRedisTokenStoreConfig{@Autowiredprivate RedisConnectionFactory redisConnectionFactory;@Beanpublic TokenStore redisTokenStore (){returnnewRedisTokenStore(redisConnectionFactory);}}
在認證服務器配置中指定令牌的存儲策略為Redis:
/*** 認證服務器配置* Created by macro on 2019/9/30.*/@Configuration@EnableAuthorizationServerpublicclassAuthorizationServerConfigextendsAuthorizationServerConfigurerAdapter{@Autowiredprivate PasswordEncoder passwordEncoder;@Autowiredprivate AuthenticationManager authenticationManager;@Autowiredprivate UserService userService;@Autowired@Qualifier("redisTokenStore")private TokenStore tokenStore;/*** 使用密碼模式需要配置*/@Overridepublicvoidconfigure(AuthorizationServerEndpointsConfigurer endpoints){endpoints.authenticationManager(authenticationManager).userDetailsService(userService).tokenStore(tokenStore);//配置令牌存儲策略}//省略代碼...}
/*** 使用Jwt存儲token的配置* Created by macro on 2019/10/8.*/@ConfigurationpublicclassJwtTokenStoreConfig{@Beanpublic TokenStore jwtTokenStore(){returnnewJwtTokenStore(jwtAccessTokenConverter());}@Beanpublic JwtAccessTokenConverter jwtAccessTokenConverter(){JwtAccessTokenConverter accessTokenConverter =newJwtAccessTokenConverter();accessTokenConverter.setSigningKey("test_key");//配置JWT使用的秘鑰return accessTokenConverter;}}
在認證服務器配置中指定令牌的存儲策略為JWT:
/*** 認證服務器配置* Created by macro on 2019/9/30.*/@Configuration@EnableAuthorizationServerpublicclassAuthorizationServerConfigextendsAuthorizationServerConfigurerAdapter{@Autowiredprivate PasswordEncoder passwordEncoder;@Autowiredprivate AuthenticationManager authenticationManager;@Autowiredprivate UserService userService;@Autowired@Qualifier("jwtTokenStore")private TokenStore tokenStore;@Autowiredprivate JwtAccessTokenConverter jwtAccessTokenConverter;@Autowiredprivate JwtTokenEnhancer jwtTokenEnhancer;/*** 使用密碼模式需要配置*/@Overridepublicvoidconfigure(AuthorizationServerEndpointsConfigurer endpoints){endpoints.authenticationManager(authenticationManager).userDetailsService(userService).tokenStore(tokenStore)//配置令牌存儲策略.accessTokenConverter(jwtAccessTokenConverter);}//省略代碼...}
有時候我們需要擴展JWT中存儲的內容,這里我們在JWT中擴展一個key為enhance,value為 enhance info 的數據。
繼承TokenEnhancer實現一個JWT內容增強器:
/*** Jwt內容增強器* Created by macro on 2019/10/8.*/publicclassJwtTokenEnhancerimplementsTokenEnhancer{@Overridepublic OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication){Map<String, Object> info =newHashMap<>();info.put("enhance","enhance info");((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(info);return accessToken;}}
創建一個JwtTokenEnhancer實例:
/*** 使用Jwt存儲token的配置* Created by macro on 2019/10/8.*/@ConfigurationpublicclassJwtTokenStoreConfig{//省略代碼...@Beanpublic JwtTokenEnhancer jwtTokenEnhancer(){returnnewJwtTokenEnhancer();}}
在認證服務器配置中配置JWT的內容增強器:
/*** 認證服務器配置* Created by macro on 2019/9/30.*/@Configuration@EnableAuthorizationServerpublicclassAuthorizationServerConfigextendsAuthorizationServerConfigurerAdapter{@Autowiredprivate PasswordEncoder passwordEncoder;@Autowiredprivate AuthenticationManager authenticationManager;@Autowiredprivate UserService userService;@Autowired@Qualifier("jwtTokenStore")private TokenStore tokenStore;@Autowiredprivate JwtAccessTokenConverter jwtAccessTokenConverter;@Autowiredprivate JwtTokenEnhancer jwtTokenEnhancer;/*** 使用密碼模式需要配置*/@Overridepublicvoidconfigure(AuthorizationServerEndpointsConfigurer endpoints){TokenEnhancerChain enhancerChain =newTokenEnhancerChain();List<TokenEnhancer> delegates =newArrayList<>();delegates.add(jwtTokenEnhancer);//配置JWT的內容增強器delegates.add(jwtAccessTokenConverter);enhancerChain.setTokenEnhancers(delegates);endpoints.authenticationManager(authenticationManager).userDetailsService(userService).tokenStore(tokenStore)//配置令牌存儲策略.accessTokenConverter(jwtAccessTokenConverter).tokenEnhancer(enhancerChain);}//省略代碼...}
/*** 認證服務器配置* Created by macro on 2019/9/30.*/@Configuration@EnableAuthorizationServerpublicclassAuthorizationServerConfigextendsAuthorizationServerConfigurerAdapter{@Overridepublicvoidconfigure(ClientDetailsServiceConfigurer clients)throws Exception {clients.inMemory().withClient("admin").secret(passwordEncoder.encode("admin123456")).accessTokenValiditySeconds(3600).refreshTokenValiditySeconds(864000).redirectUris("http://www.baidu.com").autoApprove(true)//自動授權配置.scopes("all").authorizedGrantTypes("authorization_code","password","refresh_token");//添加授權模式}}