본문 바로가기
개발/Security

[SpringBoot] Security + JWT(Access , Refresh) - SecurityConfig

by 코딩하는 흰둥이 2024. 9. 25.

권한에 따른 인증/인가 방식은 이전글을 참고하길 바란다

https://greed-yb.tistory.com/223

 

[SpringBoot] Security 로그인 인증, 인가(1) - 환경설정

Java 17MavenSpring Boot 3.0.3Spring Security 6.0.2Oracle 11gMybatisIntelliJ UltimateDBeaverThymeleaf 폴더 구조더보기 Security 한번 구현해보겠다고 일주일 내내 작업한거 같다거의 대부분의 예제들은 3.0.0 이하의 버전

greed-yb.tistory.com

 

 

 

  • 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 기능으로 계속 동작하여서 설정하였다

댓글