티스토리 뷰
Spring Security : Web MVC + Security - Logout 기능 구현
Korean Eagle 2020. 5. 17. 02:341. Spring security의 Logout은 logout 시키고 login 페이지로 돌아간다.
1-0 세부적으로 설명하면,
1-1 Http session을 무효화하고 session cookies를 삭제한다.
1-2 사용자를 로그인 화면으로 전환시킨다.
1-3 /logout 뒤에 ?logout parameter가 붙여진다.
2. 구현 순서는
2-1 Security Config에 Logout에 대한 기능 설정을 하고
2-2 jsp 페이지에 logout 버튼이나 링크를 추가한다.
2-3 로그인 화면 jsp에 logout 메시지를 추가한다.
3. Security Config에 Logout 설정하기
3-1 마지막 줄에 보면 logout().permitAll() 이 지정되어 있다.
3-1-1 logout()은 로그아웃을 처리할 url이다. parameter가 없는 경우는 기본값 "/logout"이 설정 된다.
3-1-2 permitAll()은 모든 사용자가 이 url을 사용할 수 있다는 의이다.
package pe.pilseong.springsecurity.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.User.UserBuilder;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
  
  @Override
  protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    UserBuilder users = User.withDefaultPasswordEncoder();
    
    auth.inMemoryAuthentication()
      .withUser(users.username("pilseong").password("pilseong").roles("EMPLOYEE"))
      .withUser(users.username("suel").password("suel").roles("MANAGER"))
      .withUser(users.username("noel").password("noel").roles("ADMIN"));
  }
  
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .anyRequest().authenticated()
      .and()
      .formLogin()
        .loginPage("/showLoginPage")
        .loginProcessingUrl("/authenticateUser")
        .permitAll()
      .and()
      // logout with no parameter는 기본적으로 /logout으로 매핑한다. 
      .logout().permitAll();
  }
}
4. Logout 버튼 추가
4-1 HomeController.java에 "/"로 접근 시 표출되는 home.jsp 파일에 추가 하였다.
4-2 context root로 접속을 시도하고 로그인 인증이 완료되면 표시된다.
4-3 logout form은 form taglib를 사용하였고, POST를 반드시 사용하여야 한다.
4-3-1 처리 url은 SecurityConfig에서 설정된 기본값 logout과 일치시킨다.
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet"
  href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"
  integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
  crossorigin="anonymous">
<title>Spring Security Custom Logout Form</title>
</head>
<body>
  <p>You are now logged in</p>
  <form:form action="${ pageContext.request.contextPath }/logout" method="POST">
    <input type="submit" class="btn btn-primary" value="Logout"/>
  </form:form>
</body>
</html>
4-4 로그아웃 버튼 표출 화면

5. Login 페이지에 logout 메시지 보여주기
5-1 logout이 정상적으로 실행되면 showLoginPage 뒤에 ?logout 이라는 parameter가 붙게 된다.
5-2 아래 코드는 단순히 ?logout parameter의 존재에 따라 메시지를 표출해 주는 부분만 추가했다.
5-3 http://localhost:8080/springsecurity/showLoginPage?logout 이 url이 된다.
  <div class="container">
    <div class="card" style="width: 350px; margin-left: auto; margin-right: auto; border: none;">
      <h1 class="display-4">Please Login</h1>
      <form:form action="${pageContext.request.contextPath}/authenticateUser" method="POST">
        <div class="form-group">
          <label for="username">Username</label> 
          <input type="text" id="username" name="username" class="form-control" />
        </div>
        <div class="form-group">
          <label for="password">Password</label>
          <input type="password" id="password" name="password" class="form-control">
          <c:if test="${ param.error != null }">
            <small id="passwordHelpBlock" class="form-text text-warning">
              Sorry! You entered invalid username/password.
            </small>
          </c:if>          
          <c:if test="${ param.logout != null }">
            <small id="passwordHelpBlock" class="form-text text-info">
              You have been logged out.
            </small>
          </c:if>          
        </div>  
        <input type="submit" value="Login" class="btn btn-primary">
      </form:form>
    </div>
  </div>
5-4 결과 화면

6. 스프링 보안은 자체적으로 logout을 작성하지 않아도 기본 logout기능을 제공한다.
6-1 SecurityConfig에 logout을 명시하지 않아도 /logout 경로에 진입하면 미리 정의된 로그아웃페이지가 나온다.
6-2 그냥 이것을 사용해도 무방하다. 어디서든 /logout링크를 걸어주면 된다.

6-3 예전에는 로그아웃을 위해 별도의 controller을 작성했었다. 아래를 참고한다.
package pe.pilseong.steps.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class LogoutController {
  
  @GetMapping(value="/logout")
  public String logout(HttpServletRequest request, HttpServletResponse response) {
      Authentication auth = SecurityContextHolder.getContext().getAuthentication();
      if (auth != null && auth.isAuthenticated()) {
        new SecurityContextLogoutHandler().logout(request, response, auth);
      }
      return "redirect:/";
  }
  
}'Spring > Spring Security' 카테고리의 다른 글
| Spring Security : Web MVC + Security - Landing Page 사용하기 (0) | 2020.05.17 | 
|---|---|
| Spring Security : Web MVC + Security - Security JSP Tag Library 사용하기 (0) | 2020.05.17 | 
| Spring Security : Web MVC + Security - CSRF token 다루기 (0) | 2020.05.17 | 
| Spring Security : Web MVC + Security - Custom Login Form 만들기 (0) | 2020.05.16 | 
| Spring Security : Web MVC + Security with Java Config 설정하기 (0) | 2020.05.16 | 
- Total
 
- Today
 
- Yesterday
 
- 도커 개발환경 참고
 - AWS ARN 구조
 - Immuability에 관한 설명
 - 자바스크립트 멀티 비동기 함수 호출 참고
 - WSDL 참고
 - SOAP 컨슈머 참고
 - MySql dump 사용법
 - AWS Lambda with Addon
 - NFC 드라이버 linux 설치
 - electron IPC
 - mifare classic 강의
 - go module 관련 상세한 정보
 - C 메모리 찍어보기
 - C++ Addon 마이그레이션
 - JAX WS Header 관련 stackoverflow
 - SOAP Custom Header 설정 참고
 - SOAP Custom Header
 - SOAP BindingProvider
 - dispatcher 사용하여 설정
 - vagrant kvm으로 사용하기
 - git fork, pull request to the …
 - vagrant libvirt bridge network
 - python, js의 async, await의 차이
 - go JSON struct 생성
 - Netflix Kinesis 활용 분석
 - docker credential problem
 - private subnet에서 outbound IP 확…
 - 안드로이드 coroutine
 - kotlin with, apply, also 등
 - 안드로이드 초기로딩이 안되는 경우
 - navigation 데이터 보내기
 - 레이스 컨디션 navController
 - raylib
 
- Spring Security
 - crud
 - one-to-one
 - Security
 - 자바
 - 상속
 - 설정하기
 - WebMvc
 - Rest
 - 스프링
 - RestTemplate
 - hibernate
 - 매핑
 - Angular
 - 하이버네이트
 - form
 - MYSQL
 - 설정
 - login
 - jsp
 - 로그인
 - one-to-many
 - spring boot
 - Spring
 - Many-To-Many
 - Validation
 - 외부파일
 - mapping
 - 스프링부트
 - XML