2014-09-02 115 views
1

我有一個web應用程序,您可以使用form-login登錄,或者您可以進行預先認證並以此登錄。這兩種方法都能正常工作,但我只能通過使用authentication-success-handler-ref屬性來使用form-login成功處理程序。Spring安全預認證成功處理程序

我的問題是,我怎樣才能在我的安全應用程序上下文中爲PRE_AUTH_FILTER調用成功處理程序「mySuccessHandler」?我想我可以將它稱爲PreAuthenticatedProcessingFilter,preauthAuthProvider或自定義過濾器下的屬性或其他內容。

如果用戶具有教師或學生的角色,只需轉到不同的頁面。

<beans:beans xmlns="http://www.springframework.org/schema/security" 
     xmlns:beans="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
       http://www.springframework.org/schema/security 
       http://www.springframework.org/schema/security/spring-security-3.2.xsd"> 


<http pattern="/**" use-expressions="true" create-session="always"> 
    <intercept-url pattern="/login.jsp*" access="permitAll" /> 
    <intercept-url pattern="/**/ErrorPages/**" access="permitAll" /> 
    <intercept-url pattern="/**/Students/**" access="hasAnyRole('STUDENT, TEACHER')" /> 
    <intercept-url pattern="/**/Teacher/**" access="hasRole('TEACHER')" /> 
    <intercept-url pattern="/**/Login/**" access="hasRole('ROLE_USER')" /> 
    <intercept-url pattern="/**/Js/**" access="hasRole('ROLE_USER')" /> 
    <intercept-url pattern="/**/Css/**" access="permitAll" /> 
    <intercept-url pattern="/**/Img/**" access="permitAll" /> 
    <intercept-url pattern="/**/api/**" access="hasRole('ROLE_USER')" /> 
    <intercept-url pattern="/**" access="denyAll" /> 
    <custom-filter position="PRE_AUTH_FILTER" ref="PreAuthenticatedProcessingFilter" /> 
    <access-denied-handler 
    <form-login 
      username-parameter="idnumber" 
      password-parameter="password" login-processing-url="/athuga_innskraningu" 
      login-page='/login.jsp' 
      authentication-failure-handler-ref="myAuthErrorHandler" 
      authentication-success-handler-ref="mySuccessHandler" 
      always-use-default-target='true' 
      authentication-failure-url="/login.jsp?login_error=true"/> 
    <logout logout-url="/utskra/" logout-success-url="/login.jsp"/> 
</http> 


<beans:bean id="mySuccessHandler" class="is.inna.rest.login.AuthenticationSuccess"/> 
<beans:bean id="myAuthErrorHandler" class="is.inna.rest.login.AuthenticationFailure"/> 
<beans:bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/> 

<beans:bean name="myUserDetailsService" class="is.inna.rest.login.UserDetailServiceLogin" /> 
<beans:bean id="userDetailsServiceWrapper" class="is.inna.rest.login.UserDetailServicePreAuth" /> 

<authentication-manager alias="authenticationManager"> 
    <authentication-provider user-service-ref="myUserDetailsService"> 
     <password-encoder ref="passwordEncoder" /> 
    </authentication-provider> 
    <authentication-provider ref="preauthAuthProvider" /> 
</authentication-manager> 


<beans:bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider"> 
    <beans:property name="preAuthenticatedUserDetailsService" ref="userDetailsServiceWrapper"/> 
</beans:bean> 
<beans:bean id="PreAuthenticatedProcessingFilter" class="is.inna.rest.login.PreAuthenticatedProcessingFilter"> 
    <beans:property name="authenticationManager" ref="authenticationManager" /> 
</beans:bean> 

回答

3

你的要求是用戶重定向到根據角色不同的頁面。你也可以使用認證成功處理程序來完成此操作請參考我寫的樣本success handler。在重寫的onAuthenticationSuccess方法中,您始終可以訪問Authentication對象。您可以獲取登錄用戶的權限和角色,並且根據此用戶,您始終可以將用戶重定向到適當的頁面。

希望這會有所幫助。

+0

感謝您的評論,我讓成功處理程序完全和你一樣。並在我的security-context.xml文件中添加。但是成功處理程序中的代碼永遠不會被調用,爲什麼會這樣呢? – bjozzi 2014-09-02 14:10:32

+0

是的,你正在調用authentication-success-handler-ref =「authHandler」,它使用了SavedRequestAwareAuthenticationSuccessHandler,但是當我使用pre-auth過濾器時,我需要知道如何調用它。 – bjozzi 2014-09-02 14:24:12

+0

爲什麼在認證之前調用處理程序已完成?只有當它變成一個有效的用戶時,才能將用戶重定向到不同的頁面。因此,使用身份驗證成功處理程序是一種正確的方法 – 2014-09-03 04:51:02