SpringSecurity中文文档(Servlet X.509 Run-As)

X.509 Authentication

X. 509证书身份验证的最常见用途是在使用 SSL 时验证服务器的身份,最常见的用法是在浏览器中使用 HTTPS。浏览器会自动检查服务器提供的证书是否已由其维护的受信任证书颁发机构列表中的一个颁发(数字签名)。

您还可以使用带有“相互身份验证”的 SSL。然后,服务器从客户机请求一个有效的证书,作为 SSL 握手的一部分。服务器通过检查客户端的证书是否由可接受的授权机构签名来对客户端进行身份验证。如果提供了有效的证书,则可以通过应用程序中的 servletAPI 获得该证书。SpringSecurityX. 509模块使用过滤器提取证书。它将证书映射到一个应用程序用户,并加载该用户的授权集,以便与标准 Spring Security 基础设施一起使用。

您还可以使用带有“相互身份验证”的 SSL。然后,服务器从客户机请求一个有效的证书,作为 SSL 握手的一部分。服务器通过检查客户端的证书是否由可接受的授权机构签名来对客户端进行身份验证。例如,如果使用 Tomcat,则应该阅读 Tomcat SSL 指令。在使用 Spring Security 进行试验之前,您应该让它工作起来。

Adding X.509 Authentication to Your Web Application

启用 X.509客户端身份验证非常简单,为此,在 http 安全名称空间配置中添加 < x509/> 元素:

<http>
...
	<x509 subject-principal-regex="CN=(.*?)," user-service-ref="userService"/>;
</http>

元素有两个可选属性:

  • 主题-主体-正则表达式。用于从证书的主题名称中提取用户名的正则表达式。默认值显示在前面的清单中。这是传递给 UserDetailsService 以加载用户权限的用户名。
  • 用户-服务-参考。这是与 X.509一起使用的 UserDetailsService 的 bean ID。如果在应用程序上下文中只定义了一个,则不需要这样做。

Subject-main-regex 应该包含一个单独的组。例如,默认表达式(CN = (。?))匹配公共名称字段。因此,如果证书中的主题名称是“ CN = Jimi Hendrix,OU = …”,则给出一个用户名“ Jimi Hendrix”。匹配不区分大小写。因此,「电邮地址 = (。?)匹配“ EMAILADDRESS = jimi@hendrix.org,CN = …”,给出一个用户名“ jimi@hendrix.org”。如果客户端提供了一个证书,并且成功地提取了一个有效的用户名,那么在安全上下文中应该有一个有效的 Authentication 对象。如果找不到证书或找不到对应的用户,则安全上下文保持为空。这意味着您可以将 X.509身份验证与其他选项一起使用,例如基于表单的登录。

Setting up SSL in Tomcat

SpringSecuritySamples 存储库中有一些预生成的证书。如果不想生成自己的,可以使用它们来启用 SSL 进行测试。Jks 文件包含服务器证书、私钥和颁发机构证书。还有一些来自示例应用程序的用户的客户端证书文件。您可以在浏览器中安装它们,以启用 SSL 客户端身份验证。

要使用 SSL 支持运行 tomcat,请将 server.jks 文件放入 tomcat conf 目录,并将以下连接器添加到 server.xml 文件:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" scheme="https" secure="true"
			clientAuth="true" sslProtocol="TLS"
			keystoreFile="${catalina.home}/conf/server.jks"
			keystoreType="JKS" keystorePass="password"
			truststoreFile="${catalina.home}/conf/server.jks"
			truststoreType="JKS" truststorePass="password"
/>

如果仍然希望 SSL 连接成功,即使客户端不提供证书,也可以将 clientAuth 设置为 want。不提供证书的客户端无法访问 Spring Security 保护的任何对象,除非使用非 X.509身份验证机制,如表单身份验证。

Run-As Authentication Replacement

AbstractSecurityInterceptor 能够在安全对象回调阶段临时替换 SecurityContext 和 SecurityContextHolder 中的 Authentication 对象。只有在 AuthenticationManager 和 AccessDecisionManager 成功处理原始 Authentication 对象时才会发生这种情况。RunAsManager 指示应该在 SecurityInterceptorCallback 期间使用的替换 Authentication 对象(如果有的话)。

通过在安全对象回调阶段临时替换 Authentication 对象,安全调用可以调用需要不同身份验证和授权凭据的其他对象。它还可以对特定的 GrantedAuthority 对象执行任何内部安全检查。因为 Spring Security 提供了许多帮助器类,可以根据 SecurityContextHolder 的内容自动配置远程协议,所以这些 run-as 替换在调用远程 Web 服务时特别有用。

Configuration

Spring Security 提供了一个 RunAsManager 接口:

Authentication buildRunAs(Authentication authentication, Object object,
	List<ConfigAttribute> config);

boolean supports(ConfigAttribute attribute);

boolean supports(Class clazz);

第一个方法返回 Authentication 对象,该对象应在方法调用期间替换现有 Authentication 对象。如果该方法返回 null,则表示不应进行替换。第二个方法由 AbstractSecurityInterceptor 用作其配置属性启动验证的一部分。支持(Class)方法由安全拦截器实现调用,以确保配置的 RunAsManager 支持安全拦截器提供的安全对象类型。

SpringSecurity 提供了 RunAsManager 的一个具体实现。如果有任何 ConfigAttribute 以 RUN _ AS _ 开头,RunAsManagerImpl 类将返回替换的 RunAsUserToken。如果找到任何这样的 ConfigAttribute,替换的 RunAsUserToken 包含与原始 Authentication 对象相同的主体、凭据和授予的权限,以及针对每个 RUN _ AS _ ConfigAttribute 的一个新的 SimpleGrantedAuthority。每个新的 SimpleGrantedAuthority 都以 ROLE _ 作为前缀,后跟 RUN _ AS ConfigAttribute。例如,RUN _ AS _ SERVER 会导致替换 RunAsUserToken,其中包含 ROLE _ RUN _ AS _ SERVER 授予的权限。

替换 RunAsUserToken 与任何其他 Authentication 对象一样。它需要通过 AuthenticationManager 进行身份验证,可能是通过委托给合适的 AuthenticationProvider。RunAsImpAuthenticationProvider 执行此类身份验证。它接受所提供的任何 RunAsUserToken 为有效。

为了确保恶意代码不会创建 RunAsUserToken 并将其呈现给 RunAsImpenticationProvider 以保证其被接受,密钥的散列将存储在所有生成的令牌中。RunAsManagerImpl 和 RunAsImpenticationProvider 是在 bean 上下文中用相同的键创建的:

<bean id="runAsManager"
	class="org.springframework.security.access.intercept.RunAsManagerImpl">
<property name="key" value="my_run_as_password"/>
</bean>

<bean id="runAsAuthenticationProvider"
	class="org.springframework.security.access.intercept.RunAsImplAuthenticationProvider">
<property name="key" value="my_run_as_password"/>
</bean>

通过使用相同的键,可以验证每个 RunAsUserToken,因为它是由经过批准的 RunAsManagerImpl 创建的。由于安全原因,RunAsUserToken 在创建后是不可变的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值