Spring Security_로그인 기능 구현/Spring Security Basic

로그인 기능_Spring Security 기본편 (7)

김쟈워니 2024. 10. 11. 10:38

Spring Security 기본편 (6) 에서 배운 것

  1. DB 기반 로그인 검증 로직 구현
    • UserDetailService와 UserDetails 커스텀:
      • Spring Security의 기본 인터페이스인 UserDetailService와 UserDetails를 데이터베이스 스키마에 맞게 커스텀하여 로그인 검증 로직을 구현.
      • 데이터베이스에서 사용자 정보와 권한을 조회하여 인증 처리.
    • 비밀번호 암호화:
      • BCryptPasswordEncoder를 @Bean으로 등록하여 사용자의 비밀번호를 암호화하고, 로그인 시 암호화된 비밀번호를 비교하는 방식으로 검증
  2. 권한 부여:
    • 로그인한 사용자의 권한에 따른 접근 제어:
      • 데이터베이스에서 사용자의 권한 정보를 가져와 필요한 페이지와 리소스에 대한 접근 권한을 부여.
      • SecurityConfig에서 DB에 저장된 권한 정보를 기반으로 접근 제어 로직을 구성하여 **역할(Role)**에 따라 페이지 접근을 제한.

세션 정보 웹 브라우저로 보내기

HomeController.java

package com.jw.SpringSecurityBasic.controller;

import java.util.Collection;
import java.util.Iterator;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {
	@GetMapping("/")
	public String Home(Model model) {
		
    	// 시큐리티 컨텍스트에서 현재 인증된 사용자 ID(유저네임) 가져오기
    	String id = SecurityContextHolder.getContext().getAuthentication().getName();
    	
    	// 뷰에 전달할 사용자 ID를 "id" 속성에 추가
    	model.addAttribute("id", id);
    	
    	// 시큐리티 컨텍스트에서 현재 인증된 사용자 권한(roles) 가져오기
    	Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    	Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
    	
    	// 인증된 사용자 권한 중 첫 번째 권한 가져오기 (여러 권한이 있을 경우 첫 번째 권한 사용)
    	Iterator<? extends GrantedAuthority> iter = authorities.iterator();
    	GrantedAuthority auth = iter.next();
    	String role = auth.getAuthority();

    	
    	
    	// 뷰에 전달할 사용자 권한(roles)을 "role" 속성에 추가
    	model.addAttribute("role", role);
    	
    	System.out.println("ID: " + id);
    	System.out.println("Role: " + role);
    	
		
		
		return "index";

	}
}

 

  • 컨트롤러에서 Model 사용:
    • Spring MVC의 Model 인터페이스를 사용하여 컨트롤러에서 뷰로 데이터를 전달.
    • 사용자의 인증 정보를 SecurityContextHolder에서 가져와 뷰로 전달.
  • 세션 정보 추출:
    1. 사용자 ID:
      • SecurityContextHolder.getContext().getAuthentication().getName()을 통해 현재 인증된 사용자의 **ID(유저네임)**를 가져옴.
    2. 사용자 권한(roles):
      • Authentication.getAuthorities()를 사용하여 사용자의 권한을 가져옴.
      • 여러 권한이 있을 경우 첫 번째 권한을 선택하여 처리.

 

4. index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <span>Spring Security Basic with JSP 연습용</span><br>
    
    <!-- Model 속성에서 가져온 id와 role 출력 -->
    <span>사용자 ID: ${id}</span><br>
    <span>사용자 권한: ${role}</span>
</body>
</html>

선택한 템플릿엔진의 방식을 활용하여 표시하기 JSP 의 경우 jstl 문법을 사용

 

전체 과정 요약

  • 컨트롤러에서 Model을 통해 세션 정보(사용자 ID 및 권한)를 뷰로 전달하여, JSP 페이지에서 사용자 정보를 표시.
  • 사용자 ID는 SecurityContextHolder에서 가져오며, 권한 정보는 GrantedAuthority를 통해 추출.
  • JSP 페이지에서 JSTL을 사용하여 모델에 저장된 데이터를 출력하여, 로그인된 사용자 정보와 권한을 브라우저에 표시.