스프링 시큐리티 멀티 로그인 페이지,핸들러 / Spring security mutiple login page, AuthenticationHandler

북마크 추가

안녕하세요

스프링 시큐리티에 url별로 로그인 페이지를 다르게 하는 방법입니다.


전제조건은 a,b,c,d,e로 시작하는 url이  있을때

a = /login1

b = /login2

c,d,e = /login (default)

로 사용하는 방법입니다.

편의상 AuthenticationSuccessHandler와 AuthenticationFailureHandler 명칭은 1,2 으로 하였습니다.


여기서는 xml설정으로 예를 들겠습니다. java로도 같은 방법으로 설정하시면 됩니다.


        <http pattern="/" security="none"/>

<http pattern="/a/**" auto-config="true" access-denied-page="/login/denied">

<intercept-url pattern="/a/**" access="권한" />

<form-login login-page="/login1"

authentication-success-handler-ref="LoginSuccessHandler1"

authentication-failure-handler-ref="LoginFailureHandler1" />

<logout logout-url="/logout"

  success-handler-ref="logoutSuccessHandler"

  invalidate-session="false"/>

</http>

<http pattern="/b/**" auto-config="true" access-denied-page="/login/denied">

<intercept-url pattern="/b/**" access="권한" /> 

<form-login login-page="/login2"

authentication-success-handler-ref="LoginSuccessHandler2"

authentication-failure-handler-ref="LoginFailureHandler2" />

<logout logout-url="/logout"

  success-handler-ref="logoutSuccessHandler"

  invalidate-session="false"/>

</http>

<http auto-config="true" access-denied-page="/login/denied">

<intercept-url pattern="/c/**" access="권한" />

<intercept-url pattern="/d/**" access="권한" />

<intercept-url pattern="/e/**" access="권한" />

<form-login login-page="/login"

authentication-success-handler-ref="loginSuccessHandler"

authentication-failure-handler-ref="loginFailureHandler" />

<logout logout-url="/logout"

  success-handler-ref="logoutSuccessHandler"

  invalidate-session="false"/>


</http>

        <beans:bean id="aLoginSuccessHandler" class="패키지경로/LoginSuccessHandler1"></beans:bean>

<beans:bean id="aLoginFailureHandler" class="패키지경로/LoginFailureHandler1"></beans:bean>

        

        <beans:bean id="bLoginSuccessHandler" class="패키지경로/LoginSuccessHandler2"></beans:bean>

<beans:bean id="bLoginFailureHandler" class="패키지경로/LoginFailureHandler2"></beans:bean>

        <beans:bean id="loginSuccessHandler" class="패키지경로/LoginSuccessHandler"></beans:bean>

<beans:bean id="loginFailureHandler" class="패키지경로/LoginFailureHandler"></beans:bean>

  

        <beans:bean id="logoutSuccessHandler" class="패키지경로/CustomLogoutSuccessHandler"></beans:bean>


위 코드를 보면 a,b,기본 url에 대한 login 성공/실패 핸들러가 있고 로그아웃 핸들러는 공통으로 사용하고 있습니다.


/a/로 시작하는 url일 경우 권한을 체크하여 권한이 없는 경우 /login1으로 redirect 됩니다.

login1 페이지에서 로그인이 성공할 경우 LoginSuccessHandler1으로 생성한 AuthenticationSuccessHandler를 타게되고,

로그인 실패시 LoginFailureHandler1을 타게 됩니다.


/b/로 시작하는 url일 경우 /login2로 redirect 됩니다.

login2 페이지에서 로그인이 성공할 경우 LoginSuccessHander2로 생성한 AuthenticationSuccessHandler를 타게되고,

로그인 실패시 LoginFailureHandler2를 타게 됩니다.


/c/, /d/, /e/ 로 시작하는 url일 경우는 /login으로 redirect 되고 LoginSuccessHandler, LoginFailureHandler 를 타게 됩니다.


위 코드에서 /a/** 등을 대신해서 /abc/def 와 같이 넣어주면 특정 url만 대상으로도 사용가능합니다.

 



관리자
2019-07-22 10:47
SHARE
keyboard_arrow_left
keyboard_arrow_up