다른 부가기능 들을 사용해보기 위해
메인페이지 생성및 커스터마이징 로그인페이지를 만들어 보도록 하겠습니다.


loginPage.jsp

UI는 신경쓰지 않고 기능에 집중하기 위해 다른 프론트엔드 프레임워크는 사용하지 않았습니다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<form action="${pageContext.request.contextPath}/login" method="post">

    <input type="text" name="loginId" placeholder="ID">

    <input type="password" name="loginPwd" placeholder="Password">

    <input name="${_csrf.parameterName}" type="hidden" value="${_csrf.token}"/>

    <button type="submit">로그인</button>
</form>


</body>
</html>

security-context.xml

        <http auto-config="true" use-expressions="true">
            <intercept-url pattern="/userPage" access="hasRole('ROLE_USER')"/>
            <intercept-url pattern="/**" access="permitAll"/>

            <form-login
                username-parameter="loginId"
                password-parameter="loginPwd"
                login-processing-url="/login"
                login-page="/loginPage"
                default-target-url="/"
                />
          <!-- 로그아웃할 url 및 로그아웃성공시 이동할 url -->
          <logout logout-url="/logout" logout-success-url="/" />
        </http>
  • use-expressions
    intercept-url의 access 속성에 표현식을 사용할 수 있다는 뜻입니다.
    이 값이 "false"이면 access="USER" 로 값을 바로 사용해야 합니다.

  • access="permitAll"
    모든 페이지에 모든 사용자를 허용한다.

  • access="hasRole('ROLE_USER')"
    /userPage에는 ROLE_USER 권한을 가진 사용자만 접근가능

  • username-parameter="loginId"
    form에서 ID로 쓰인 name값 ( 기본값 : username )

  • password-parameter="loginPwd"
    form에서 PW로 쓰인 name값 ( 기본값 : password )

  • login-processing-url="/login"
    로그인을 처리할 url ( form에서의 action 값 ) ( 기본값 : POST /login )

  • login-page="/loginPage"
    로그인 페이지로 쓸 url ( 기본값 : 스프링 기본 로그인 페이지 )

  • default-target-url="/"
    로그인 성공시 이동시킬 url


LoginController.java

  package com.lec.security;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class LoginController {

    @RequestMapping(value="/loginPage")
    public String loginPage() throws Exception{
        return "loginPage";
    }
}

HomeController.java

package com.lec.security;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info("Welcome home! The client locale is {}.", locale);

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);

        model.addAttribute("serverTime", formattedDate );

        return "main";
    }
}

main.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>


<html lang="ko">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

    <p>현재시간 ${serverTime}</p>

    <!-- 로그인중이 아닐 때에만 Login 버튼이 보임  -> taglib ( security/tags ) 때문에 가능 -->
    <sec:authorize access="isAnonymous()">
         <a href='${pageContext.request.contextPath}/loginPage/'>Login</a>
    </sec:authorize>

    <!-- 로그인 중일 경우에만 Logout 버튼이보임 -->
    <sec:authorize access="isAuthenticated()">
        <form action="${pageContext.request.contextPath}/logout" method="POST"> 
            <input id="logoutBtn" type="submit" value="Logout" />
            <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}">
        </form>
    </sec:authorize>
</body>
</html>