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

У меня есть CAS 3 Spring 3.2 и Spring Security 3.2, работающие на tomcat 7 с базой данных MySQL.

Мы используем базу данных MySQL с CAS для аутентификации пользователей, затем мы передаем атрибуты после успешного завершения, мы получаем эти данные из базы данных, называемой say "sso"

<bean id="attributeRepository" class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao">

    <constructor-arg index="0" ref="dataSource"/>
    <constructor-arg index="1" value="select * from user where {0}" />
    <property name="queryAttributeMapping">
        <map>
            <entry key="username" value="user_name" />
        </map>
    </property>

    <property name="resultAttributeMapping">
        <map>
            <entry key="user_name" value="username" />
            <entry key="full_name" value="fullname" />
        </map>
    </property>
</bean>

После этого мы хотим получить имя пользователя из этих атрибутов, а затем перейти к базе данных конкретного приложения, скажем, под названием «приложение».

Итак, что мы хотим сделать, это получить имя пользователя из CAS после успешной аутентификации, а затем получить его роли из базы данных.

Как мы можем сделать это правильно?

ОБНОВЛЕНИЕ

Хорошо, теперь то, что я пробовал до сих пор, и я действительно не знаю, действительно ли это или нет.

Я реализовал UserDetailsService и создал UserEntityDetails, который расширяет мой UserEntity и реализует UserDetails. Затем я использовал свой UserDetailsService для загрузки своего пользовательского созданного класса.

Затем в моем XML я сделал это

<security:authentication-manager alias="authenticationManager">
        <security:authentication-provider ref="casAuthProvider" user-service-ref="DBUserServiceDetails" />
    </security:authentication-manager>

Это правильный способ сделать это?


person engma    schedule 07.11.2013    source источник


Ответы (1)


Если я не ошибаюсь в вашем вопросе, то, о чем вы просите, является обычным шаблоном использования - CasAuthenticationProvider настроен с UserDetailsService, который загружает роли из локальной базы данных, а не из CAS.

Если вы посмотрите на Конфигурация образца приложения CAS, вы просто замените bean-компонент userService своей собственной реализацией, которая загружает информацию о пользователе из базы данных вашего приложения.

person Shaun the Sheep    schedule 07.11.2013
comment
хорошо, тогда почему пароль здесь? разве пароль не должен быть в CAS? - person engma; 07.11.2013
comment
Это просто потому, что это синтаксис для пространства имен user-service, который используется здесь для простоты. CasAuthentictaionProvider не должно заботиться о свойстве пароля загруженного объекта UserDetails. Вы можете прочитать эта часть руководства. На шаге 14 загружаются роли. - person Shaun the Sheep; 07.11.2013
comment
хорошо, извините за поздний ответ, пожалуйста, проверьте мой обновленный вопрос - person engma; 13.11.2013
comment
Ваш UserDetailsService должен быть внедрен в CasAuthenticationProvider. У вас не должно быть одновременно ref и user-service-ref в элементе authentication-provider. Опять же, см. образец конфигурации для справки. Это должно быть примерно так, за исключением того, что UserDetailsService является отдельным bean-компонентом. - person Shaun the Sheep; 13.11.2013