권한에 따른 인증/인가 방식은 이전글을 참고하길 바란다
https://greed-yb.tistory.com/223
- Java 17
- Maven
- Spring Boot 3.0.3
- Spring Security 6.0.2
- Oracle 11g
- Mybatis
- IntelliJ Ultimate
- DBeaver
- Thymeleaf
config.class
import com.example.practice.security.filter.JwtAuthenticationFilter;
import com.example.practice.security.handler.WebAccessDeniedHandler;
import com.example.practice.security.handler.WebAuthenticationEntryPoint;
import com.example.practice.service.role.RoleService;
import com.example.practice.vo.RoleVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import java.util.ArrayList;
import java.util.List;
@EnableWebSecurity
@Configuration
public class WebSecurityConfig {
@Autowired
// 권한 정보를 가져오기 위한 코드, 페이지 체크 시 필요하면 본인 환경에 맞게 구현할것
private RoleService roleService;
// token 인증
private final JwtAuthenticationFilter jwtAuthenticationFilter;
public WebSecurityConfig(JwtAuthenticationFilter jwtAuthenticationFilter) {
this.jwtAuthenticationFilter = jwtAuthenticationFilter;
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// 화면에서 권한을 새로 생성할 경우에 따른 role 추가 //////////////
// 권한으로 페이지 체크가 필요 없다면 사용하지 x
List<RoleVo> vo = roleService.roleInfo();
List<String> arrList = new ArrayList<>();
for (int i = 0; i < vo.size(); i++) {
arrList.add(String.valueOf(vo.get(i).getRoleId()));
}
String[] roleArray = arrList.toArray(new String[arrList.size()]);
/////////////////////////////////////////
http
.csrf().disable();
http
.authorizeRequests()
.requestMatchers("/test").permitAll()
.requestMatchers("/","/denied","/bootstrap/**", "/upload/**", "/login", "/register", "/registerPost" , "/logout" , "/start" , "/stop" , "/uploadPath/**" , "/testtest/**", "/swagger-ui/**","/v3/api-docs").permitAll() // 해당 경로는 권한이 없어도 접속할 수 있다
// .requestMatchers("/권한이 필요한 페이지").hasAnyRole(roleArray) // 권한으로 페이지 체크 필요할 경우 - 내부적으로 ROLE_ 을 붙이기 때문에 ROLE_ 뒷부분만 적어준다 예) ROLE_MASTER -> MASTER
.anyRequest().authenticated()
.and()
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
// 로그아웃 - security logout 사용 x
http
.logout().disable();
// exception 처리
http
.exceptionHandling()
.accessDeniedHandler(new WebAccessDeniedHandler()) // 인가 권한이 없는 사용자 접근 시
.authenticationEntryPoint(new WebAuthenticationEntryPoint()); // 인증되지 않은 사용자 접근 시
return http.build();
}
}
Token 은 Token 대로 권한은 권한대로 체크하여 동작한다
권한에 따라 페이지 구분을 하려면 hasRole 추가 또는 hasAnyRole 의 주석을 풀어서 사용하면 된다
http.formLogin().... 의 login 부분은 따로 로직을 작성하였기에 제외하였고
http.logout().disable() 은 제외를 시키니 security logout 기능으로 계속 동작하여서 설정하였다
'개발 > Security' 카테고리의 다른 글
[SpringBoot] Security + JWT(Access , Refresh) - JwtAuthenticationFilter (0) | 2024.09.25 |
---|---|
[SpringBoot] Security + JWT(Access , Refresh) - JwtTokenUtil (0) | 2024.09.25 |
[SpringBoot] SecurityConfig - 동적 권한 체크 (0) | 2024.08.02 |
[SpringBoot] Security 로그인 인증, 인가(9) - 실행하기 (0) | 2023.04.30 |
[SpringBoot] Security 로그인 인증, 인가(8) - Controller (0) | 2023.04.30 |
댓글