스프링시큐리티 필요 파일을 정리하고자 한다.
스프링시큐리티는 플로우를 진행하는 중간에 독립된 인증절차가 존재하는 느낌이다.
로그인페이지, 인증을 위한 서버파일, 인증 후 이동될 페이지로 크게 나뉜다.
1. 스프링시큐리티 xsd 정의
이 파일 안에 시큐리티 bean을 설정할 것이다.
<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.1.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">
</beans:beans>
지금부터 bean:beans설정 안쪽에 작성한다.
2. 시큐리티 인증예외
- security="none"설정은 앞의 패턴에 인증을 예외적용 시킨다.
- *(별표시)는 하위 모든 경로에 대해 인증을 예외하겠다는거다.
- access-denied-page는 인증이 끊어진 세션을 어느 페이지로 이동할지 결정한다.
- intercept-url은 어떤 인증절차의 유저를 접근하게 할것인지 결정한다.
isAuthenticated()는 인증된 사용자면 접근가능이다.
- form-login login-page 는 로그인페이지로 어떤페이지를 쓸지 결정한다.
- authentication-failure-url은 인증실패시 이동할 페이지이다.
- authenticationSuccessHandler는 인증 후 어떤로직으로 처리할지 결정한다.
나는 여기서 인증후 default page설정을 했다.
- logout-success-url은 로그아웃 후 어떤페이지로 이동할지 결정한다.
<http pattern="/admin/denied.do" security="none" />
<http pattern="/admin/login.do" security="none" />
<http pattern="/resources/**" security="none" />
<http auto-config="true" access-denied-page="/common/auth/denied" use-expressions="true">
<intercept-url pattern="/*/**" access="isAuthenticated()" />
<!-- 로그인 설정 -->
<form-login login-page="/admin/login.do"
authentication-failure-url="/admin/login.do?login_error=auth"
authentication-success-handler-ref="authenticationSuccessHandler" />
<!-- 로그아웃 설정 -->
<logout logout-success-url="/admin/login.do" />
<!-- anonymous / -->
<http-basic />
<remember-me use-secure-cookie="true" />
</http>
3. authentication-manager
- 이 설정이 핵심이다 핵심.
인증중에 갑자기 오류가 났다 그러면 이 설정부터 차근차근 따라가보면 된다.
- authentication-provider ref : Provider라고 하는 스프링상의 Service에 해당하는 파일을 참조한다.
DB에서 가져온 패스워드 일치여부를 여기에서 대조할것이다.
- authentication-provider user-service-ref : db커넥션하고 조회한 정보를 시큐리티에서만 사용하는 bean에 담는다.
- password-encoder ref : 패스워드를 암호화할때 참조할 파일을 여기서 설정한다.
<!-- AuthenticationManager 설정 -->
<authentication-manager>
<authentication-provider ref="userAuthProvider" />
<authentication-provider user-service-ref="jdbcUserService">
<password-encoder ref="passwordEncoder" />
</authentication-provider>
</authentication-manager>
4. 패스워드 인증시 SHA256 적용여부
- authentication-provider에서 password-encoder참조로 이 설정을 넣었다.
- sha256을 적용할것이고, 로직은 스프링시큐리티에서 제공한다. ShaPasswordEncoder클래스이다.
<!-- SHA256 적용 -->
<beans:bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder">
<beans:constructor-arg value="256" />
<beans:property name="encodeHashAsBase64" value="true" />
</beans:bean>
5. jdbcUserService
- db커넥션하고 조회한 정보를 bean에 주입하는 역할을 한다.
- usersByUsernameQuery, authoritiesByUsernameQuery 두가지는 UserDAO클래스에서 사용할 쿼리를 정의했다.
이 쿼리들은 UserDAO상에서 getUsersByUsernameQuery처럼 get방식으로 가져온다.
- dataSource는 jndi bean을 참조시켰다. db커넥션을 하기 위함이다.
db커넥션이 잘되는지 이미 테스트를 한 상태이다.
- roleHierarchy는 권한 상하관계설정과 관련된 설정인데, 추후 db형식으로 바꿀예정이다.
- mapClass는 db조회해서 bean에 담는 클래스이다.
<beans:bean id="jdbcUserService" class="com.youngeunweb.www.common.security.dao.UserDAO">
<beans:property name="usersByUsernameQuery">
<beans:value>SELECT USER_ID, USER_PWD, USE_YN, USER_NM FROM YE_SECURITY_USER WHERE USER_ID = ?</beans:value>
</beans:property>
<beans:property name="authoritiesByUsernameQuery">
<beans:value>SELECT A.USER_ID, B.ROLE_ID auth, A.GRP_ID FROM YE_SECURITY_GRP_USER A, YE_SECURITY_GRP_ROLE B WHERE A.GRP_ID = B.GRP_ID AND USER_ID = ?</beans:value>
</beans:property>
<beans:property name="dataSource" ref="dataSourceForMaria" />
<beans:property name="roleHierarchy" ref="roleHierarchy" />
<beans:property name="mapClass" value="com.youngeunweb.www.common.security.factory.UserDetailsMapping" />
</beans:bean>
6. userAuthProvider
- 스프링시큐리티의 Service에 해당하는 클래스이다.
- 특별한 속성없이 bean에 class만 정의해주면된다.
- 이 클래스는 db조회해온 정보를 form에 입력한 값과 비밀번호 대조하는 역할을 할거다.
<beans:bean id="userAuthProvider" class="com.youngeunweb.www.common.security.provider.AuthenticationProvider" />
7. roleHierarchy
- 권한상속에 대한 정의이다. (하위권한>상위권한)
<!-- 권한 계층 구현 : DB로 변경할 예정 -->
<beans:bean id="roleHierarchy" class="org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl">
<!-- XML 사용 -->
<beans:property name="hierarchy">
<beans:value>
ROLE_ADMIN > ROLE_0001
ROLE_0001 > ROLE_RESTRICTED
ROLE_RESTRICTED > IS_AUTHENTICATED_FULLY
IS_AUTHENTICATED_REMEMBERED > IS_AUTHENTICATED_ANONYMOUSLY
</beans:value>
</beans:property>
</beans:bean>
8. dataSourceForMaria
- 서버에 정의한 jndi를 사용한다.
<beans:bean id="dataSourceForMaria" class="org.springframework.jndi.JndiObjectFactoryBean">
<beans:property name="jndiName" value="java:comp/env/jdbc/yeahnweb" />
</beans:bean>
9. cacheRole
- 캐시설정에 대한 부분.
<beans:bean id="cacheRole" class="java.util.LinkedHashMap" scope="prototype" />
다음 포스팅에서는 커스텀으로 생성한 class들을 살펴볼것이다.
'쓸만한 JSP 홈페이지 만들기' 카테고리의 다른 글
Spring 설정xml - property-context.xml (0) | 2019.07.08 |
---|---|
공통클래스 - CommonInterceptor (0) | 2019.07.03 |
공통클래스 - FrontInterceptor (0) | 2019.07.02 |
Spring 설정xml - interceptor-context.xml (0) | 2019.07.02 |
Spring 설정xml - file-context.xml (0) | 2019.07.02 |