SpringSecurity +oauth2获取当前登录用户(二)
创始人
2025-05-30 01:32:06

特别注意:以下内容如果访问失败或有其他疑问,可先学习:

SpringSecurity +oauth2+JWT实现统一授权和认证及项目搭建(一)

1 获取当前用户的信息代码为:

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

但是,通过运行会发现principal的值只是用户名,没有用户信息,通过去看源码,才发现问题所在,以下是源码:

源码类:DefaultUserAuthenticationConverter.java

通过源码分析,发现这里的map只存储用户名,对此,如果要获取用户,我这里提供的方案是重写该方法,步骤如下:

新建UserAuthenticationConverter.java配置类,继承DefaultUserAuthenticationConverter.java,代码如下:

package com.yty.system.oauth.config.jwt;import com.yty.system.oauth.entity.SysUser;
import com.yty.system.oauth.entity.vo.SecurityUser;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.oauth2.provider.token.DefaultUserAuthenticationConverter;
import org.springframework.util.StringUtils;import java.util.Collection;
import java.util.HashMap;
import java.util.Map;@Configuration
public class UserAuthenticationConverter extends DefaultUserAuthenticationConverter {private Collection defaultAuthorities;public void setDefaultAuthorities(String[] defaultAuthorities) {this.defaultAuthorities = AuthorityUtils.commaSeparatedStringToAuthorityList(StringUtils.arrayToCommaDelimitedString(defaultAuthorities));}private static final String USER_INFO = "userInfo";/*** 设置存入认证信息中的Map** @param authentication* @return*/@Overridepublic Map convertUserAuthentication(Authentication authentication) {// 入参authentication中保存了完整的用户信息(都已经有完整信息了还查个P)。Map map = new HashMap<>(1);// 获取用户信息并保存。Object o = authentication.getPrincipal();SecurityUser userInfo = (SecurityUser) o;SysUser sysUser = userInfo.getSysUser();map.put(USER_INFO, sysUser);// 保存了账户的权限信息,可以通过Authentication..getAuthorities()方法获取。if (authentication.getAuthorities() != null && !authentication.getAuthorities().isEmpty()) {map.put(AUTHORITIES, AuthorityUtils.authorityListToSet(authentication.getAuthorities()));}return map;}/*** 选择存入认证信息中的数据** @param map* @return*/@Overridepublic Authentication extractAuthentication(Map map) {Authentication authentication = null;if (map.containsKey(USER_INFO)) {// 将用户对象作为用户信息。Object principal = map.get(USER_INFO);Collection authorities = this.getAuthorities(map);authentication = new UsernamePasswordAuthenticationToken(principal, "N/A", authorities);}return authentication;}private Collection getAuthorities(Map map) {if (!map.containsKey(AUTHORITIES)) {return this.defaultAuthorities;} else {Object authorities = map.get(AUTHORITIES);if (authorities instanceof String) {return AuthorityUtils.commaSeparatedStringToAuthorityList((String)authorities);} else if (authorities instanceof Collection) {return AuthorityUtils.commaSeparatedStringToAuthorityList(StringUtils.collectionToCommaDelimitedString((Collection)authorities));} else {throw new IllegalArgumentException("Authorities must be either a String or a Collection");}}}
}

修改JwtTokenStoreConfig.java类,将以上配置类引用到方法jwtAccessTokenConverter中,具体实现如下:

@Beanpublic JwtAccessTokenConverter jwtAccessTokenConverter() {JwtAccessTokenConverter accessTokenConverter = new JwtAccessTokenConverter();DefaultAccessTokenConverter defaultAccessTokenConverter = new DefaultAccessTokenConverter();defaultAccessTokenConverter.setUserTokenConverter(new UserAuthenticationConverter());// 赋予新的Token转换器。accessTokenConverter.setAccessTokenConverter(defaultAccessTokenConverter);//配置JWT使用的秘钥accessTokenConverter.setSigningKey(secret);return accessTokenConverter;}

在UserDetailService编写静态方法getCurrentUser获取用户信息,代码如下:

/*** 获取当前用户信息*/public static SysUser getCurrentUser() {Authentication authentication = SecurityContextHolder.getContext().getAuthentication();if (Objects.isNull(authentication)) {throw new RuntimeException("请登录");}Object principal = authentication.getPrincipal();if (Objects.isNull(principal)) {throw new RuntimeException("请登录");}ObjectMapper objectMapper = new ObjectMapper();SysUser sysUser = objectMapper.convertValue(principal, SysUser.class);return sysUser;}

在UserController.java类中编写测试入口方法getCurrentUser,代码如下:


@RestController
@RequestMapping("/user")
public class UserController {@GetMapping("/getCurrentUser")public Object getCurrentUser() {SysUser currentUser = UserDetailService.getCurrentUser();return currentUser;}
}

postman访问:

1 先获取token

2 调用接口http://localhost:8500/oauth_api/user/getCurrentUser,注意参数,需要在请求头中添加参数Authorization,内容为:oken_type+空格+access_token,如图所示:

注意,如果访问不通过,需要在资源配置类中将用户访问接口添加到资源配置ResourceServiceConfig.java中,如无该类,自己新建一个,代码如下所示:

package com.yty.system.oauth.config.jwt;import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;@Configuration
@EnableResourceServer
public class ResourceServiceConfig extends ResourceServerConfigurerAdapter {@Overridepublic void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated()// 受保护的资源.and().requestMatchers().antMatchers("/user/**");}
}

相关内容

热门资讯

游戏“第一省”,坐不住了! 游... 文/冯玲玲游戏大省广东坐不住了。近日,广东发布《关于推动广东网络游戏产业高质量发展的若干政策措施》(...
并购重组预期加持!宜宾纸业股价... 本报(chinatimes.net.cn)记者何一华 李未来 北京报道宜宾纸业(600793.SH)...
德邦证券董事会大洗牌:梁雷任董... 新京报贝壳财经讯(记者胡萌)5月30日,德邦证券公示新一届董事会、监事会人员,公司新一任董事长由山东...
原创 成... 今年以来,成都的舞厅经历了比较长时间的整顿,多数舞厅在5月8日获准重新开门营业,到现在已经稳定运行了...
“小雨伞”母公司手回集团港股上... 5月30日,手回集团(2621.HK)在港交所上市。根据手回集团此前披露,此次IPO,手回集团发行2...
决策曲线拆解分析兼随机森林DC... 临床决策曲线(DCA)解析兼绘制随机森林的DCA曲线(R&...
异动快报:海格通信(00246... 证券之星5月30日盘中消息,13点45分海格通信(002465)触及涨停板。目前价格13.89,上涨...
商丘,三线城市!排名第29位! 第一财经·新一线城市研究所5月28日发布《2025新一线城市魅力排行榜》,在中国内地337座地级及以...
传统药企转型面临两难选择?放弃... 近日誉衡药业(002437.SZ)公告称,公司于2025年5月23日与兴和制药有限公司就佩玛贝特片签...
版权代理吃相太难看,连作者都觉... 一家可能都没授权资格的公司,居然也敢向自媒体发律师函讨要版权费。这事儿听起来是不是有点离谱了?最近,...
V观财报|*ST京蓝因涉嫌信披...   中新经纬5月30日电 30日晚,*ST京蓝公告,收到立案告知书。  公告显示,因涉嫌信息披露违法...
Java基础--日期API学习 一、前言         java标准库中,最早提供了两种处理日期和时间的类ÿ...
ES调试与优化工作笔记 本文主要涉及关于elastcisearch 关于内存,mapping,查...
两券商IT人员曝出老鼠仓,一位... 财联社5月30日讯(记者 高艳云)5月30日,安徽证监局与吉林证监局同日披露罚单,两名券商资深IT人...
Labubu太火了!英国人为抢... 最近在英国,有一样毛绒玩具红到了“出圈”,甚至让人忍不住怀疑:这到底是抢玩具,还是在打仗?这里,说的...
MySQL-分库分表方案 一、业务背景 随着业务量的增长,数据量会随之增长,单机情况下DB服务器会...
堆、堆排序 堆的基本操作操作:         1、插入一个数:          ...
广东1130亿饮料富豪,第二个... 来源 | 深蓝财经撰文 | 杨波近日,东鹏饮料赴港上市的消息持续引发关注。一个市值超1600亿,手握...
赵小中连任,长沙银行还有道“考... 文丨徐风5月21日,长沙银行在召开股东大会的同时完成了董事会的换届选举,赵小中当选第八届董事长,实现...
嘉应制药遭证监会立案调查,直指... 5月28日晚间,老牌药企广东嘉应制药股份有限公司(002198.SZ,下称“嘉应制药”)发布公告,公...
腾讯三大工具:ARC+智影+E... ARC实验室(网站) ARC官网-腾讯 (tencent.com)  ...
个人小站折腾后记 个人小站折腾后记 🏠个人主页:shark-Gao 🧑个...
华夏银行聘任龚伟华为首席信息官... 作者 | 林秋彤编辑 | 杨希新媒体编辑丨实习生 宋语菡5月30日,华夏银行发布公告称,吴永飞因到龄...
ST百利:收到湖南证监局《行政... 5月30日晚间,湖南百利工程科技股份有限公司(ST百利,603959.SH)公告,5月29日,公司收...
天元宠物重大资产重组,最大受益... “宠物代工龙头”天元宠物披露了收购案的最新进展。5月29日晚间,杭州天元宠物用品股份有限公司(下称“...
上手Servlet程序 目录 1、手动打包 1.1、创建项目 1.2、引入依赖 1.3、创建目录 1.4、编写代码 1.5、...
第一次认真周赛总结 T1:一个 整数的 二进制形式中 奇数位上bit==1 和 偶数 位上bit=...
1年进账270亿,深圳中药龙头... 最近,华润三九陷入了“悲喜交加”之中。喜的是,2024年华润三九的营收、净利润皆创新高,营收为276...
论文阅读:MPViT : Mu... 中文标题:基于多路视觉Transformer的密集预测 提出问题 创新点 提出了一种...
前安克创新创始人创业公司冲刺I... 近期,深圳智岩科技股份有限公司(以下简称“智岩科技”)正式启动上市辅导,辅导机构为中金公司。智岩科技...