午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

使用spring oauth2框架獲取當(dāng)前登錄用戶信息的實(shí)現(xiàn)代碼

瀏覽:137日期:2023-08-26 14:45:17

使用spring oauth2框架做授權(quán)鑒定。想獲取當(dāng)前用戶信息怎么辦?

我們知道spring oauth2是基于spring security的實(shí)現(xiàn)的。

spring security可以通過SecurityContextHolder.getContext().getAuthentication().getPrincipal()獲取到當(dāng)前用戶信息。

而spring oauth2通過SecurityContextHolder.getContext().getAuthentication().getPrincipal()卻只能拿到當(dāng)前用戶的用戶名。

然而實(shí)際開發(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;}

那我們就給這個(gè)類,設(shè)置userDetailsService。

我們看下這個(gè)類的調(diào)用。

DefaultAccessTokenConverter.java

public class DefaultAccessTokenConverter implements AccessTokenConverter { // 一開始就被初始化好了,所以不能設(shè)置userDetailsService private UserAuthenticationConverter userTokenConverter = new DefaultUserAuthenticationConverter(); // 但是提供了setter接口,所以我們要做的就是覆蓋上面的實(shí)例。 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的話,可以這么改。

定義一個(gè)accessTokenConverter繼承DefaultAccessTokenConverter

public class OauthAccessTokenConverter extends DefaultAccessTokenConverter { public OauthAccessTokenConverter(SecurityUserService userService) { DefaultUserAuthenticationConverter converter = new DefaultUserAuthenticationConverter(); converter.setUserDetailsService(userService); super.setUserTokenConverter(converter); }}

定義一個(gè)jwtConverter繼承JwtAccessTokenConver

public class OauthJwtAccessTokenConverter extends JwtAccessTokenConverter { public OauthJwtAccessTokenConverter(SecurityUserService userService) { super.setAccessTokenConverter(new OauthAccessTokenConverter(userService)); }}

注冊(cè)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認(rèn)證服務(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)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 一级特黄a大片免费 | 亚洲毛片在线观看 | 亚洲精品国产精品乱码不卡√香蕉 | 亚洲精品网址 | 日韩成人久久 | 免费成年人视频在线观看 | av高清免费| 国产亚洲精品久久久久动 | 香蕉视频破解 | 亚洲一区二区在线播放 | jizz在线看| 日本白浆 | 亚洲欧美另类日韩 | 亚洲天堂男人天堂 | 亚洲色图35p | 国内精品一区二区 | 尹人av | 91一区二区在线观看 | 天天摸日日 | 一级片网址 | 国产午夜精品视频 | 99国产一区 | 丰满少妇一级 | 午夜69| 激情婷婷综合 | 免费av免费看 | 天天爽视频 | xxxx国产| 日韩欧美一区二区三区四区 | a在线观看免费 | 国产二区视频 | 亚洲综合专区 | 日韩欧美国产中文字幕 | 欧美一级片免费 | 日韩高清精品免费观看 | 日本www视频在线观看 | 超碰在线免费97 | 日本动漫大尺度 | 国产精品久久久国产盗摄 | 亚洲国产精 | 全部免费毛片在线播放 |