안녕하세요
스프링 시큐리티에 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만 대상으로도 사용가능합니다.