Pages

2014년 1월 29일 수요일

[SPRING] Spring Security 3 - 로그인 페이지 커스터마이징

Spring Security 3 - 맛보기와 기본 설정의 이해 에서 스프링 시큐리티가 디폴트로 제공하는 로그인 페이지를 본 적이 있을 것이다. 이 포스트에서는 이 디폴트 로그인 페이지를 우리가 개발한 로그인 페이지로 변경하는 방법을 알아보자.
우리가 개발한 로그인 페이지를 적용해 보기 전에 먼저 Spring Security 3 - 맛보기와 기본 설정의 이해 의 접근권한 설정방식을 SpEL 표현식을 사용해서 다음과 같이 수정해 보자.
1
2
3
4
<security:http auto-config="true" use-expressions="true">
    <security:intercept-url pattern="/favicon.ico" access="permitAll" />
    <security:intercept-url pattern="/*" access="hasRole('ROLE_USER')" />
</security:http>

우리가 개발할 로그인 페이지를 적용하는 절차를 요약하면 다음과 같다.
1. 로그인 페이지를 개발한다.
2. 로그인 페이지를 http 엘리먼트 내부의 <form-login> 엘리먼트에 설정해 준다.
3. 로그인 페이지 자체에 대한 적절한 접근 권한을 설정해 준다.
우리가 만든 로그인 페이지가 잘 적용되는지만 확인해 보기 위해서 아무 내용도 없는 login.jsp 를 만들고 기본설정을 아래와 같이 변경한 후에 로컬 서버에 배포해 보자. login.jsp 는 http://localhost:8080/login.jsp 로 접근할 수 있다고 가정한다.
1
2
3
4
5
<security:http auto-config="true" use-expressions="true">
    <security:intercept-url pattern="/favicon.ico" access="permitAll" />
    <security:intercept-url pattern="/*" access="hasRole('ROLE_USER')" />
    <security:form-login login-page="/login.jsp"/>
</security:http>

브라우저에 http://localhost:8080 을 입력하면 우리가 개발한 로그인 페이지대신 다음과 같은 오류 화면이 나타날 것이다.
이와 같은 오류 화면이 보이는 이유는 방금 우리가 개발한 login.jsp 를 포함하는 모든 URL 접근시에 ROLE_USER 라는 접근권한을 필요하다고 다음과 같이 설정했기 때문이다.

<security:intercept-url pattern="/*" access="hasRole('ROLE_USER')" />
따라서 /login.jsp URL 에 대해서는 모든 익명 사용자를 포함한 모든 사용자가 접근할 수 있도록  접근권한을 다음과 같이 설정해 줘야 한다.
1
2
3
4
5
6
<security:http auto-config="true">
    <security:intercept-url pattern="/favicon.ico" access="permitAll" />
    <security:intercept-url pattern="/login.jsp" access="permitAll" />
    <security:intercept-url pattern="/**" access="ROLE_USER" />
    <security:form-login login-page="/login.jsp"/>
</security:http>

다시 배포한 후, 브라우저에 http://localhost:8080 을 입력해보자. login.jsp 로 리다이렉트되어 빈 화면이 보일 것이다. 이것으로 스프링 시큐리티가 제공하는 디폴트 로그인 페이지가 우리가 개발한 login.jsp 로 잘 변경된 것을 확인할 수 있다.
이제 login.jsp 가 사용자 아이디와 비밀번호를 입력받을 수 있도록 수정해줘야 하는데 몇 가지 기억해야할 사항이 있다. 사용자 아이디와 비밀번호 폼필드명과 폼이 서브밋되는 URL 은 UsernamePasswordAuthenticationFilter 에 기본적으로 설정된 것을 사용해야 한다. 물론 각 폼필드명과 서브밋되는 URL 을 변경할 수도 있지만 이 포스트에서는 변경하는 방법을 설명하지 않을 것이기 때문이다. UsernamePasswordAuthenticationFilter 에 디폴트로 설정된 필드명은 j_username, j_password 이고 서브밋 URL 은 j_spring_security_check 이다. 또 폼 서브밋시에는 POST 방식을 사용해야 한다. 그렇지 않으면 UsernamePasswordAuthenticationFilter 가 로그인 요청을 거부할 것이다.
지금까지 설명한 내용을 바탕으로 login.jsp 를 작성하면 다음과 같다.
1
2
3
4
5
6
7
8
9
<head>
<title></title>
</head>
    <form action="j_spring_security_check" method="POST">
        ID : <input type="text" name="j_username" size="20" maxlength="50" /><br />
        Password : <input type="password" name="j_password" size="20" maxlength="50" /><br />
        <input type="submit" value="Login" />
    </form>

지금까지 개발한 내용을 서버에 배포한 후 브라우저에 http://localhost:8080 를 입력하면 login.jsp 로 리다이렉트할 것이고 login.jsp 가 제공하는 폼에 guest/guest 를 입력하면 정상적으로 로그인되는 것을 확인할 수 있을 것이다.

[출처:http://springsource.tistory.com/]

댓글 없음:

댓글 쓰기