跟着JHipster学做项目 (16) Spring Boot在JWT添加userId

扩展篇:再探Spring Security过滤器链之SecurityContext 扩展篇:再探Spring Security过滤器链 在 概述(一):SpringSecurity的前世今生 中我们曾提过Spring Security底层是通过一组过滤器链来实现的,当时简单的介绍了几个比较重要的过滤器;并且在后面的几篇认证文章中都有比较详细的讲解。 但前几篇的系列文章更多的是关注 认证本身,对一些细枝末节没有额外的展开;而本篇文章的目的是再探 Spring Security 的过滤器链,完整的剖析全链路。 经过 认证(一):基于表单登录的认证模式 的介绍,我们对认证的流程有了一个比较全面的 阅读详情

Spring boot默认User没有包含userId信息,在通过SecurityUtils获取userId会很不方便,下面介绍一个简便的方式可以在获取当前用户信息时,能够包含userId。

JHipster是通过一个实现UserDetailService的接口DomainUserDetailsService类,来对登录信息进行认证。

但是在类UserJWTController中,认证的方法如下:

Authentication authentication = authenticationManagerBuilder.getObject()
.authenticate(authenticationToken);
SecurityContextHolder.getContext().setAuthentication(authentication);

在获取Authentication的同时,把它放入SecurityContextHolder的上下文。也就是说,我们需要在authentication中包含userId信息,那么这里的authenticate方法是如何关联DomainUserDetailsService中的loadUserByUsername方法呢?

JHipster并没有做任何处理,只是利用了spring boot的默认配置,我们来看一下security部分的autoconfiguration。

