使用spring oauth2框架獲取當(dāng)前登錄用戶信息的實現(xiàn)代碼
使用spring oauth2框架做授權(quán)鑒定。想獲取當(dāng)前用戶信息怎么辦?
我們知道spring oauth2是基于spring security的實現(xiàn)的。
spring security可以通過SecurityContextHolder.getContext().getAuthentication().getPrincipal()獲取到當(dāng)前用戶信息。
而spring oauth2通過SecurityContextHolder.getContext().getAuthentication().getPrincipal()卻只能拿到當(dāng)前用戶的用戶名。
然而實際開發(fā)過程中,我們較常用到的大部分都是用戶的id。
那么怎么通過配置獲取當(dāng)前用戶的信息呢?
首先我們看下,為什么oauth2通過SecurityContextHolder.getContext().getAuthentication().getPrincipal()獲取到的是用戶名?
我們看下源碼
DefaultUserAuthenticationConverter.java
public Authentication extractAuthentication(Map<String, ?> map) { // userClaimName是靜態(tài)常量:username if (map.containsKey(userClaimName)) { Object principal = map.get(userClaimName); Collection<? extends GrantedAuthority> authorities = getAuthorities(map); // 原因就是這里。如果userDetailsService為空,返回的就是用戶名。 if (userDetailsService != null) { UserDetails user = userDetailsService.loadUserByUsername((String) map.get(userClaimName)); authorities = user.getAuthorities(); principal = user; } return new UsernamePasswordAuthenticationToken(principal, 'N/A', authorities); } return null;}
那我們就給這個類,設(shè)置userDetailsService。
我們看下這個類的調(diào)用。
DefaultAccessTokenConverter.java
public class DefaultAccessTokenConverter implements AccessTokenConverter { // 一開始就被初始化好了,所以不能設(shè)置userDetailsService private UserAuthenticationConverter userTokenConverter = new DefaultUserAuthenticationConverter(); // 但是提供了setter接口,所以我們要做的就是覆蓋上面的實例。 public void setUserTokenConverter(UserAuthenticationConverter userTokenConverter) { this.userTokenConverter = userTokenConverter; } }
所以如果是使用DefaultAccessTokenConverter的,代碼可以這么寫
@Configuration@EnableAuthorizationServerpublic class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter { @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { endpoints.tokenStore(tokenStore).authenticationManager(manager).allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST).userDetailsService(userService)// .accessTokenConverter(tokenConverter); DefaultAccessTokenConverter converter = new DefaultAccessTokenConverter(); DefaultUserAuthenticationConverter userAuthenticationConverter= new DefaultUserAuthenticationConverter(); userAuthenticationConverter.setUserDetailsService(userService); converter.setUserTokenConverter(userAuthenticationConverter); endpoints.accessTokenConverter(converter); } }
如果是用jwtConverter的話,可以這么改。
定義一個accessTokenConverter繼承DefaultAccessTokenConverter
public class OauthAccessTokenConverter extends DefaultAccessTokenConverter { public OauthAccessTokenConverter(SecurityUserService userService) { DefaultUserAuthenticationConverter converter = new DefaultUserAuthenticationConverter(); converter.setUserDetailsService(userService); super.setUserTokenConverter(converter); }}
定義一個jwtConverter繼承JwtAccessTokenConver
public class OauthJwtAccessTokenConverter extends JwtAccessTokenConverter { public OauthJwtAccessTokenConverter(SecurityUserService userService) { super.setAccessTokenConverter(new OauthAccessTokenConverter(userService)); }}
注冊bean
@Configurationpublic class TokenConfig { @Bean public TokenStore jwtTokenStore(JwtAccessTokenConverter converter) { return new JwtTokenStore(converter); } @Bean public JwtAccessTokenConverter jwtAccessTokenConverter(SecurityUserService userService) { JwtAccessTokenConverter accessTokenConverter = new OauthJwtAccessTokenConverter(userService); accessTokenConverter.setSigningKey('sign_key'); return accessTokenConverter; }}
Oauth2認證服務(wù)
@Configuration@EnableAuthorizationServerpublic class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter { @Autowired private AuthenticationManager manager; @Autowired private SecurityUserService userService; @Autowired private TokenStore tokenStore; @Autowired private JwtAccessTokenConverter tokenConverter; @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { endpoints.tokenStore(tokenStore).authenticationManager(manager).allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST).userDetailsService(userService).accessTokenConverter(tokenConverter); }}
最后就可以像spring security一樣。
使用SecurityContextHolder.getContext().getAuthentication().getPrincipal()獲取用戶信息了。
到此這篇關(guān)于spring oauth2獲取當(dāng)前登錄用戶信息的文章就介紹到這了,更多相關(guān)spring oauth2登錄用戶信息內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. 小技巧處理div內(nèi)容溢出2. UDDI FAQs3. jsp實現(xiàn)登錄界面4. 解析原生JS getComputedStyle5. .NET SkiaSharp 生成二維碼驗證碼及指定區(qū)域截取方法實現(xiàn)6. PHP循環(huán)與分支知識點梳理7. 怎樣才能用js生成xmldom對象,并且在firefox中也實現(xiàn)xml數(shù)據(jù)島?8. PHP字符串前后字符或空格刪除方法介紹9. ASP刪除img標(biāo)簽的style屬性只保留src的正則函數(shù)10. jsp+servlet實現(xiàn)猜數(shù)字游戲
