일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 스프링부트
- SOP
- DB
- SSMS
- SQL Server 구성 관리자
- 자바
- Exception in thread "main" java.lang.Error
- ORM
- .NET 8.0
- 프로시저
- JavaScript
- IT
- IT story
- ERROR_MESSAGE
- git
- 데이터베이스
- RAISERRR
- 스프링 시큐리티
- springboot
- github
- Newtonsoft.Json
- System.Text.Json
- jpa
- OUT 파라미터
- C#
- 권한
- java
- MSSQL
- SQL Server
- cors
- Today
- Total
its_jh_stroy
[Springboot] Spring Security로 접근 권한 제어하기 본문
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>
'Java' 카테고리의 다른 글
[Java] Optional<T> 타입 (0) | 2024.07.25 |
---|---|
[Springboot] JPA에서 pagination 구현하기 (0) | 2024.07.21 |
[Springboot] Spring Security로 인증과 권한 부여 (0) | 2024.07.15 |
[Java] 프로젝트 만들자마자 ClassNotFoundException (0) | 2024.07.07 |
[Springboot] thymeleaf로 화면 레이아웃 구성하기 (0) | 2024.06.30 |