쓸만한 JSP 홈페이지 만들기

SpringSecurity 설정(1) - security-context.xml

엉으니 2019. 10. 16. 20:06

스프링시큐리티 필요 파일을 정리하고자 한다.

스프링시큐리티는 플로우를 진행하는 중간에 독립된 인증절차가 존재하는 느낌이다.

로그인페이지, 인증을 위한 서버파일, 인증 후 이동될 페이지로 크게 나뉜다.


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들을 살펴볼것이다.

반응형