• 지난 포스팅에서는 로그인화면과 처리를 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>
  • 서버 재시작 후 직접 작성한 로그인 페이지가 뜨는지 확인 & 로그인 확인

img1

img2


이번 포스팅의 변경 부분 설명

<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="/" 로 이동하겠다. ​

소스 확인 : https://github.com/ParkMinKyu/security​