预认证场景
有的情况下,你需要使用Spring Security进行认证,但是用户已经在访问系统之前,在一些外部系统中认证过了。 我们把这种情况叫做“预认证”场景。 例子包括X.509,Siteminder和应用所在的J2EE容器进行认证。 在使用预认证的使用,Spring Security必须
1.
定义使用请求的用户
2.
从用户里获得权限
细节信息要依靠外部认证机制。 一个用户可能,在X.509的情况下由认证信息确定,或在Siteminder的情况下使用HTTP请求头。 对于容器认证,需要调用获得HTTP请求的getUserPrincipal()方法来确认用户。 一些情况下,外部机制可能为用户提供角色/权限信息,其他情况就需要通过单独信息源获得,比如UserDetailsService。
16.1. 预认证框架类
因为大多数预认证机制都遵循相同的模式,所以Spring Security提供了一系列的类,它们作为内部框架实现预认证认证提供器。 这样就避免了重复实现,让新实现很容易添加到结构中,不需要一切从脚手架开始写起。 你不需要知道这些类,如果你想使用一些东西,比如X.509认证,因为它已经是命名空间配置里的一个选项了,可以很简单的使用,启动它。 如果你需要使用精确的bean配置,或计划编写你自己的实现,这时了解这些提供的实现是如何工作就很有用了。 你会在org.springframework.security.ui.preauth包下找到web相关的类,后台类都在org.springframework.security.providers.preauth包里。 我们这里只提供一个纲要,你应该从对应的Javadoc和源代码里获得更多信息。
16.1.1. AbstractPreAuthenticatedProcessingFilter
这个类会检测安全环境的当前内容,如果是空的,它会从HTTP请求里获得信息,提交给AuthenticationManager。 子类重写了以下方法来获得信息:
protected abstract Object getPreAuthenticatedPrincipal(HttpServletRequest request);
protected abstract Object getPreAuthenticatedCredentials(HttpServletRequest request);
在调用之后,过滤器会创建一个包含了返回数据的PreAuthenticatedAuthenticationToken,然后提交它进行认证。 通过这里的“authentication”,我们其实只是可能进行读取用户的权限,不过下面就是标准的Spring Security认证结构了。
16.1.2. AbstractPreAuthenticatedAuthenticationDetailsSource
就像其他的Spring Security认证过滤器一样,预认证过滤器有一个authenticationDetailsSource属性,默认会创建一个WebAuthenticationDetails对象来保存额外的信息,比如在Authentication对象的details属性里的会话标识,原始IP地址。 用户角色信息可以从预认证机制中获得,数据也保存在这个属性里。 AbstractPreAuthenticatedAuthenticationDetailsSource的子类,使用实现了GrantedAuthoritiesContainer接口的扩展信息,因此可以使用认证提供其器来读取权限,明确定位用户。 下面我们看一个具体的例子。
16.1.2.1. J2eeBasedPreAuthenticatedWebAuthenticationDetailsSource
如果过滤器配置了authenticationDetailsSource的实例,通过调用isUserInRole(String role)方法为每个预先决定的“可映射角色”集合获得认证信息。 这个类从MappableAttributesRetriever里获得这些信息。 可能的实现方法,包含了在application context中进行硬编码,或者从web.xml的<security-role>中读取角色信息。 预认证例子程序使用了后一种方式。
这儿有一个额外的步骤,使用一个Attributes2GrantedAuthoritiesMapper把角色(或属性)映射到Spring Security的GrantedAuthority。 它默认只会为名称添加一个ROLE_前缀,但是你可以对这些行为进行完全控制。
16.1.3. PreAuthenticatedAuthenticationProvider
预认证提供器除了从用户中读取UserDetails以外,还要一些其他事情。 它通过调用一个AuthenticationUserDetailsService来做这些事情。 后者就是一个标准的UserDetailsService,但要需要的参数是一个Authentication对象,而不是用户名:
public interface AuthenticationUserDetailsService {
UserDetails loadUserDetails(Authentication token) throws UsernameNotFoundException;
}
这个接口可能也含有其他用户,但是预认证允许访问权限,打包在Authentication对象里,像上一节所见的。 这个PreAuthenticatedGrantedAuthoritiesUserDetailsService就是用来作这个的。 或者,它可能调用标准UserDetailsService,使用UserDetailsByNameServiceWrapper这个实现。
16.1.4. PreAuthenticatedProcessingFilterEntryPoint
这个 AuthenticationEntryPoint 在 技术概述 那章讨论过。 通常它用来为未认证用户(当他们想访问被保护资源的时候)启动认证过程,但是在预认证情况下这不会发生。 如果你不使用预认证结合其他认证机制的话,你只要配置ExceptionTranslationFilter的一个实例。 如果用户的访问被拒绝了,它就会调用,AbstractPreAuthenticatedProcessingFilter结果返回的一个空的认证。 调用的时候,它总会返回一个403禁用响应代码。
16.2. 具体实现
X.509认证写在它自己的章里。 这里,我们看一些支持其他预认证的场景。
16.2.1. 请求头认证(Siteminder)
一个外部认证系统可以通过在HTTP请求里设置特殊的头信息,给应用提供信息。 一个众所周知的例子就是Siteminder,它在头部传递用户名,叫做SM_USER。 这个机制被RequestHeaderPreAuthenticatedProcessingFilter支持,直接从头部得到用户名。 默认使用SM_USER作为头部名。 看一下Javadoc获得更多信息。
Tip
注意使用这种系统时,框架不需要作任何认证检测,极端重要的是,要把外部系统配置好,保护系统的所有访问。 如果攻击者可以从原始请求中获得请求头,不通过检测,他们可能潜在修改任何他们想要的用户名。
16.2.1.1. Siteminder示例配置
使用这个过滤器的典型配置应该像这样:
<bean id="siteminderFilter"
class="org.springframework.security.ui.preauth.header.RequestHeaderPreAuthenticatedProcessingFilter">
<security:custom-filter position="PRE_AUTH_FILTER" />
<property name="principalRequestHeader" value="SM_USER"/>
<property name="authenticationManager" ref="authenticationManager" />
</bean>
<bean id="preauthAuthProvider"
class="org.springframework.security.providers.preauth.PreAuthenticatedAuthenticationProvider">
<security:custom-authentication-provider />
<property name="preAuthenticatedUserDetailsService">
<bean id="userDetailsServiceWrapper"
class="org.springframework.security.userdetails.UserDetailsByNameServiceWrapper">
<property name="userDetailsService" ref="userDetailsService"/>
</bean>
</property>
</bean>
<security:authentication-manager alias="authenticationManager" />
我们假设使用安全命名空间的配置方式,custom-filter,使用了authentication-manager和custom-authentication-provider三个元素(你可以从命名空间章节里了解它们的更多信息)。 你应该走出传统的配置方式。 我们也假设了你在配置里添加了一个UserDetailsService(名叫“userDetailsService”),来读取用户的角色信息。
16.2.2. J2EE容器认证
这个J2eePreAuthenticatedProcessingFilter类会从HttpServletRequest的userPrincipal属性里获得准确的用户名。 这个过滤器的用法常常结合使用J2EE角色,像上面描述的Section 16.1.2.1, “J2eeBasedPreAuthenticatedWebAuthenticationDetailsSource”。
分享到:
相关推荐
### Spring Security 2.0.x完全中文参考文档 #### 序言 本文档旨在为用户提供一份详尽且全面的Spring Security 2.0.x版本的中文指南,它不仅覆盖了核心概念、配置方法以及实际应用案例,还深入探讨了安全框架的...
6. **Spring Security**:5.0版本的Spring Security提供了新的安全特性和改进,如支持OAuth2.0、JWT(JSON Web Tokens)等,强化了认证和授权流程。 7. **Reactor升级**:Spring 5使用了Reactor 3.x作为其响应式...
4. **示例应用程序**:文档提供了多个示例应用程序,如教程示例、LDAP示例、OpenID示例、CAS示例、JAAS示例和预认证示例,以帮助开发者了解如何在不同场景下应用Spring Security。 5. **Servlet应用程序**:这部分...
文档可能包括用户指南、开发者参考、API文档和各种教程。对于开发者来说,这是一个宝贵的资源,帮助他们理解和学习如何利用Spring来构建企业级Java应用程序。 5. **schema**:这部分可能包含了Spring的XML配置文件...
本项目"activiti6-springboot2.0-demo.zip"就是一个实例,展示了如何将 Activiti 6 集成到 SpringBoot 2.0 的环境中,并实现流程高亮显示、在线Web设计器集成以及相关的Java代码和参考文档。 一、Activiti 6 知识点...
- **安全控制**:通过Spring Security,可以方便地实现用户认证和授权,保护应用的安全。 - **微服务架构**:结合Spring Cloud,可以构建完整的微服务生态系统,包括服务注册与发现、配置中心、熔断机制等。 4. ...
《Spring Security 2.0深度解析》 Spring Security是一款强大的安全框架,用于处理Java应用程序的安全需求,特别是...在实际开发中,可以参考博客链接中的内容,结合官方文档,逐步探索和掌握Spring Security的精髓。
JSP可以与Java的安全框架如Spring Security集成,实现用户登录、角色权限控制等功能。 - **工作流程引擎**:协同办公的核心是工作流管理,JSP可以配合BPM(Business Process Management)工具,如Activiti或JBoss ...
标题中的 "activiti-5.13.zip" 指的是 Activiti 的第 5.13 版本的压缩包文件,这个版本相对于当前可能已经较为老旧,但仍然在某些教程或特定场景中被提及和使用。 在 Activiti 5.13 版本中,主要包含以下关键知识点...
这份3.x版本的参考手册,详细阐述了Spring Security的配置、认证、授权机制,以及与Spring MVC的整合。开发者可以通过它学习如何保护应用程序免受未经授权的访问,实现复杂的权限控制策略。 Spring框架作为Java企业...
接下来,我们来看《spring-reference.pdf》,这很可能是Spring框架的最新官方参考文档。这份文档通常涵盖了Spring的所有模块,包括核心容器(Core Container)、数据访问/集成(Data Access/Integration)、Web模块...
根据提供的信息,我们可以推断这份文档“Spring2.0开发参考手册[电子书509页]”是一份详尽的指南,旨在帮助开发者更好地理解和使用Spring框架2.0版本的功能和技术。Spring框架是一个广泛使用的Java平台上的企业级...
Spring Security OAuth2模块提供了完整的OAuth2.0实现,包括授权服务器和资源服务器的配置。开发者可以方便地在Spring Cloud项目中集成OAuth2.0,为微服务间的交互提供安全的授权机制。 在实际应用中,OAuth2.0有...
文献资料Spring Frameworks维护参考文档( 和),Github 以及。 在整个Spring项目中也有。从源构建请参阅Wiki页面以及 。保持联系在Twitter上关注 , 及其。 可以在上找到深入的文章,并通过我们的宣布其。执照...
《Spring 2.0 Reference中文版》是Spring框架开发者的重要参考资料,它详尽地阐述了Spring 2.0版本的核心特性和使用方法。Spring Framework是一个全面的Java应用程序开发框架,以其依赖注入(Dependency Injection,...
可能包括了Spring的模块结构、应用场景、MVC架构模式、Spring Boot的快速启动特性,以及Spring Security等高级主题。 `回调的演示.txt`可能是一个示例,展示了Spring框架中回调机制的使用。在Spring中,回调主要...
《SpringBoot参考指南2.0中文文档》是Java开发者的重要参考资料,它详尽地阐述了SpringBoot框架在2.0版本中的各项特性和使用方法。SpringBoot是Spring框架的一个子项目,旨在简化Spring应用的初始搭建以及开发过程,...
虽然文档中并未给出具体的代码示例,但在实际操作过程中,可以参考Spring官方文档以及Okta提供的指南来进行开发。例如,Spring Security提供了丰富的API和工具类来支持OAuth2.0的集成,同时Okta也提供了详细的教程和...
这个整理版方案可能涵盖了如何配置Spring Security来实现这些功能,包括设置OAuth2的客户端详情、配置授权服务器端点、实现用户认证逻辑以及在UI中处理登录流程等。 在实践中,还需要考虑安全性问题,如令牌的加密...