2011-09-24 15 views
9

Sto usando Spring 3.1 per scopi di autenticazione.Spring 3.x configurazione per più pagine di login

mia esigenza:

  • due diverse pagine di login. Uno per cliente e altro per dipendente.
  • Ciascuna dopo l'autenticazione riuscita, verrà inoltrata al rispettivo URL di successo.

La mia configurazione di sicurezza a molla:

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

Sia CustomAuthenticationProvider hanno attuato il metodo di sostegno come segue:

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

Dopo aver lanciato l'applicazione, durante l'autenticazione, il messaggio visualizzato in pagine di login sono :

Il tentativo di accesso è stato n successo, riprova.
Motivo: Nessun AuthenticationProvider trovato per org.springframework.security.authentication.UsernamePasswordAuthenticationToken

sto usando Primavera 3.1. Qualsiasi aiuto apprezzato.

Thank You

+0

Forse connessi o duplicato di http://stackoverflow.com/questions/4783063/configuring-spring-security-3-x-to-have-multiple-entry-points? – Raghuram

+0

La soluzione risolta per "Configurazione di Spring Security 3.x per avere più punti di ingresso" sta avendo un singolo punto di ingresso e una singola pagina di successo per diversi tipi di utente. Il problema che ho più punti di ingresso e ciascuno con la propria pagina di successo. –

+0

@ManasSahu Puoi aggiungere il codice dei metodi 'supports()' dei tuoi fornitori di autenticazione personalizzati nella tua domanda? – Ritesh

risposta

0

è necessario indicare l'arbitro AuthenticationManager in 'authenticationProcessingFilterForCustomer' e fagioli 'authenticationProcessingFilterForEmployee' per correggere fagioli vale a dire 'AuthenticationManager', che ha i fornitori. Non è necessario definire i bean "authenticationManagerForCustomer" e "authenticationManagerForEmployee".

1

ho fatto cose simili in Grails, quello che vi serve è:

  1. estendono UsernamePasswordAuthenticationToken, creare due sotto-classe per dipendente e cliente, ad esempio EmployeeUsernamePasswordAuthenticationToken e CustomerUsernamePasswordAuthenticationToken
  2. estendere UsernamePasswordAuthenticationFilter, per creare un'istanza diversa di EmployeeUsernamePasswordAuthenticationT oken o CustomerUsernamePasswordAuthenticationToken in base alla richiesta di autenticazione corrente
  3. estendono AuthenticationProvider per dipendenti e custoner, creare due di classe dicono EmployeeAuthenticationProvider e CustomerAuthenticationProvider, sovrascrivono ogni classe metodo supporta per sostenere il suo obiettivo UsernamePasswordAuthenticationToken
  4. è necessario un solo AuthenticationManager, registrare entrambi forniscono in si
  5. solo bisogno uno AuthenticationSuccessHandler, si può decidere quali url vogliono andare in esso
  6. ho anche creare una mia istanza di AuthenticationEntryPoint per il supporto multi entrypoint
Problemi correlati