본문 바로가기
개발 Story/spring-security

02. spring security 사용자 정의 로그인 페이지 적용

by niee 2015. 9. 3.


지난 포스팅에서는 로그인화면과 처리를 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​