- 浏览: 193759 次
- 性别:
- 来自: 南京
文章分类
最新评论
前言:
本文主要介绍在spring security中的几个核心组件,以及他们之间是怎样相互协作的。
环境:
spring boot 版本:1.5.4.RELEASE
1.核心组件之SecurityContextHolder
SecurityContextHolder是spring security中最基本的组件,是用来存储我们应用的安全上下文的,包含了当前系统认证用户的详细信息。默认情况下SecurityContextHolder用一个ThreadLocal来存储这些详情,这意味着只要是在认证线程中执行的方法,不管我们传不传入这个安全上下文我们都能访问到。
如果使用ThreadLocal不能完全满足我们系统的需求,可以用以下两种方式来设置SecurityContextHolder的存储模式
spring security目前给我们提供的存储方式有以下三种
2.核心组件之Authentication对象
我们把当前系统的认证用户信息存储在了SecurityContextHolder,在spring security内部是使用Authentication来代表这个认证信息的。通常情况下我们不需要自己创建Authentication对象,但是我们经常需要获取这个对象以获取认证者的某些详情(用户名等)。在我们应用代码中的任何地方,我们都可以用如下代码段来获取这个信息
SecurityContextHolder.getContext这个方法返回的是SecurityContext,也就是我们的安全上下文信息,如前所述,这个信息默认存储在ThreadLocal中。在spring security中,大多数的认证机制代表的认证信息都是一个UserDetails的具体实例
3.核心组件之UserDetailsService
从之前获取认证信息的代码片段中我们可以看到从Authentication中获取到的认证主体是一个个对象,并且大多数情况下这个对象能转换成UserDetails对象。UserDetails是一个重要的接口,我们可以把他想象成一个适配器,用来将我们自己数据库中的用户对象适配成spring security 在SecurityContextHolder中存储的对象。有时候我们也会将UserDetails这个对象强制转换成我们系统中提供的原始对象从而获取我们业务特定的用户信息(邮箱、电话等)。
UserDetailsService就是用来创建UserDetails的组件。这是一个接口,里面只有一个方法
这是spring security中最常用来获取用户信息的地方。
当用户认证成功后,UserDetails会被用来构建一个Authentication对象,并存储在SecurityContextHolder中,在spring security中,已经为我们提供了很多UserDetailsService的默认实现,如利用内存存储用户信息的InMemoryDaoImpl和利用JDBC存储的JdbcDaoImpl,我们也可以通过实现UserDetailsService这个接口来定制化我们的认证用户信息,并且不管是使用spring为我们提供的,还是我们自定义实现,我们都可以从SecurityContextHolder中获取这个认证信息。
4.核心组件之GrantedAuthority
除了获取认证主体,Authentication中还有一个重要的方法getAuthorities(),这个方法会放回一个GrantedAuthority数组,一个GrantedAuthority就是赋给认证主体的一个权限,通常这个权限会用一种角色代表,如ROLE_USER、ROLE_ADMIN。这些权限在spring security的鉴权阶段将会被解析,从而判断用户是否具有访问哪些受限制的资源。权限信息通常也是有UserDetailsService的实现类来获取的
通常情况下GrantedAuthority对象都是应用层面的权限,并不会特指某一个具体的业务对象。因此你不可能会创建一个GrantedAuthority来代替能访问Id号是54的Employee对象,如果这样使用,你会有成百上千的GrantedAuthority来代替不同的业务对象,系统内存将很快被耗尽。
5.总结
本文主要介绍在spring security中的几个核心组件,以及他们之间是怎样相互协作的。
环境:
spring boot 版本:1.5.4.RELEASE
1.核心组件之SecurityContextHolder
SecurityContextHolder是spring security中最基本的组件,是用来存储我们应用的安全上下文的,包含了当前系统认证用户的详细信息。默认情况下SecurityContextHolder用一个ThreadLocal来存储这些详情,这意味着只要是在认证线程中执行的方法,不管我们传不传入这个安全上下文我们都能访问到。
如果使用ThreadLocal不能完全满足我们系统的需求,可以用以下两种方式来设置SecurityContextHolder的存储模式
- 通过设置系统变量spring.security.strategy的属性
- 直接调用SecurityContextHolder的setStrategyName方法,这是个静态方法
spring security目前给我们提供的存储方式有以下三种
- MODE_THREADLOCAL 默认存储方式,利用ThreadLocal存储
- MODE_INHERITABLETHREADLOCAL 表示从安全线程中衍生出来的线程也采用和安全线程共享安全上下文
- MODE_GLOBAL 在整个java 虚拟机里面共享同一个安全上下文,如swing桌面应用中采用
2.核心组件之Authentication对象
我们把当前系统的认证用户信息存储在了SecurityContextHolder,在spring security内部是使用Authentication来代表这个认证信息的。通常情况下我们不需要自己创建Authentication对象,但是我们经常需要获取这个对象以获取认证者的某些详情(用户名等)。在我们应用代码中的任何地方,我们都可以用如下代码段来获取这个信息
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); if (principal instanceof UserDetails) { String username = ((UserDetails)principal).getUsername(); } else { String username = principal.toString(); }
SecurityContextHolder.getContext这个方法返回的是SecurityContext,也就是我们的安全上下文信息,如前所述,这个信息默认存储在ThreadLocal中。在spring security中,大多数的认证机制代表的认证信息都是一个UserDetails的具体实例
3.核心组件之UserDetailsService
从之前获取认证信息的代码片段中我们可以看到从Authentication中获取到的认证主体是一个个对象,并且大多数情况下这个对象能转换成UserDetails对象。UserDetails是一个重要的接口,我们可以把他想象成一个适配器,用来将我们自己数据库中的用户对象适配成spring security 在SecurityContextHolder中存储的对象。有时候我们也会将UserDetails这个对象强制转换成我们系统中提供的原始对象从而获取我们业务特定的用户信息(邮箱、电话等)。
UserDetailsService就是用来创建UserDetails的组件。这是一个接口,里面只有一个方法
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
这是spring security中最常用来获取用户信息的地方。
当用户认证成功后,UserDetails会被用来构建一个Authentication对象,并存储在SecurityContextHolder中,在spring security中,已经为我们提供了很多UserDetailsService的默认实现,如利用内存存储用户信息的InMemoryDaoImpl和利用JDBC存储的JdbcDaoImpl,我们也可以通过实现UserDetailsService这个接口来定制化我们的认证用户信息,并且不管是使用spring为我们提供的,还是我们自定义实现,我们都可以从SecurityContextHolder中获取这个认证信息。
4.核心组件之GrantedAuthority
除了获取认证主体,Authentication中还有一个重要的方法getAuthorities(),这个方法会放回一个GrantedAuthority数组,一个GrantedAuthority就是赋给认证主体的一个权限,通常这个权限会用一种角色代表,如ROLE_USER、ROLE_ADMIN。这些权限在spring security的鉴权阶段将会被解析,从而判断用户是否具有访问哪些受限制的资源。权限信息通常也是有UserDetailsService的实现类来获取的
通常情况下GrantedAuthority对象都是应用层面的权限,并不会特指某一个具体的业务对象。因此你不可能会创建一个GrantedAuthority来代替能访问Id号是54的Employee对象,如果这样使用,你会有成百上千的GrantedAuthority来代替不同的业务对象,系统内存将很快被耗尽。
5.总结
- SecurityContextHolder,存储安全上下文,提供访问SecurityContext的方法
- SecurityContext,持有Authentication对象,通常情况下代表着特定请求的认证详情(ThreadLocal的存储模式)
- Authentication,在spring security代表着认证主体
- GrantedAuthority,代表着付给用户的一种应用级别的许可信息
- UserDetails,提供必要的信息来构建一个Authentication
- UserDetailsService,通过传入的用户名称或者证书ID来获取一个UserDetails
发表评论
-
spring-security(二十五)鉴权
2018-03-27 11:21 1597前言 本文将详细探讨spring security中的鉴权 ... -
test
2018-03-19 21:20 0什么是服务发现 ... -
spring-security(二十四)CSRF
2018-03-24 09:54 81561.什么是CSRF攻击 下面我们以一个具体的例子来说明这种常见 ... -
spring-security(二十三)Remember-Me认证
2018-03-09 21:06 1338前言: Remember-me认证方式指的是能在不同的会话 ... -
spring-security(二十二)基本认证和摘要认证
2018-03-06 16:58 1800前言: 在web应用中,非常流行以基本认证和摘要认证作为备 ... -
spring-security(二十一)核心Filter-UsernamePasswordAuthenticationFilter
2018-03-04 11:05 1234一、UsernamePasswordAuthenticatio ... -
spring-security(二十)核心Filter-SecurityContextPersistenceFilter
2018-02-28 21:40 1129一、SecurityContextPersistenceFil ... -
spring-security(十九)核心Filter-ExceptionTranslationFilter
2018-02-27 16:31 2058前言: 在spring的安全 ... -
spring-security(十八)核心Filter-FilterSecurityInterceptor
2018-02-25 10:59 2343前言: 当用spring secur ... -
spring-security(二十六)整合CAS 实现SSO
2018-04-05 18:09 12401.cas 认证流程 2.spring security ... -
spring-security(十七)Filter顺序及简介
2018-02-22 18:16 7899前言: spring security在 ... -
spring-security(十六)Filter配置原理
2018-02-21 15:18 2384前言: spring security最常见的应用场景还是 ... -
spring-security(十五) Password编码
2018-02-19 15:15 1223前言: 在实际应用中 ... -
spring-security(十四)UserDetailsService
2018-02-19 11:35 1470前言: 作为spring security的核心类,大多数 ... -
spring-security(十三)核心服务类
2018-02-18 16:46 1410前言: 在之前的篇章中我们已经讲述了spring secu ... -
spring-security(十二)鉴权方式概述
2018-02-18 10:42 2524前言: 本文主要讲述在spring security鉴权的 ... -
spring-security(十一)Web应用认证过程
2018-02-17 17:17 1235前言: 本文将探讨当 ... -
spring-security(十)基本认证过程
2018-02-17 13:55 2104前言: 在spring security中认证具体指的是什 ... -
spring-security(八)java config-sample之cas client
2018-02-16 11:26 2066前言: SSO英文全称Single Sign On,单点登 ... -
spring-security(七)java config-sample之concurrency
2018-02-15 10:51 669前言: 在实际应用中,我们可能会限制一个用户同时登录同一个 ...
相关推荐
2. **spring-beans-3.1.2.RELEASE.jar**:包含Spring处理bean定义和依赖注入的核心类,使得Spring Security可以动态地管理其组件。 3. **spring-web-3.1.2.RELEASE.jar**:提供了处理HTTP请求和响应的能力,以及...
4. **spring-security-core-tiger-2.0.5.RELEASE-sources.jar**:这个jar包包含了Spring Security核心组件的源代码,对于开发者来说非常有用,因为它允许他们查看和理解框架内部的工作原理,便于调试和自定义扩展。...
3. **过滤器链**:Spring Security 的核心是Filter Security Interceptor(过滤器安全拦截器)和Access Decision Manager(访问决策管理器)。过滤器链处理HTTP请求,进行身份验证和授权检查,而访问决策管理器根据...
1. **spring-security-core-3.1.4.RELEASE.jar**:这是Spring Security的核心模块,包含了基本的安全概念和API,如Authentication(认证)和Authorization(授权)。它提供了SecurityContextHolder来存储当前用户的...
下面将详细探讨Spring Security OAuth2的核心概念、工作流程以及关键组件。 1. **核心概念** - **Resource Owner**(资源所有者):即用户,拥有受保护的资源。 - **Client**(客户端):需要访问资源的所有者的...
3. **过滤器链(Filter Chain)**:Spring Security的核心组件之一是过滤器链,它由多个过滤器组成,如`UsernamePasswordAuthenticationFilter`和`HttpSessionAuthenticationStrategy`等。这些过滤器负责处理HTTP...
这个压缩包包含了Spring Security 4.0.0版本所需的jar包,这是一组核心组件,为构建安全的Web应用提供了基础。 1. **spring-security-core**: - `spring-security-core-4.0.0.CI-SNAPSHOT-javadoc.jar`:包含...
Spring Security的架构基于过滤器链,主要包括以下几个核心组件: - **Filter Security Interceptor (FSI)**:处理HTTP请求,根据配置的访问决策管理器(Access Decision Manager)决定是否允许访问。 - **...
首先,我们要了解Spring Security OAuth2的主要组件: 1. **Authorization Server**:这是项目的核心,负责处理用户的授权请求,生成访问令牌(Access Tokens)和刷新令牌(Refresh Tokens)。在这个项目中,我们将...
《Spring Security核心库3.1.0.RC1详解》 Spring Security是Java平台上的一款强大且高度可配置的安全框架,用于解决Web应用和企业级应用的安全需求。在本篇文章中,我们将深入探讨Spring Security的核心库——`...
在这个源码分析中,我们将深入探讨`spring-security-web 3.1.2`和`spring-security-oauth2`这两个关键组件。 首先,`spring-security-web`是Spring Security的核心库,它提供了Web应用程序的基本安全功能,如HTTP...
1. **spring-security-config**:这个模块提供了配置Spring Security的核心API。它包含安全元数据(如`@Secured`和`@PreAuthorize`注解)和XML配置元素,如`<http>`和`<authentication-manager>`,用于定义安全策略...
在IT领域,Spring Security和Spring Boot是两个极为重要的组件,它们为开发者提供了强大的安全管理和应用程序构建能力。本篇将详细讲解如何将Spring Security集成到Spring Boot项目中,以及涉及到的相关知识点。 一...
《Spring Security核心模块详解》 在Java开发领域,Spring Security是一个强大的、高度可配置的安全框架,用于保护Web应用程序免受各种安全威胁。本篇将详细探讨`spring-security-core-2.0.5.RELEASE.src`这个源...
1. ContextSource:这是Spring Security LDAP的核心组件,负责与LDAP服务器建立连接并执行查询操作。开发者可以通过配置ContextSource来指定服务器地址、端口、基础DN等信息。 2. LdapTemplate:这个模板类提供了...
首先,Spring Security的核心概念包括安全性上下文、过滤器链和访问决策管理器。安全性上下文存储当前请求的认证和授权信息。过滤器链是Spring Security实现其功能的关键,它由一系列安全过滤器组成,这些过滤器在...
8. **自定义扩展**:Spring Security允许开发者自定义许多核心组件,如认证提供者、访问决策器、过滤器等,以适应特定的业务需求。 为了充分利用这个压缩包中的内容,你需要解压并查看源代码,了解其内部结构和工作...
Spring Security的主要组件包括:过滤器链、认证管理、授权规则和访问决策管理。 整合Spring Boot与Spring Security的第一步是添加依赖。在`pom.xml`文件中,我们需要引入Spring Security的起步依赖: ```xml ...
Spring Security是基于Spring框架的安全组件,原名为Acegi Security。它为Web应用程序提供了全面的安全服务,包括认证、授权、会话管理以及防止常见攻击(如CSRF、XSS等)。Spring Security通过高度可配置的API,使...
1. **Filter Security Interceptor (FSI)**:它是Spring Security的核心组件之一,负责拦截HTTP请求,并根据配置的安全规则进行处理。FSI使用访问决策管理器(Access Decision Manager)和权限表达式处理...