2011-09-24 17 views
9

Estoy utilizando Spring 3.1 con fines de autenticación.Configuración de Spring 3.x para varias páginas de inicio de sesión

Mi requisito:

  • Dos páginas de acceso diferentes. Uno para el cliente y otro para el empleado.
  • Cada uno después de la autenticación exitosa, se reenviará a la respectiva URL exitosa.

Mi configuración de seguridad de primavera:

<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> 

Tanto CustomAuthenticationProvider han implementado método de soporte de la siguiente manera:

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

Después de lanzar la aplicación, durante la autenticación, el mensaje aparece en las páginas de inicio de sesión son :

Su intento de inicio de sesión fue n Si tiene éxito, inténtelo de nuevo.
Motivo: No se encontró AuthenticationProvider para org.springframework.security.authentication.UsernamePasswordAuthenticationToken

estoy utilizando Spring 3.1. Cualquier ayuda apreciada.

Gracias

+0

Quizás relacionado o duplicado de http://stackoverflow.com/questions/4783063/configuring-spring-security-3-x-to-have-multiple-entry-points? – Raghuram

+0

La solución resuelta para "Configurar Spring Security 3.x para tener múltiples puntos de entrada" es tener un solo punto de entrada y una única página exitosa para diferentes tipos de usuario. El problema es que tengo un punto de entrada múltiple y cada uno tiene una página exitosa. –

+0

@ManasSahu ¿Puedes agregar el código de los métodos 'supports()' de tus proveedores de autenticación personalizados en tu pregunta? – Ritesh

Respuesta

0

tiene que introducir el árbitro AuthenticationManager en 'authenticationProcessingFilterForCustomer' 'y frijoles authenticationProcessingFilterForEmployee' para corregir frijol es decir, 'AuthenticationManager', que cuenta con proveedores. No es necesario definir beans 'authenticationManagerForCustomer' y 'authenticationManagerForEmployee'.

1

he hecho cosas similares en griales, lo que necesita es:

  1. extienden UsernamePasswordAuthenticationToken, crear dos sub-clase para empleado y cliente, indique EmployeeUnombre de usuarioPasswordAuthenticationToken y CustomerUsernamePasswordAuthenticationToken
  2. extend UsernamePasswordAuthenticationFilter, para crear una instancia diferente de EmployeeUsernamePasswordAuthenticationT Oken o CustomerUsernamePasswordAuthenticationToken basado en la petición de autenticación actual
  3. extienden AuthenticationProvider para los empleados y custoner, crear dos clases dicen EmployeeAuthenticationProvider y CustomerAuthenticationProvider, sobreescriben cada clase compatible con el método para apoyar su objetivo UsernamePasswordAuthenticationToken
  4. que sólo necesita un AuthenticationManager, regístrese ambos proporcionan en que
  5. sólo necesita una AuthenticationSuccessHandler, puede decidir qué URL quiere ir en ella
  6. también crear una instancia de mi propia AuthenticationEntryPoint para soportar múltiples punto de entrada
Cuestiones relacionadas