Как получить доступ / использовать пользовательский атрибут в клиенте CAS на основе Spring Security - PullRequest
0 голосов
/ 28 марта 2010

Мне нужно отправить определенные атрибуты (скажем, человекочитаемое имя пользователя) с сервера клиенту после успешной аутентификации. Серверная часть была сделана. Теперь атрибут был отправлен клиенту. Из журнала я вижу:

2010-03-28 23: 48: 56,669 ОТЛАДКА 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 userDetailsService настроен на чтение дБ для аутентифицированного принципала.

<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();

В идеале, я могу каким-то образом заполнить атрибут этого объекта Клерка как другое свойство. Как это сделать?

Или каков рекомендуемый подход для совместного использования атрибутов во всех приложениях в рамках централизованного характера CAS?

1 Ответ

2 голосов
/ 30 марта 2010

Для SpringSecurity - необходимо обновить до 3.x, чтобы использовать атрибуты CAS с помощью встроенной поддержки, см. GrantedAuthorityFromAssertionAttributesUserDetailsService.java

Это не похоже на заполнение SpringSecurity 2.x на основе атрибутов CAS - если вы посмотрите на:

CasAuthenticationProvider.java at getUserDetailsService ():

/**
 * 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());
}

Конечно, вы можете переопределить это с помощью реализации UserDetails, если вам по какой-то причине придется остаться на 2.x.

...