浏览 1875 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-08-08
20.1. 概述 AbstractSecurityInterceptor可以在安全对象回调期间,暂时替换SecurityContext和SecurityContextHolder里的Authentication对象。 只有在原始Authentication对象被AuthenticationManager和AccessDecisionManager成功处理之后,才有可能发生这种情况。 如果有需要,RunAsManager会显示替换的Authentication对象,这应该通过SecurityInterceptorCallback调用。 通过在安全对象回调过程中临时替换 Authentication 对象,安全调用可以调用其他需要不同认证授权证书的对象。 这也可以为特定的GrantedAuthority对象执行内部安全检验。 因为Spring Security提供不少帮助类,能够基于SecurityContextHolder的内容自动配置远程协议,这些运行身份替换在远程web服务调用的时候特别有用。 20.2. 配置 一个Spring Security提供的 RunAsManager 接口:: Authentication buildRunAs(Authentication authentication, Object object, ConfigAttributeDefinition config); boolean supports(ConfigAttribute attribute); boolean supports(Class clazz); 第一个方法返回 Authentication对象,在方法的调用期间替换以前的 Authentication 对象。 如果方法返回null,意味着不需要进行替换。 第二个方法用在AbstractSecurityInterceptor中,作为它启动时校验配置属性的一部分。 supports(Class)方法会被安全拦截器的实现调用,确保配置的RunAsManager支持安全拦截器即将执行的安全对象类型。 Spring Security提供了一个 RunAsManager的具体实现。 如果任何一个ConfigAttribute是以RUN_AS_开头的,RunAsManagerImpl类返回一个替换的RunAsUserToken。 如果找到了任何这样的ConfigAttribute,替换的 RunAsUserToken会通过一个新的GrantedAuthorityImpl,为每一个RUN_AS_ ConfigAttribute包含同样的主体,证书,赋予的权限,就像原来的Authentication对象一样。 每个新 GrantedAuthorityImpl 会以ROLE_开头,对应RUN_AS ConfigAttribute。 比如,一个替代RunAsUserToken,对于RUN_AS_SERVER的结果是包含一个ROLE_RUN_AS_SERVER赋予的权限。 替代的 RunAsUserToken 就像其他 Authentication 对象一样。 它可能需要通过代理合适的AuthenticationProvider被AuthenticationManager验证。 这个RunAsImplAuthenticationProvider执行这样的认证,它直接获得任何一个有效的RunAsUserToken。 为了保证恶意代码不会创建一个RunAsUserToken,由RunAsImplAuthenticationProvider保障获得一个key的散列值被保存在所有生成的标记里。 RunAsManagerImpl和RunAsImplAuthenticationProvider在bean上下文里,创建使用同样的key: <bean id="runAsManager" class="org.springframework.security.runas.RunAsManagerImpl"> <property name="key" value="my_run_as_password"/> </bean> <bean id="runAsAuthenticationProvider" class="org.springframework.security.runas.RunAsImplAuthenticationProvider"> <property name="key" value="my_run_as_password"/> </bean> 通过使用相同的key,每个RunAsUserToken可以被它验证,并使用对应的RunAsManagerImpl创建。 出于安全原因,这个RunAsUserToken创建后就不能改变。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |