지난 포스팅에서는 로그인화면과 처리를 spring security에서 설정한 기본 페이지로 작업을 했다.
하지만 실제로 저 기본 페이지로 사용하려는 곳은 거의 없을 것이다.
이번엔 사용자가 직접 작성한 로그인폼을 이용하여 인증처리를 해보도록 하겠다.
1.로그인 페이지 작성 (WEB-INF/views/user/loginPage.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <link rel="stylesheet" type="text/css" href="<c:url value="/resources/css/main.css"/>"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action='<c:url value="/user/login"/>' method="post"> <input type="text" name="email" id="email"/> <input type="password" name="passwd" id="passwd"/> <input type="submit" value="완료"> </form> </body> </html>
2.로그인 페이지 이동을 위한 user패키지 및 컨트롤러 생성
package com.min.study.user.web; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class UserController { private static final Logger logger = LoggerFactory.getLogger(UserController.class); @RequestMapping("/user/loginPage") public String loginPage(){ return "/user/loginPage"; } }
3.security-context.xml의 <http>를 수정
<http auto-config="true" use-expressions="true"> <intercept-url pattern="/user/**" access="permitAll" /> <intercept-url pattern="/**" access="hasRole('ROLE_USER')" /> <form-login login-page="/user/loginPage" login-processing-url="/user/login" always-use-default-target="true" default-target-url="/" username-parameter="email" password-parameter="passwd" /> </http>
4.서버 재시작 후 직접 작성한 로그인 페이지가 뜨는지 확인 & 로그인 확인
이번 포스팅의 변경 부분 설명
<http auto-config="true" use-expressions="true"> <intercept-url pattern="/user/**" access="permitAll" /> <intercept-url pattern="/**" access="hasRole('ROLE_USER')" /> <form-login login-page="/user/loginPage" login-processing-url="/user/login" username-parameter="email" password-parameter="passwd" /> </http>
1.use-expressions="true" : spring security 의 표현식 언어 사용 여부 (각 속성의 access에 사용)
ex)hasRole('권한'), hasAnyRole('권한','권한'),hasIpAddress(ip)
그외 기타 aceess롤
permitAll : 모든 접근자 승인
denyAll : 모든 접근 거부
anonymous,authenticated ,rememberMe ,fullyAuthenticated <-- 정확히 모르겠음
2.<intercept-url pattern="/user/**" access="permitAll" /> : /user/** url은 인증에 상관없이 모든 사용자가 접근가능
3.<intercept-url pattern="/**" access="hasRole('ROLE_USER')" /> : /** 모든 접근은 ROLE_USER의 권한을 가진 사용자만 접근 가능함
*)2번과 3번의 경우 3번에서 모든 url요청에관해 ROLE_USER권한을 가진 사용자만 접근 가능하게 했는데 /user/**의 접근은 모두 가능 하게 하는 부분이다 만약 2번이 없거나 3번의 아래 위치하면 순환 리다이렉트 에러페이지가 나올것이다. 따라서 권한의 부여는 최상위 부분에서 적용한 순서대로 진행 된다는걸 알 수 있다.
3. <form-login login-page="/user/loginPage"
login-processing-url="/user/login"
always-use-default-target="true"
default-target-url="/"
username-parameter="email" password-parameter="passwd" />
- 사용자 정의 form을 이용하여 login을 진행 한다. login-page주소는 /user/loginPage 이고
로그인 인증을 처리할 주소는/user/login 이다.
(form을 submit할때 action의 주소지만 이주소로 요청이 들어오면 spring security에서 가로채서 인증을 수행한다. 따라서 사용자가 /user/login 의 주소를 따로 정의 하지 않아도 된다.)
username 파라메터의 이름은 email이고 password파라메터 이름은 passwd이다.
로그인이 완료되면 항상 default-target-url="/" 로 이동하겠다.
소스 확인 : https://github.com/ParkMinKyu/security