its_jh_stroy

[Springboot] Spring Security로 접근 권한 제어하기 본문

Java

[Springboot] Spring Security로 접근 권한 제어하기

_J_H_ 2024. 7. 18. 01:09

Spring Security를 통해 인증된 사용자 권한을 기반으로 프로그램을 제어할 수 있다.

권한 제어를 위해서는 인증 기능이 구현되어야 하므로 아래 포스팅 소스에 이어서 작성할 것이다.

[Springboot] Spring Security로 인증과 권한 부여 (tistory.com)

 

[Springboot] Spring Security로 인증과 권한 부여

Spring Security에 대해 공식 문서에서는 아래와 같이 정의한다.Spring Security is a powerful and highly customizable authentication and access-control framework. It is the de-facto standard for securing Spring-based applications. 커스

itsjhstory.tistory.com

 

권한을 검사하는 방법은 세 가지가 있다.

- PreAuthorize 어노테이션

- Authentication 객체 활용

- 화면에서 검사하기(thymeleaf 사용)

 

PreAuthorize 어노테이션으로 접근 관리하기

PreAuthorize 어노테이션을 사용하기 위해서는 Spring Security 설정 파일에 EnableMethodSecurity 어노테이션을 추가해야 한다.

 

SecurityConfig.java

@Configuration
@EnableWebSecurity 
@EnableMethodSecurity(prePostEnabled = true) // 추가된 어노테이션
public class SecurityConfig {
    // ...
}

 

 

만약 /mypage 경로에 대해 접근을 제어하고 싶다면 아래와 같이 처리할 수 있다.

- @PreAuthorize("isAuthenticated()")

    - 인증된 사용자만 접근 가능

    - 인증되지 않았는데 접근하면 인증 페이지로 이동

- @PreAuthorize("hasAuthority('ROLE_ADMIN')")

    - ROLE_ADMIN 권한이 있는 사용자만 접근 가능

    - 권한 부여에 관해서는 loadUserByUsername 메서드 참고

    - 권한이 없는데 접근하면 403 오류 발생

두 어노테이션은 동시에 사용할 수 없다.

MyUserController.java

// @PreAuthorize("isAuthenticated()") 
@PreAuthorize("hasAuthority('ROLE_ADMIN')")
@GetMapping("/my-page")
public String myPage() {
	return "mypage.html";
}

 

 

Authentication 객체로 접근 제어하기

핸들러 메서드에서 Authentication 타입 매개 변수를 받아 처리하는 방식이다.

인증이 되지 않았다면 null이 들어간다.

아래는 Authentication 타입이 가지는 몇 가지 메서드이다.

- isAuthenticated()

    - 인증 여부 반환(true, false)

- getPrincipal()

    - loadUserByUsername 메서드가 반환하는 객체 정보 반환

    - ex) User user = (User)auth.getPrincipal();

 

MyUserController.java

@GetMapping("/my-page")
public String myPage(Authentication auth) {       
	if (auth != null && auth.isAuthenticated()) {
		// 인증된 사용자에 대한 처리
		User user = (User)auth.getPrincipal();
		System.out.println(user.getUsername());     // admin
		System.out.println(user.getAuthorities());  // [ROLE_ADMIN]
		return "mypage.html";
	} else {
		// 인증되지 않은 사용자에 대한 처리
		// 인증 후 로그아웃 상태의 경우 auth가 null이 아님
		return "login.html";
	}
}

 

 

화면에서 검사하기(thymeleaf 사용)

mypage.html

<!-- admin -->
<div sec:authentication="principal.username"></div> 
<!-- 권한 여부 == 표시 여부 -->
<div sec:authorize="hasAuthority('일반유저')">hello</div> 
<!-- 인증 여부 == 표시 여부 -->
<div sec:authorize="isAuthenticated()">world</div>