如何在基于Spring安全的CAS客户端中访问/使用自定义属性

时间:2010-03-28 16:40:31

标签: spring spring-security attributes cas

我需要在成功验证后从服务器发送某些属性(比如人类可读的用户名)。服务器部分完成了。现在属性已发送到客户端。从日志中,我可以看到:

  

2010-03-28 23:48:56,669 DEBUG   Cas20ServiceTicketValidator:185 -   服务器响应:http://www.yale.edu/tp/cas'>                  a@b.com

        <cas:proxyGrantingTicket>PGTIOU-1-QZgcN61oAZcunsC9aKxj-cas</cas:proxyGrantingTicket>



        <cas:attributes>

                <cas:FullName>Test account 1</cas:FullName>

        </cas:attributes>

</cas:authenticationSuccess> </cas:serviceResponse>

但是,我不知道如何在客户端访问该属性(我使用的是Spring security 2.0.5)。

在authenticationProvider中,userDetailsS​​ervice配置为读取经过身份验证的主体的数据库。

<bean id="casAuthenticationProvider" class="org.springframework.security.providers.cas.CasAuthenticationProvider">
    <sec:custom-authentication-provider />
    <property name="userDetailsService" ref="clerkManager"/>
    <!-- other stuff goes here -->
</bean>

现在在我的控制器中,我可以很容易地做到这一点:

 Clerk currentClerk = (Clerk)SecurityContextHolder.getContext().getAuthentication().getPrincipal();

理想情况下,我可以通过某种方式将属性填充到此Clerk对象作为另一个属性。怎么做?

或者在CAS的集中性质下,在所有应用程序之间共享属性的推荐方法是什么?

1 个答案:

答案 0 :(得分:2)

对于SpringSecurity - 您需要升级到3.x以通过内置支持利用CAS属性,请参阅:GrantedAuthorityFromAssertionAttributesUserDetailsS​​ervice.java

它看起来不像SpringSecurity 2.x基于CAS属性填充 - 如果你看一下:

getUserDetailsS​​ervice()中的CasAuthenticationProvider.java:

/**
 * Template method for retrieving the UserDetails based on the assertion.  Default is to call configured userDetailsService and pass the username.  Deployers
 * can override this method and retrieve the user based on any criteria they desire.
 * 
 * @param assertion The CAS Assertion.
 * @returns the UserDetails.
 */
protected UserDetails loadUserByAssertion(final Assertion assertion) {
    return this.userDetailsService.loadUserByUsername(assertion.getPrincipal().getName());
}

如果由于某种原因你必须留在2.x上,你当然可以用UserDetails实现覆盖它。