SpringSecurity之SecurityContext和Authentication对象
下面开始讨论几个 Spring Security 里面的核心对象。
org.springframework.security.core.context.SecurityContext
接口表示的是当前应用的安全上下文。通过此接口可以获取和设置当前的认证对象。org.springframework.security.core.Authentication
接口用来表示此认证对象。通过认证对象的方法可以判断当前用户是否已经通过认证,以及获取当前认证用户的相关信息,包括用户名、密码和权限等。
要使用Authentication认证对象,首先需要获取到 SecurityContext 对象。通过 org.springframework.security.core.context.SecurityContextHoldergetContext()
的静态方法 就可以获取。再通过 SecurityContext.getAuthentication()
就可以得到Authentication
。通过认证对象的 Authentication.getPrincipal()
方法就可以获得当前的认证主体
。
认证主体
通常是 UserDetails 接口的实现,典型的认证过程就是当用户输入了用户名和密码之后,UserDetailsService
通过用户名找到对应的 UserDetails
对象,接着比较密码是否匹配。如果不匹配,则返回出错信息;如果匹配的话,说明用户认证成功,就创建一个实现了 Authentication接口的对象,如 org.springframework.security. authentication.UsernamePasswordAuthenticationToken
类的对象。再通过 SecurityContext.setAuthentication()
方法来设置此认证对象。
//获取当前认证用户的用户名
public static String getAuthenticatedUsername() { String username = null; Object principal = SecurityContextHolder.getContext() .getAuthentication().getPrincipal(); if (principal instanceof UserDetails) { username = ((UserDetails) principal).getUsername(); } else { username = principal.toString(); } return username;
}
默认情况下(Web应用来说),SecurityContextHolder
使用 ThreadLocal
来保存 SecurityContext对象。因此,SecurityContext对象对于当前线程上所有方法都是可见的。这种实现对于 Web 应用来说是合适的。
不过在有些情况下,如桌面应用,这种实现方式就不适用了。Spring Security 允许开发人员对此进行定制。开发人员只需要实现接口 org.springframework.security.core.context.SecurityContextHolderStrategy
并通过 SecurityContextHolder.setStrategyName(String)
方法让 Spring Security 使用此实现即可。
另外一种设置方式是使用系统属性。Spring Security 默认提供了另外两种实现方式:
SecurityContextHolder.MODE_GLOBAL
表示当前应用共享唯一的 SecurityContextHolder;SecurityContextHolder.MODE_INHERITABLETHREADLOCAL
表示子线程继承父线程的 SecurityContextHolder。
//使用全局唯一的 SecurityContextHolder的示例。
public void useGlobalSecurityContextHolder() { SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_GLOBAL);
}
SpringSecurity之SecurityContext和Authentication对象相关推荐
- SpringSecurity中文文档—Authentication— Authentication Architecture
文章目录 SecurityContextHolder SecurityContext Authentication GrantedAuthority AuthenticationManager Pro ...
- SpringSecurity中文文档—Authentication— Reading Username/Password
文章目录 Form Login Basic Authentication Digest Authentication Password Storage In-Memory Authentication ...
- Spring Security登录用户数据获取(4)
1. 登录用户数据获取 登录成功之后,在后续的业务逻辑中,开发者可能还需要获取登录成功的用户对象,如果不使用任何安全管理框架,那么可以将用户信息保存在HttpSession中,以后需要的时候直接从 ...
- Springcloud之OAuth2
OAuth2是一个开放的标准,协议.即允许用户让第三方应用访问某一个网站上存储的用户私密资源(照片,头像等).这个过程中无需将用户名和密码提供给第三方应用.在互联网中,我们最常见的OAuth2的应 ...
- Spring Security 参考手册(一)
Spring Security 参考手册 Ben AlexLuke TaylorRob WinchGunnar Hillert Spring security 是一个强大的和高度可定制的身份验证和访问 ...
- 在Spring MVC Web应用程序中添加社交登录:单元测试
Spring Social 1.0具有spring-social-test模块,该模块为测试Connect实现和API绑定提供支持. 该模块已从Spring Social 1.1.0中删除,并由 Sp ...
- spring-security权限控制详解
在本例中,主要讲解spring-boot与spring-security的集成,实现方式为: 将用户.权限.资源(url)采用数据库存储 自定义过滤器,代替原有的 FilterSecurityInte ...
- SpringSecurity入门
Spring Security介绍: Spring Security 的前身是 Acegi Security ,是 Spring 项目组中用来提供安全认证服务的框架. (https://project ...
- SpringSecurity框架【详解】
SpringSecurity 来源视频 文章目录 SpringSecurity 1.概述 2.Spring Security.Apache Shiro 选择问题 2.1.Shiro 2.1.1.shi ...
最新文章
- “京东小贷” 注册资本由30亿元增至50亿元,恭喜
- html手机显示评论列表页面,请问如何完美显示评论列表头像
- 国开大学计算机应用基础作业二,国家开放大学《计算机应用基础》形考作业二答案解析 (2)...
- 将您的SQL Server工作负载迁移到PostgreSQL
- Android应用--简、美音乐播放器增加音量控制
- 异步编程的优势和难点
- Mac MySQL重置Root密码
- 天锐绿盾技术大讲堂:终端出现红色“+”
- HI3520D 音频
- c语言式表白,c语言表白必备
- adsl modem的内置命令(viking)
- Opencv图像识别从零到精通(34)---SIFI
- EasyExcel导出Excel 自定义 表头颜色
- 加速度传感器灵敏度表示的几种方式LSB/g,count/g,V/g,V/°
- pg_repack 处理表和索引的膨胀
- 日期,手机号码正则表达式校验,身份证校验等常用工具
- 山西宗教文化漫谈(三)一五台山:四大佛山之首
- centos7安装pip
- BUUCTF之“judgement_mna_2016”
- Gigaphoton供给最新版ArF受激准分子激光器GT65A