Настройка Spring 3.x для нескольких страниц входа - PullRequest
9 голосов
/ 24 сентября 2011

Я использую Spring 3.1 для аутентификации.

Мое требование:

  • Две разные страницы входа.Один для Клиента и другой для Сотрудника.
  • Каждый после успешной аутентификации будет перенаправлен на соответствующий успешный URL.

Моя весенняя конфигурация безопасности:

<sec:http pattern="/resources/**" security="none" />
<sec:http auto-config="true">
    <sec:intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <sec:intercept-url pattern="/customer/**" access="ROLE_CUSTOMER" />
    <sec:intercept-url pattern="/employee/**" access="ROLE_EMPLOYEE" />
</sec:http>

<bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">
    <sec:filter-chain-map path-type="ant">
        <sec:filter-chain pattern="/**"
            filters="authenticationProcessingFilterForCustomer,authenticationProcessingFilterForEmployee" />
    </sec:filter-chain-map>
</bean>

<bean id="authenticationProcessingFilterForCustomer"
    class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
    <property name="authenticationManager" ref="authenticationManagerForCustomer" />
    <property name="filterProcessesUrl" value="/j_spring_security_check_for_customer" />
    <property name="authenticationSuccessHandler" ref="customerSuccessHandler" />
    <property name="authenticationFailureHandler" ref="customerFailureHandler" />
</bean>
<bean id="customerSuccessHandler"
    class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
    <property name="defaultTargetUrl" value="/customer/index.html" />
</bean>
<bean id="customerFailureHandler"
    class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">
    <property name="defaultFailureUrl" value="/customer.html?login_error=1" />
</bean>
<bean id="authenticationManagerForCustomer"
    class="org.springframework.security.authentication.ProviderManager">
    <property name="providers">
        <list>
            <ref bean="customCustomerAuthenticationProvider" />
        </list>
    </property>
</bean>
<bean id="customCustomerAuthenticationProvider" class="com.edu.CustomerCustomAuthenticationProvider">
    <property name="userDetailsService">
        <bean class="com.edu.CustomerUserDetailsService" />
    </property>
</bean>

<bean id="authenticationProcessingFilterForEmployee"
    class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
    <property name="authenticationManager" ref="authenticationManagerForEmployee" />
    <property name="filterProcessesUrl" value="/j_spring_security_check_for_employee" />
    <property name="authenticationSuccessHandler" ref="employeeSuccessHandler" />
    <property name="authenticationFailureHandler" ref="employeeFailureHandler" />
</bean>
<bean id="employeeSuccessHandler"
    class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
    <property name="defaultTargetUrl" value="/employee/index.html" />
</bean>
<bean id="employeeFailureHandler"
    class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">
    <property name="defaultFailureUrl" value="/employee.html?login_error=1" />
</bean>
<bean id="authenticationManagerForEmployee"
    class="org.springframework.security.authentication.ProviderManager">
    <property name="providers">
        <list>
            <ref bean="customEmployeeAuthenticationProvider" />
        </list>
    </property>
</bean>
<bean id="customEmployeeAuthenticationProvider" class="com.edu.EmployeeCustomAuthenticationProvider">
    <property name="userDetailsService">
        <bean class="com.edu.EmployeeUserDetailsService" />
    </property>
</bean>

<sec:authentication-manager alias="authenticationManager">
    <sec:authentication-provider ref="customCustomerAuthenticationProvider" />
    <sec:authentication-provider ref="customEmployeeAuthenticationProvider" />
</sec:authentication-manager>

Оба CustomAuthenticationProvider реализовали метод поддержки следующим образом:

public boolean supports(Class<? extends Object> authentication) {
    return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication);
}

После запуска приложения при попытке аутентификации на страницах входа отображаются сообщения:

Ваша попытка входа не удалась, Попробуйте снова.
Причина: не найден поставщик проверки подлинности для org.springframework.security.authentication.UsernamePasswordAuthenticationToken

Я использую Spring 3.1.Любая помощь приветствуется.

Спасибо

Ответы [ 3 ]

2 голосов
/ 13 сентября 2012

Я делал подобные вещи в Grails, вам нужно:

  1. продлите UsernamePasswordAuthenticationToken, создайте два подкласса для сотрудника и клиента, скажем EmployeeUsernamePasswordAuthenticationToken и CustomerUsernamePasswordAuthenticationToken
  2. расширить UsernamePasswordAuthenticationFilter, чтобы создать другой экземпляр EmployeeUsernamePasswordAuthenticationToken или CustomerUsernamePasswordAuthenticationToken на основе текущего запроса на аутентификацию
  3. расширить AuthenticationProvider для сотрудника и custoner, создать два класса скажем EmployeeAuthenticationProvider и CustomerAuthenticationProvider, перезаписать метод поддержки каждого класса для поддержки его целевого UsernamePasswordAuthenticationToken
  4. вам нужен только один аутентификационный менеджер, зарегистрируйтесь и предоставьте в него
  5. нужен только один AuthenticationSuccessHandler, вы можете решить, какой URL хотите в нем указать
  6. Я также создаю свой собственный экземпляр AuthenticationEntryPoint для поддержки нескольких точек входа
1 голос
/ 17 июля 2012

Начиная с Spring 3.1, у вас есть столько конфигураций, сколько вы хотите: https://jira.springsource.org/browse/SEC-1171

0 голосов
/ 02 ноября 2011

Для исправления bean-компонента, т. Е. «AuthenticationManager», у которого есть провайдеры, необходимо указать ссылку на authenticationManager в бинах «authenticationProcessingFilterForCustomer» и «ProcessingFilterForEmployee »Нет необходимости определять бины «authenticationManagerForCustomer» и «authenticationManagerForEmployee».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...