在org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration类中,initializeUserDetailsBeanManagerConfigurer方法创建了一个InitializeUserDetailsBeanManagerConfigurer类,该类的configure(AuthenticationManagerBuilder auth)方法将UserDetailsService赋给了DaoAuthenticationProvider。

	class InitializeUserDetailsManagerConfigurer
			extends GlobalAuthenticationConfigurerAdapter {
		@Override
		public void configure(AuthenticationManagerBuilder auth) throws Exception {
			if (auth.isConfigured()) {
				return;
			}
			UserDetailsService userDetailsService = getBeanOrNull(
					UserDetailsService.class);
			if (userDetailsService == null) {
				return;
			}

			PasswordEncoder passwordEncoder = getBeanOrNull(PasswordEncoder.class);
			UserDetailsPasswordService passwordManager = getBeanOrNull(UserDetailsPasswordService.class);

			DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
			provider.setUserDetailsService(userDetailsService);
			if (passwordEncoder != null) {
				provider.setPasswordEncoder(passwordEncoder);
			}
			if (passwordManager != null) {
				provider.setUserDetailsPasswordService(passwordManager);
			}
			provider.afterPropertiesSet();

			auth.authenticationProvider(provider);
		}

这里我们只要记住DaoAuthenticationProvider包含了userDetailsService。

下面再找到authenticationManager和DaoAuthenticationProvider的关系:Provider可以看成等同于Manager类,它多了一个是否支持authentication的support方法,这样authenticationManager的authenticate方法和loadUserByUsername方法就关联到一起。

为了使authentication类中包含userId信息,

第一步,扩展org.springframework.security.core.userdetails.User类

public class AuthenticatedUser extends User {

	private String userId = "";
	public AuthenticatedUser(String userId, String username,
         String password, Collection<? extends GrantedAuthority> authorities) {
		super(username, password, authorities);
		this.userId = userId;
	}
    public String getUserId() {
        return this.userId;
    }
}

第二步,改变loadUserByUsername返回AuthenticatedUser类

	private AuthenticatedUser createSpringSecurityUser(ApplicationUser user) {

		List<GrantedAuthority> grantedAuthorities = 
            getAuthorities(user.toApplicationUserDto());

		return new AuthenticatedUser(user.getId(),
             user.getUserName(),user.getPassword(), grantedAuthorities);
	}

第三步,在TokenProvider中改变createToken和getAuthentication两个方法,添加userId信息

    public String createToken(Authentication authentication, boolean rememberMe) {
        String authorities = authentication.getAuthorities().stream()
            .map(GrantedAuthority::getAuthority)
            .collect(Collectors.joining(","));
        long now = (new Date()).getTime();
        Date validity;
        if (rememberMe) {
            validity = new Date(now + this.tokenValidityInMillisecondsForRememberMe);
        } else {
            validity = new Date(now + this.tokenValidityInMilliseconds);
        }
        return Jwts.builder()
            .setSubject(authentication.getName())
            .claim(AUTHORITIES_KEY, authorities)
            .claim("userId", ((AuthenticatedUser)authentication.getPrincipal()).getUserId())
            .signWith(key, SignatureAlgorithm.HS512)
            .setExpiration(validity)
            .compact();
    }

    public Authentication getAuthentication(String token) {
        Claims claims = Jwts.parserBuilder().setSigningKey(key)
                .build()
                .parseClaimsJws(token)
            .getBody();
        Collection<? extends GrantedAuthority> authorities =
            Arrays.stream(claims.get(AUTHORITIES_KEY).toString().split(","))
                .map(SimpleGrantedAuthority::new)
                .collect(Collectors.toList());
        AuthenticatedUser principal = new AuthenticatedUser(claims.get("userId").toString(), claims.getSubject(), "", authorities);

        return new UsernamePasswordAuthenticationToken(principal, token, authorities);
    }

本文介绍是基于跟着JHipster学做项目 (6) 安全访问控制(上)JWT的Spring Boot应用

Good Luck,

Cheers!

05-基于JWT实现用户登录、根据token获取userId 验证过程:服务端验证 浏览器携带的用户名和密码,验证通过后生成用户凭证保存在服务端(session),浏览器再次访问时,服务端查询session,实现登录状态保持。缺点:随着用户的增多,服务端压力增大;若浏览器cookie被攻击者拦截,容易受到跨站请求伪造攻击;分布式系统下扩展性不强。 阅读详情

相关推荐

UE4入门实例17(Unreal制作卡通Post Process材质球)

效果展示 #1 创建Post Porcess材质球 #2 编写Shader功能 #3 设置场景区域内风格化渲染 #1 创建Post Porcess材质球 #2 编写Shader功能 创建基础效果 移除现有通道渲染 设置视图渲染范围 #3 设置场景区域内风格化渲染 #4 加群下载Shader源码:284105567 ...

Unity3d 攻城师一枚 1345

安全登录流程实战及流程分析

用户打开登录界面,输入用户名及密码后,点击登录 下面直接贴出登录校验代码,然后再进行分析 @Log("用户登录") @ApiOperation("登录授权") @AnonymousAccess @PostMapping(value = "/login") public ResponseEntity<Object> login(@Validated @RequestBody AuthUser authUser, HttpServletRequest reques...

liuerchong的博客 1509

intel-VROC raid卡驱动 centos7.9

u盘进入系统,按e,在出现下面在quiet前面输入inst.dd initcall_blacklist=vmd_drv_init 后按Ctrl和x,开始引导。进入系统,按e,在出现下面在quiet前面输入inst.dd inicll_blacklist=vmd_drv_init 后按Ctrl和x,开始引导。驱动完成后,在输入 c 回车, 引导过程开始,进入安装界面。输入1 ,选择这个ISO驱动文件里的rpm包。输入1 ,选择这个ISO驱动文件里的rpm包。vi编辑 /etc/default/grub。

dacming的博客 4540

Security认证流程

Security认证流程

hao843788037的博客 1211

最新2026年《网络数据安全风险评估办法》条款解读

大型企业集团IT变革下的零信任安全体系建设方案(55页).pptx。以数据安全为核心的安全立体防御体系解决方案(41页).pptx。让数据安全合规地创造价值(15页 PPT).pptx。大型集团数据安全应急预案(57页).docx。数据安全治理与评估服务业务介绍.pptx。数据安全管理实践(17页).pptx。大数据安全架构设计方案.pptx。大数据安全规划总体方案.pptx。数据库安全综合治理方案.pptx。医疗数据安全建设方案.pptx。数据安全框架规划图.pptx。数据安全治理方案.pptx。

cdfunlove的博客 46

OpenClaw Windows 安装指南

好的,我来一步一步带你在 Windows 上安装 OpenClaw。

m0_60605453的博客 548

【Spring Security】—— AuthenticationManagerBuilder

官网地址 Spring Security Reference 版本:Version 5.5.0 AuthenticationManagerBuilder 的继承关系图 在前面了解过 WebSecurity、HttpSecurity、AuthenticationManagerBuilder 这三个重要构建者公共的部分: |- SecurityBuilder |- AbstractSecurityBuilder |- AbstractConfiguredSecurityBuilder 公共的这部

qq_33471737的博客 4158

华为OD机试 - 学校的位置 - 数学问题(Python/JS/C/C++ 2024 B卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题。

学Java,找哪吒 455

SpringSecurity登录授权过程代码分析

SpringSecurity登录授权过程代码分析 一、利用 用户名、密码 设置 验证token 1. 设置 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(authUser.getUs

huang_hai_an的博客 463

【Mini KITTI】KITTI数据集简介 — Mini KITTI

为了快速进行算法调试、训练、评估和验证,以及快速下载,制作了一个mini kitti数据集,数据集的文件目录结构与完整KITTI数据集保持一致。其中,小型的KITTI数据集,即 mini kitti保存了20个训练样本和5个测试样本。下载地址为:。 关于KITTI各个部分的介绍请分别参考以下内容: ...

叶子的博客 7534

CS之攻击菜单详解-后门生成与上线

能够生成如HTA文档、office宏、payload生成器、exe程序。 windows可执行程序exe 可以看到能生成两种windows可执行程序,其分别代表stage分阶段和unstage(stageless)不分阶段。传送门 ——>Cobalt Strike中payload的stage与unstage区别 选择监听器后,按需生成不同类型的exe 然后在目标机器运行即可上线 payload生成器 选择生成如下类型的后门 ——>https://che...

渗透之路,攻防之间皆学问 6805

Spring Security学习使用

使用步骤: 1. 编写配置类SecurityConfig 配置使用什么方式登录,配置哪些接口可以放行,哪些接口需要验证权限 2. 编写用户信息类-XXX类,继承UserDetails,作为SpringSecurity 认证框架的主体类,贯穿整个安全框架的主体类 3. 编写用户详情服务类-XXX类,实现UserDetailsService接口,实现loadUserByUsername,SpringSecurity框架会自动调用该方法,获取认证主体类 4.编写登录接口Api 登录接口...

sn5diphone6的博客 441

ABAP CDS 实体权限控制,从 DCL 到 PFCG 的完整运行逻辑

本文探讨了SAP S/4HANA开发中CDS View的权限控制机制。核心观点如下: CDS access control通过DCL语言实现数据实例级权限控制,而非替代传统PFCG权限体系,二者形成互补关系:PFCG控制功能入口权限,DCL控制数据可见性。 DDL定义数据结构,DCL定义访问规则。DCL通过角色映射将数据字段与PFCG授权对象关联,运行时自动将权限条件注入SQL查询,实现数据过滤。 访问控制行为特点: 无DCL role不会默认拒绝访问 权限检查通过减少结果集而非抛出错误实现 需配合@Acc

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 100

Springboot 使用jwt验证常见异常

Springboot jwt验证常见异常

weixin_53658826的博客 7184

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

spring security密码校验过程整理(JWT) + 模拟登陆

前言 最近在整合security和jwt作为基础项目jar包,学无止境头发日渐稀疏 流程介绍 1.前端登录页面:输入用户名和密码 post 登录,其中密码用rsa 公钥加密 2.后端登录接口: rsa私钥解密,获取密码明文 实例化 UsernamePasswordAuthenticationToken 对象用于密码校验 -调用 AbstractUserDetailsAuthenticati...

GuDuPanNiZhe的博客 1648

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

14-SpringSecurity:前后端分离项目中用户名与密码通过RSA加密传输

1.12/**RSA公钥加密@param str 待加密字符串@param publicKey 公钥@return 密文*/try {//base64编码的公钥//RSA加密/**RSA私钥解密@param str 已加密字符串@param privateKey 私钥@return 明文*/try {//64位解码加密后的字符串//base64编码的私钥//RSA解密。

2301_82242204的博客 986

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

使用UsernamePasswordAuthenticationToken

方法一和方法二唯一区别就是AuthenticationManagerBuilder和AuthenticationManager。

weixin_44919041的博客 2131

9-SpringSecurity:登录时的图片验证码,小白看完都会了

分布式技术专题+面试解析+相关的手写和学习的笔记pdf还有更多Java笔记分享如下:程,基本涵盖了95%以上Java开发知识点,真正体系化!**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)[外链图片转存中…(img-B54g3xjL-1712066022808)]分布式技术专题+面试解析+相关的手写和学习的笔记pdf。

2401_83977554的博客 1246

SpringBoot2后端项目-用户登录-上

本次使用的是 Springsecurity 做安全认证框架 1、引入依赖 <jwt.version>0.9.0</jwt.version> <!-- spring security 安全认证 --> <dependency> <gr...

踏 浪的博客 2032

springsecurity前后端分离登录认证_Spring Security 真正的前后分离实现

Spring Security网络上很多前后端分离的示例很多都不是完全的前后分离,而且大家实现的方式各不相同,有的是靠自己写拦截器去自己校验权限的,有的页面是使用themleaf来实现的不是真正的前后分离,看的越多对Spring Security越来越疑惑,此篇文章要用最简单的示例实现出真正的前后端完全分离的权限校验实现。1. pom.xml主要依赖是spring-boot-starter-sec...

weixin_39619478的博客 728

Spring Security 真正的前后分离实现

点击上方“猿芯”,选择“设为星标”后台回复"1024",有份惊喜送给面试的你原文 https://www.toutiao.com/article/6894532348956803597Spring Security网络上很多前后端分离的示例很多都不是完全的前后分离,而且大家实现的方式各不相同,有的是靠自己写拦截器去自己校验权限的,有的页面是使用themleaf来实现的不是...

487

使用JWT保存权限以及使用Spring Security控制访问权限

使用JWT保存权限以及使用Spring Security控制访问权限

Alliestrasza的博客 1567

SpringBoot 配置token

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 工具 package com.appmanager.utils; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Date; import java.util.HashMap; /** * @program: Jinfang_appmanage

m0_46872814的博客 808

利用SpringSecurity和JWT实现mymes认证和授权

SpringBoot整合SpringSecurity和JWT实现mymes认证和授权(一) 本文主要讲解mymes相同通过SpringBoot整合SpringSecurity和JWT来实现后台用户的授权和登录功能,因为这部分比较重要,讲解分3-4次讲完,分别介绍SpringSecurity和JWT,以及动态管理权限。 SpringSecurity简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring

zhoubangbang1的博客 561

SpringBoot - 安全管理框架Spring Security使用详解(11)-获取当前用户的用户名、id

有时我们需要获取当前登录的用户信息(比如用户名),通常有如下几种方式来实现。 方法1:通过 Authentication.getPrincipal() 获取用户信息 (1)通过Authentication.getPrincipal()可以获取到代表当前用户的信息,这个对象通常是UserDetails的实例。通过UserDetails的实例我们可以获取到当前用户的用户名、密码、角色等信息。 Spring Security使用一个Authentication对象来描述当...

Andy's Blog 6218
上一篇: 跟着JHipster学做项目 (15) npm 全局安装不同版本package
下一篇: 读懂四幅图,让你厘清JavaScript变量定义
java_augur
博客等级 码龄22年 67粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值