02. spring security 사용자 정의 로그인 페이지 적용
Written by niee on
-
지난 포스팅에서는 로그인화면과 처리를 spring security에서 설정한 기본 페이지로 작업을 했다. 하지만 실제로 저 기본 페이지로 사용하려는 곳은 거의 없을 것이다. 이번엔 사용자가 직접 작성한 로그인폼을 이용하여 인증처리를 해보도록 하겠다.
-
로그인 페이지 작성
(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>
- 로그인 페이지 이동을 위한 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";
}
}
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>
- 서버 재시작 후 직접 작성한 로그인 페이지가 뜨는지 확인 & 로그인 확인
이번 포스팅의 변경 부분 설명
<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>
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번의 아래 위치하면 순환 리다이렉트 에러페이지가 나올것이다. 따라서 권한의 부여는 최상위 부분에서 적용한 순서대로 진행 된다는걸 알 수 있다.
<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="/"
로 이동하겠다.
Comments