2014-09-02 3 views
1

form-login으로 로그인 할 수있는 웹 응용 프로그램이 있거나 사전 인증을 받아 로그인 할 수 있습니다. 두 방법 모두 잘 작동하지만 authentication-success-handler-ref 속성을 사용하여 form-login으로 성공 처리기를 사용할 수있는 방법을 찾을 수 있습니다.봄 보안 사전 인증 성공 처리기

제 질문은 내 보안 응용 프로그램 컨텍스트의 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

+0

네, 인증 된 success-handler-ref = "authHandler"가 SavedRequestAwareAuthenticationSuccessHandler를 사용하고 있습니다 만, 사전 인증 필터를 사용할 때이를 호출하는 방법을 알아야합니다. – bjozzi

+0

인증을 받기 전에 처리기를 호출하는 이유는 무엇입니까? 유효한 사용자로 밝혀진 경우에만 사용자를 다른 페이지로 리디렉션하는 것이 좋습니다. 따라서 여기서는 인증 성공 처리기를 사용하는 것이 올바른 방법입니다. –