使用spring oauth2框架获取当前登录用户信息的实现代码
使用springoauth2框架做授权鉴定。想获取当前用户信息怎么办?
我们知道springoauth2是基于springsecurity的实现的。
springsecurity可以通过SecurityContextHolder.getContext().getAuthentication().getPrincipal()获取到当前用户信息。
而springoauth2通过SecurityContextHolder.getContext().getAuthentication().getPrincipal()却只能拿到当前用户的用户名。
然而实际开发过程中,我们较常用到的大部分都是用户的id。
那么怎么通过配置获取当前用户的信息呢?
首先我们看下,为什么oauth2通过SecurityContextHolder.getContext().getAuthentication().getPrincipal()获取到的是用户名?
我们看下源码
DefaultUserAuthenticationConverter.java
publicAuthenticationextractAuthentication(Mapmap){ //userClaimName是静态常量:username if(map.containsKey(userClaimName)){ Objectprincipal=map.get(userClaimName); Collectionauthorities=getAuthorities(map); //原因就是这里。如果userDetailsService为空,返回的就是用户名。 if(userDetailsService!=null){ UserDetailsuser=userDetailsService.loadUserByUsername((String)map.get(userClaimName)); authorities=user.getAuthorities(); principal=user; } returnnewUsernamePasswordAuthenticationToken(principal,"N/A",authorities); } returnnull; }
那我们就给这个类,设置userDetailsService。
我们看下这个类的调用。
DefaultAccessTokenConverter.java
publicclassDefaultAccessTokenConverterimplementsAccessTokenConverter{ //一开始就被初始化好了,所以不能设置userDetailsService privateUserAuthenticationConverteruserTokenConverter=newDefaultUserAuthenticationConverter(); //但是提供了setter接口,所以我们要做的就是覆盖上面的实例。 publicvoidsetUserTokenConverter(UserAuthenticationConverteruserTokenConverter){ this.userTokenConverter=userTokenConverter; } }
所以如果是使用DefaultAccessTokenConverter的,代码可以这么写
@Configuration @EnableAuthorizationServer publicclassAuthorizationServerConfigurationextendsAuthorizationServerConfigurerAdapter{ @Override publicvoidconfigure(AuthorizationServerEndpointsConfigurerendpoints)throwsException{ endpoints.tokenStore(tokenStore) .authenticationManager(manager) .allowedTokenEndpointRequestMethods(HttpMethod.GET,HttpMethod.POST) .userDetailsService(userService) //.accessTokenConverter(tokenConverter); DefaultAccessTokenConverterconverter=newDefaultAccessTokenConverter(); DefaultUserAuthenticationConverteruserAuthenticationConverter =newDefaultUserAuthenticationConverter(); userAuthenticationConverter.setUserDetailsService(userService); converter.setUserTokenConverter(userAuthenticationConverter); endpoints.accessTokenConverter(converter); } }
如果是用jwtConverter的话,可以这么改。
定义一个accessTokenConverter继承DefaultAccessTokenConverter
publicclassOauthAccessTokenConverterextendsDefaultAccessTokenConverter{ publicOauthAccessTokenConverter(SecurityUserServiceuserService){ DefaultUserAuthenticationConverterconverter=newDefaultUserAuthenticationConverter(); converter.setUserDetailsService(userService); super.setUserTokenConverter(converter); } }
定义一个jwtConverter继承JwtAccessTokenConver
publicclassOauthJwtAccessTokenConverterextendsJwtAccessTokenConverter{ publicOauthJwtAccessTokenConverter(SecurityUserServiceuserService){ super.setAccessTokenConverter(newOauthAccessTokenConverter(userService)); } }
注册bean
@Configuration publicclassTokenConfig{ @Bean publicTokenStorejwtTokenStore(JwtAccessTokenConverterconverter){ returnnewJwtTokenStore(converter); } @Bean publicJwtAccessTokenConverterjwtAccessTokenConverter(SecurityUserServiceuserService){ JwtAccessTokenConverteraccessTokenConverter=newOauthJwtAccessTokenConverter(userService); accessTokenConverter.setSigningKey("sign_key"); returnaccessTokenConverter; } }
Oauth2认证服务
@Configuration @EnableAuthorizationServer publicclassAuthorizationServerConfigurationextendsAuthorizationServerConfigurerAdapter{ @Autowired privateAuthenticationManagermanager; @Autowired privateSecurityUserServiceuserService; @Autowired privateTokenStoretokenStore; @Autowired privateJwtAccessTokenConvertertokenConverter; @Override publicvoidconfigure(AuthorizationServerEndpointsConfigurerendpoints)throwsException{ endpoints.tokenStore(tokenStore) .authenticationManager(manager) .allowedTokenEndpointRequestMethods(HttpMethod.GET,HttpMethod.POST) .userDetailsService(userService) .accessTokenConverter(tokenConverter); } }
最后就可以像springsecurity一样。
使用SecurityContextHolder.getContext().getAuthentication().getPrincipal()获取用户信息了。
到此这篇关于springoauth2获取当前登录用户信息的文章就介绍到这了,更多相关springoauth2登录用户信息内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!