使用 Spring Security 手动验证用户
1。概述
在这篇快速文章中,我们将重点介绍如何在 Spring Security 和 Spring MVC 中手动验证用户的身份。
2。Spring Security
简单地说,Spring Security 将每个经过身份验证的用户的主体信息保存在 ThreadLocal 中——表示为 Authentication 对象。
为了构造和设置这个 Authentication 对象——我们需要使用 Spring Security 通常用来在标准身份验证上构建对象的相同方法。
为此,让我们手动触发身份验证,然后将生成的 Authentication 对象设置为框架用来保存当前登录用户的当前 SecurityContext:
UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(user, pass);
Authentication auth = authManager.authenticate(authReq);
SecurityContext sc = SecurityContextHolder.getContext();
sc.setAuthentication(auth);
在上下文中设置 Authentication 后,我们现在可以使用 securityContext.getAuthentication().isAuthenticated() 检查当前用户是否已通过身份验证。
3。Spring MVC
默认情况下,Spring Security 在 Spring Security 过滤器链中添加了一个额外的过滤器——它能够持久化安全上下文(SecurityContextPersistenceFilter 类)。
反过来,它将安全上下文的持久性委托给 SecurityContextRepository 的实例,默认为 HttpSessionSecurityContextRepository 类。
因此,为了对请求设置身份验证并因此使其可用于来自客户端的所有后续请求,我们需要在 HTTP 会话中手动设置包含 Authentication 的 SecurityContext:
public void login(HttpServletRequest req, String user, String pass) {
UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(user, pass);
Authentication auth = authManager.authenticate(authReq);
SecurityContext sc = SecurityContextHolder.getContext();
sc.setAuthentication(auth);
HttpSession session = req.getSession(true);
session.setAttribute(SPRING_SECURITY_CONTEXT_KEY, sc);
}
SPRING_SECURITY_CONTEXT_KEY 是静态导入的 HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY。
需要注意的是,我们不能直接使用 HttpSessionSecurityContextRepository -- 因为它与 SecurityContextPersistenceFilter. 一起工作
这是因为过滤器使用存储库在链中定义的其余过滤器执行之前和之后加载和存储安全上下文,但它对传递给链的响应使用自定义包装器。
所以在这种情况下,您应该知道所使用的包装器的类类型,并将其传递给存储库中适当的保存方法。
4。结论
在这个快速教程中,我们讨论了如何在 Spring Security 上下文中手动设置用户 Authentication 以及如何使其可用于 Spring MVC 目的,重点介绍了说明实现它的最简单方法的代码示例。
与往常一样,可以在 GitHub 上 找到代码示例。
使用 Spring Security 手动验证用户的更多相关文章
- 如何使用Spring Security手动验证用户
1.概述 在这篇快速文章中,我们将重点介绍如何以编程方式在Spring Security和Spring MVC中设置经过身份验证的用户. 2. Spring Security 简而言之,Spring ...
- Spring security 获取当前用户
spring security中当前用户信息 1:如果在jsp页面中获取可以使用spring security的标签库 在页面中引入标签 1 <%@ taglib prefix=" ...
- Spring Security默认的用户登录表单 页面源代码
Spring Security默认的用户登录表单 页面源代码 <html><head><title>Login Page</title></hea ...
- spring security实现记录用户登录时间等信息
目录 spring security实现记录用户登录时间等信息 一.原理分析 二.实现方式 2.1 自定义AuthenticationSuccessHandler实现类 2.2 在spring-sec ...
- Spring Security 入门—内存用户验证
简介 作为 Spring 全家桶组件之一,Spring Security 是一个提供安全机制的组件,它主要解决两个问题: 认证:验证用户名和密码: 授权:对于不同的 URL 权限不一样,只有当认证的用 ...
- Spring Security 安全验证
摘自:https://www.cnblogs.com/shiyu404/p/6530894.html 这篇文章是对Spring Security的Authentication模块进行一个初步的概念了解 ...
- Spring Security登录验证流程源码解析
一.登录认证基于过滤器链 Spring Security的登录验证流程核心就是过滤器链.当一个请求到达时按照过滤器链的顺序依次进行处理,通过所有过滤器链的验证,就可以访问API接口了. SpringS ...
- Spring Security实现禁止用户重复登陆(配置及原理)
系统使用了Spring Security做权限管理,现在对于系统的用户,需要改动配置,实现无法多地登陆. 一.SpringMVC项目,配置如下: 首先在修改Security相关的XML,我这里是s ...
- spring security LDAP获取用户信息
很多企业内部使用LDAP保存用户信息,这章我们来看一下如何从LDAP中获取Spring Security所需的用户信息. 首先在pom.xml中添加ldap所需的依赖. <dependency& ...
随机推荐
- DZY Loves Math II
简要题面 对于正整数 \(S, n\),求满足如下条件的素数数列 \((p_1,p_2,\cdots,p_k)\)(\(k\) 为任意正整数) 的个数: \(p_1\le p_2\le\cdots\l ...
- 2022-07-29 java之异常
目录 一.异常 1. 异常的概念 2. 异常体系 3.图解异常处理的流程 4.异常处理 1.抛出异常throw 2.捕获异常try{}catch{} 3 声明异常throws 4. finally代码 ...
- SElinux管理
SElinux: 是Linux的一个强制访问控制的安全模块 SElinux的相关概念: 对象:文件.目录.进程.端口等 主体:进程称为主体 SElinux将所有的文件都赋予一个type类型的标签,所有 ...
- spring实体类(POJO)参数的赋值(form表单)原理
10.实体类(POJO)参数的赋值(form表单)原理 10.1.原理解析 测试用例 准备好两个实体类 public class Person { private String name; priva ...
- HDU 1542/POJ 1151 Atlantis (scaning line + segment tree)
A template of discretization + scaning line + segment tree. It's easy to understand, but a little di ...
- Vue3 组合式 API 中获取 DOM 节点的问题
模板引用 Vue 提供了许多指令让我们可以直接操作组件的模板.但是在某些情况下,我们仍然需要访问底层 DOM 元素.在模板中添加一个特殊的属性ref就可以得到该元素. 访问模板引用 <scrip ...
- 试用 ModVB(一):安装教程+使用 JSON 常量和 JSON 模式匹配
前排提醒:阅读此文章并充分尝试 ModVB 的新语法需要较长的时间.对于程序员而言,如果你工作时不用 VB,则最好避免在上班时间看,以免被领导认为你在长时间摸鱼. 什么是 ModVB ModVB 是一 ...
- SpringBoot集成Thymeleaf发送Html邮件报错
由于业务需求需要使用Thymeleaf作为模板发送Html邮件,开发调试过程中发生以下错误 org.thymeleaf.exceptions.TemplateInputException: Error ...
- 第四十六篇:工程化概念以及什么是webpack
好家伙,这波是概念补充 1.什么是工程化概念? 我的开发: 开个项目,想怎么改怎么改,拉个东西过来就用 实际的前端开发: (1) 模块化(js的模块化,css的模块化,资源的模块化) (2) 组件化( ...
- const修饰符总结
1.什么是const? const就是constant的缩写,意思是"恒定不变的",它是定义只读变量的关键字,或者说const是定义常变量的关键字,常类型的变量或对象的值是不能被更 ...