使用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
@EnableAuthorizationServer
public 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
@Configuration
public 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
@EnableAuthorizationServer
public 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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- spring cloud oauth2 實現(xiàn)用戶認(rèn)證登錄的示例代碼
- Spring Cloud OAuth2 實現(xiàn)用戶認(rèn)證及單點(diǎn)登錄的示例代碼
- Spring Cloud下OAUTH2注銷的實現(xiàn)示例
- Spring Cloud下基于OAUTH2認(rèn)證授權(quán)的實現(xiàn)示例
- Spring Security OAuth過期的解決方法
- Spring Security整合Oauth2實現(xiàn)流程詳解
- Spring Security OAuth2 授權(quán)碼模式的實現(xiàn)
- Spring cloud oauth2如何搭建認(rèn)證資源中心
相關(guān)文章
Java學(xué)習(xí)常用包(類)之java.util包詳解
這篇文章主要介紹了Java學(xué)習(xí)常用包(類)之java.util包的相關(guān)資料,Java.util包是Java標(biāo)準(zhǔn)類庫的重要組成部分,包含集合框架、日期時間類、事件模型、隨機(jī)數(shù)生成器等實用工具類,集合框架提供了多種數(shù)據(jù)結(jié)構(gòu)和算法,需要的朋友可以參考下2024-10-10
WebSocket+Vue+SpringBoot實現(xiàn)語音通話的使用示例
本文主要介紹了WebSocket+Vue+SpringBoot實現(xiàn)語音通話的使用示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11
SpringBoot詳細(xì)講解異步任務(wù)如何獲取HttpServletRequest
在使用框架日常開發(fā)中需要在controller中進(jìn)行一些異步操作減少請求時間,但是發(fā)現(xiàn)在使用@Anysc注解后會出現(xiàn)Request對象無法獲取的情況,本文就此情況給出完整的解決方案2022-04-04
springboot集成flyway自動創(chuàng)表的詳細(xì)配置
Flayway是一款數(shù)據(jù)庫版本控制管理工具,支持?jǐn)?shù)據(jù)庫版本自動升級,Migrations可以寫成sql腳本,也可以寫在java代碼里;本文通過實例代碼給大家介紹springboot集成flyway自動創(chuàng)表的詳細(xì)過程,感興趣的朋友一起看看吧2021-06-06

