0. 다중 로그인 화면
여러 개의 로그인 화면에 대해 시큐리티 처리를 하고자 한다. 고객 테이블과 직원 테이블이 각자 분리되어 있고 각 테이블에 대해 서로 다른 로그인 폼을 사용하게 된다.
1. security-context.xml
로그인에 대한 처리를 설정하는 security-context.xml에서 이를 설정하면 된다. <security:http>와 <security:authentication-manager>를 고객과 직원 각각에게 만들어주면 된다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
https://www.springframework.org/schema/security/spring-security.xsd">
<bean id="memberPasswordEncoder" class="com.java.web.security.MemberPasswordEncoder" />
<bean id="customerDetailsService" class="com.java.web.security.customerDetailsService" />
<bean id="empDetailsService" class="com.java.web.security.EmpDetailsService" />
<!-- 고객 -->
<security:http pattern="/customer/**" authentication-manager-ref="customerAuth">
<security:intercept-url pattern="/customer/**" access="hasRole('customer_ROLE')" />
<security:form-login login-page="/customer/login" login-processing-url="/customer/login" />
<security:session-management>
<security:concurrency-control max-sessions="1"/>
</security:session-management>
<security:logout logout-url="/logout" invalidate-session="true" delete-cookies="JSESSIONID"/>
</security:http>
<security:authentication-manager id="customerAuth">
<security:authentication-provider user-service-ref="customerDetailsService">
<security:password-encoder ref="memberPasswordEncoder" />
</security:authentication-provider>
</security:authentication-manager>
<!-- 직원 -->
<security:http pattern="/emp/**" authentication-manager-ref="empAuth">
<security:intercept-url pattern="/emp/**" access="hasRole('EMP_ROLE')" />
<security:form-login login-page="/emp/login" login-processing-url="/emp/login"/>
<security:session-management>
<security:concurrency-control max-sessions="1"/>
</security:session-management>
<security:logout logout-url="/logout" invalidate-session="true" delete-cookies="JSESSIONID"/>
</security:http>
<security:authentication-manager id="empAuth">
<security:authentication-provider user-service-ref="empDetailsService">
<security:password-encoder ref="memberPasswordEncoder" />
</security:authentication-provider>
</security:authentication-manager>
</beans>
핵심은 <security:http>의 pattern과 authentication-manager-ref 라는 속성이다. pattern은 이 보안 설정을 어느 경로에서 적용할지 지정한다. 경로가 다음과 같이 '/customer/**'일 경우, URI가 '/customer'로 시작하는 모든 경로에 대해 이 보안 설정을 적용하게 된다.
그리고 authentication-manager-ref는 사용할 authentication-manager를 선택한다. 아래의 <security:authentication-manager>를 보면 id 속성을 지정할 수 있는데 이를 authentication-manager-ref 속성값으로 넣어 서로 연결할 수 있다.
<security:authentication-manager>에서는 어떤 식으로 로그인 처리를 할지 DetailsService 등을 설정해 계정 정보를 쿼리할 테이블을 선택할 수 있으므로 고객과 직원 각자에게 맞는 서비스 클래스를 작성하면 된다.
<!-- 고객 -->
<security:http pattern="/customer/**" authentication-manager-ref="customerAuth">
<security:intercept-url pattern="/customer/**" access="hasRole('customer_ROLE')" />
<security:form-login login-page="/customer/login" login-processing-url="/customer/login" />
<security:session-management>
<security:concurrency-control max-sessions="1"/>
</security:session-management>
<security:logout logout-url="/logout" invalidate-session="true" delete-cookies="JSESSIONID"/>
</security:http>
<security:authentication-manager id="customerAuth">
<security:authentication-provider user-service-ref="customerDetailsService">
<security:password-encoder ref="memberPasswordEncoder" />
</security:authentication-provider>
</security:authentication-manager>
'Java > Spring Framework' 카테고리의 다른 글
[Spring Framework] 스프링 시큐리티에서 로그인 성공 후 로그인 전 요청했던 URL로 리다이렉트 하기 (0) | 2023.03.24 |
---|---|
[Spring Framework] UserDetailsService에서 HttpServletRequest 받기 (0) | 2023.03.24 |
[Spring Framework] 스프링 시큐리티에서 동시 접속 제한하기 (0) | 2023.02.17 |
[Spring Framework] 스프링 시큐리티 적용 후 서버에서 회원 정보 확인하기 (0) | 2023.02.15 |
[Spring Framework] 어노테이션을 사용한 시큐리티 지정 (0) | 2023.02.15 |