SpringSeurity中文文档(Servlet Pre-Authentication Scenarios)

打印 上一主题 下一主题

主题 833|帖子 833|积分 2503

Pre-Authentication Scenarios

示例包罗 X.509、Siteminder 以及 Java EE 容器中的身份验证,应用步伐在这些环境中运行。当使用预身份验证时,Spring Security 必须实行以下操作:


  • 辨认发出请求的用户。
  • 为用户获取权限。
详细的细节取决于外部认证机制。在 X.509 的情况下,用户大概通过他们的证书信息来辨认,大概在 Siteminder 的情况下,通过 HTTP 请求头辨认。如果依赖容器认证,用户是通过调用传入 HTTP 请求的 getUserPrincipal() 方法来辨认的。在某些情况下,外部机制大概为用户提供脚色和权限信息。然而,在其他情况下,您必须从单独的泉源获取权限,例如 UserDetailsService。
Pre-Authentication Framework Classes

由于大多数预认证机制遵循相同的模式,Spring Security 有一组类,用于实现预认证身份验证提供步伐的内部框架。这消除了重复,并答应以布局化的方式添加新的实现,而无需从头开始编写所有内容。如果您想使用像 X.509 认证这样的东西,您不必要知道这些类,因为它已经有了一个更简单、更易于使用的定名空间配置选项。如果您必要使用显式 bean 配置,大概筹划编写自己的实现,您必要了解提供的实现是如何工作的。您可以在 org.springframework.security.web.authentication.preauth 下找到这些类。我们在这里只提供一个大纲,因此您应该得当地查阅 Javadoc 和源代码。
AbstractPreAuthenticatedProcessingFilter

这个类查抄安全上下文当前的内容,如果为空,则尝试从 HTTP 请求中提取用户信息并将其提交给 AuthenticationManager。子类重写以下方法以获取这些信息。
Override AbstractPreAuthenticatedProcessingFilter
  1. protected abstract Object getPreAuthenticatedPrincipal(HttpServletRequest request);
  2. protected abstract Object getPreAuthenticatedCredentials(HttpServletRequest request);
复制代码
调用这些方法后,过滤器将创建一个包罗返回数据的 PreAuthenticatedAuthenticationToken 并提交举行身份验证。在这里,“身份验证”现实上只是指进一步的 processing,大概会加载用户的权限,但是遵循尺度的 Spring Security 身份验证架构。
与其他 Spring Security 身份验证过滤器一样,预身份验证过滤器有一个 authenticationDetailsSource 属性,默认情况下,它创建一个 WebAuthenticationDetails 对象来存储额外的信息,比如会话标识符和原始 IP 地址,这些信息存储在 Authentication 对象的 details 属性中。在可以从预身份验证机制获取用户脚色信息的情况下,数据也会存储在这个属性中,详细信息实现了 GrantedAuthoritiesContainer 接口。这使得身份验证提供者能够读取外部分配给用户的权限。我们接下来看一个详细的例子。
J2eeBasedPreAuthenticatedWebAuthenticationDetailsSource

如果过滤器配置了 authenticationDetailsSource,且是本类的一个实例,权限信息将通过为每个预定义的“可映射脚色”集合调用 isUserInRole(String role) 方法来获取。该类从配置的 MappableAttributesRetriever 获取这些信息。大概的实现包罗在应用步伐上下文中硬编码一个列表,以及从 web.xml 文件中的 信息读取脚色信息。预身份验证示例应用步伐使用了后一种方法。
还有一个额外的阶段,其中使用配置的 Attributes2GrantedAuthoritiesMapper 将脚色(或属性)映射到 Spring Security GrantedAuthority 对象。默认情况下,它只是在名称前加上通常的 ROLE_ 前缀,但这为您提供了完全控制行为的能力。
PreAuthenticatedAuthenticationProvider

预认证提供者除了为用户加载 UserDetails 对象外,险些没有更多的事变要做。它通过委托给一个 AuthenticationUserDetailsService 来完成这项工作。后者与尺度的 UserDetailsService 雷同,但它接受一个 Authentication 对象而不仅仅是用户名:
  1. public interface AuthenticationUserDetailsService {
  2.         UserDetails loadUserDetails(Authentication token) throws UsernameNotFoundException;
  3. }
复制代码
这个接口大概还有其他用途,但是,在预认证中,它答应访问封装在 Authentication 对象中的权限,正如我们在上一节中看到的。PreAuthenticatedGrantedAuthoritiesUserDetailsService 类就是这样做的。大概,它可以通过 UserDetailsByNameServiceWrapper 实现委派给一个尺度的 UserDetailsService。
Http403ForbiddenEntryPoint

AuthenticationEntryPoint 负责为未经认证的用户启动认证过程(当他们尝试访问受保护的资源时)。然而,在预认证的情况下,这并不适用。只有当您不将预认证与其他认证机制结合使用时,您才必要配置 ExceptionTranslationFilter 与此类的一个实例。如果用户被 AbstractPreAuthenticatedProcessingFilter 拒绝,导致认证为 null,则会调用它。如果被调用,它总是返回一个 403-克制的响应码。
Concrete Implementations

X.509 认证在其自己的章节中有所涉及。在这里,我们查看一些为其他预认证场景提供支持的类。
Request-Header Authentication (Siteminder)

外部认证系统大概通过在 HTTP 请求上设置特定头部来向应用步伐提供信息。这种机制的闻名示例是 Siteminder,它通过一个名为 SM_USER 的头部传递用户名。这种机制由 RequestHeaderAuthenticationFilter 类支持,它只从头部提取用户名。默认情况下,它使用 SM_USER 作为头部名称。请参阅 Javadoc 以获取更多详细信息。
Siteminder Example Configuration

下面的示例演示使用此筛选器的典型配置:
  1. <security:http>
  2. <!-- Additional http configuration omitted -->
  3. <security:custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter" />
  4. </security:http>
  5. <bean id="siteminderFilter" class="org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter">
  6. <property name="principalRequestHeader" value="SM_USER"/>
  7. <property name="authenticationManager" ref="authenticationManager" />
  8. </bean>
  9. <bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
  10. <property name="preAuthenticatedUserDetailsService">
  11.         <bean id="userDetailsServiceWrapper"
  12.                 class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
  13.         <property name="userDetailsService" ref="userDetailsService"/>
  14.         </bean>
  15. </property>
  16. </bean>
  17. <security:authentication-manager alias="authenticationManager">
  18. <security:authentication-provider ref="preauthAuthProvider" />
  19. </security:authentication-manager>
复制代码
我们在这里假设正在使用安全定名空间举行配置。还假设您已经向配置中添加了一个 UserDetailsService(名为 “userDetailsService”),以加载用户的脚色。
Java EE Container Authentication

J2eePreAuthenticatedProcessingFilter 类从 HttpServletRequest 的 userPrincipal 属性中提取用户名。使用这个过滤器通常必要结合使用 Java EE 脚色,正如前面在 J2eeBasedPreAuthenticatedWebAuthenticationDetailsSource 中所描述的。
在代码库中有一个使用这种方法的示例应用步伐,因此如果您感兴趣,可以从 Github 获取代码并查看应用步伐上下文文件。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王國慶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表