본문 바로가기

플밍 is 뭔들/SPRING

[SPRING SECURITY] 3.스프링 시큐리티 로그인 커스터마이징

1) 커스터 마이징을 위한 security-context.xml 속성들
 - 스프링 시큐리티는 <form-login> 속성을 이용하면 해당 페이지에서 로그인 할 수 있도록 한다.

login-page
로그인 페이지 주소를 지정
username-parameter
로그인 페이지 form에 있는 username을 저장할 변수이름 지정 (ID값)
password-parameter
로그인 페이지 form에 있는 password를 저장할 변수이름 지정
login-processing-url
로그인 페이지 form에 action에 입력할 주소 지정
ex) <form name="loginform" method="post" action="loginProcess">
default-target-url
로그인 성공시 호출할 주소 지정
authentication-failure-url
로그인 실패시 호출할 주소 지정
always-use-default-target


security-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<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"
      xmlns:p="http://www.springframework.org/schema/p"
      xmlns:util="http://www.springframework.org/schema/util"
      xmlns:context="http://www.springframework.org/schema/context"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
            http://www.springframework.org/schema/security
            http://www.springframework.org/schema/security/spring-security-3.2.xsd
            http://www.springframework.org/schema/util
            http://www.springframework.org/schema/util/spring-util-3.2.xsd
            http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context-3.0.xsd">
      <http pattern="/resources/**" security="none"></http>
      
      <http auto-config='true'>
            <intercept-url pattern="/login_duplicate" access="IS_AUTHENTICATED_ANONYMOUSLY" />
            <intercept-url pattern="/login" access="IS_AUTHENTICATED_ANONYMOUSLY" />
            <intercept-url pattern="/loginInvalidCheck" access="IS_AUTHENTICATED_ANONYMOUSLY,ROLE_USER"/>
            <intercept-url pattern="/**" access="ROLE_USER"/>
            <form-login login-page="/login"
                  username-parameter="id"
                  password-parameter="pw"       
                  login-processing-url="/loginProcess"
                  default-target-url="/loginInvalidCheck"
                  authentication-failure-url="/login" 
                  always-use-default-target='true'
            />
            
            <session-management>
                  <concurrency-control max-sessions="1" expired-url="/login_duplicate"/>
            </session-management>
            
    </http>
   
    <beans:bean class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler"/>
   
    <authentication-manager>
         <authentication-provider ref="customAuthenticationProvider"/>
    </authentication-manager>
     
    <beans:bean id="customAuthenticationProvider" class="com.ex.Manage.security.CustomAuthenticationProvider"/> 
    <beans:bean id="securityService" class="com.ex.Manage.security.CustomServiceImpl"/>
    <beans:bean id="securityDAO" class="com.ex .Manage.security.CustomDAO"/>
</beans:beans>

 - 자 이제 각각의 속성들을 차근차근 알아가 보고 해당 프로젝트에 맞게 적용하자

 <http pattern="/resources/**"security="none"></http>
 resorces 폴더 안에 있는 파일들은 security 대상이 아니라는 것을 나타낸다. 즉 필터를 거치지 않게 된다.
 이 설정을 넣지 않으면 로그인 화면의 CSS와 각종 리소스 파일들이 먹히지 않게된다. 


 <intercept-url pattern="/login_duplicate" access="IS_AUTHENTICATED_ANONYMOUSLY" />
 <intercept-url pattern="/login" access="IS_AUTHENTICATED_ANONYMOUSLY" />
 <intercept-url pattern="/loginInvalidCheck" access="IS_AUTHENTICATED_ANONYMOUSLY,ROLE_USER"/>
 <intercept-url pattern="/**" access="ROLE_USER"/>
 URL에 접근시 필요한 권한을 나타낸다. 
  사실 <intercept-url>을 설정할 때도 약간의 생각을 해야된다. <intercept-url pattern="/**" access="ROLE_USER"/>
  이 속성엔 위의 IS_AUTHENTICATED_ANONYMOUSLY 권한인 페이지들도 포함한다.
  그렇기 때문에 위에 미리 ROLE_USER가 아닌 url들의 접근 권한을 설정해줘야 한다.
  그렇지 않으면 form-login은 계속 login페이지를 호출하고 intercepter-url에선 login페이지는 접근 권한이 없다고 하고
  계속 반복되면서 무한루프처럼 된다. 그러면 웹사이트 접속이 불가해진다.


 <session-management>
 <concurrency-control max-sessions="1" expired-url="/login_duplicate"/>
 </session-management>
 중복 로그인을 방지하기 위한 설정이다.
max-sessions
중복 로그인이 가능한 세션 수/ 1로 지정해야 중복 로그인을 방지한다.
expired-url
중복 로그인 발생시, 먼저 로그인한 세션이 끊어지고 끊어진 상태에서 모든 url을 호출할 경우 끊어진 원인을 알려줄 주소를 지정한다.
error-if-maximum-exceeded
원래는 먼저 로그인한 사용자의 세션이 끊어지지만 true로 설정할 경우 첫번째 로그인이 아닌 세션이 살아 있는 상태에서의 로그인은 거부된다. 


 <authentication-manager>
      <authentication-provider ref="customAuthenticationProvider"/>
 </authentication-manager>
 <beans:bean id="customAuthenticationProvider" class="com.ex.Manage.security.CustomAuthenticationProvider"/> 
  권한을 확인하는 곳이다. 전 장의 기본예제에서는 아이디와 비밀번호 모두 guest로 설정되어 있었지만 
  여기서는 아래 빈의 경로에 있는 클래스 파일에서 권한확인 작업을 하겠다는 뜻이다.

여기까지 security-context.xml파일을 프로젝트에 맞게 변경하는 과정이었다.
다음장에는 <form-login>에서 아이디와 비밀번호를 받아 자바에서 어떻게 처리하는지를 알아보자