Spring Security - 인가 처리 (구현)

이유석·2024년 11월 22일
1

Spring-Security

목록 보기
8/10
post-thumbnail

HttpServletRequest - Role 기반 인가

  • Spring Security는 요청 레벨에서 인가 처리를 할 수 있도록 해준다.
    ex. /admin 에 대한 요청은 인증처리가 되있어야 한다.
  • Security 설정 파일에 요구사항에 맞도록 각 URL 에 대한 Role(사용자의 역할) 기반 인가 처리를 수행
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
		
		// JWT 관련 처리를 수행하는 Util 클래스
		private final JwtProvider jwtProvider;
		
		@Bean
    AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
        return authenticationConfiguration.getAuthenticationManager();
    }
		
		@Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {

        http.cors(withDefaults());
        http.csrf(AbstractHttpConfigurer::disable);

        http.sessionManagement((sessionManagement) -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS));

				// 권한 처리 수행
				http.authorizeHttpRequests((authorizeRequests) ->
                authorizeRequests
                        .requestMatchers("/user", "/user/logout", "/user/password", "/user/password/email-link", "/user/email-notification").authenticated()
                        .requestMatchers("/user/**").permitAll()  // 로그인 및 re-issue JWT AccessToken 검증 X
                        .requestMatchers("/customer/**", "/drawing/**").hasRole("CUSTOMER")
                        .requestMatchers("/factory/**").hasRole("FACTORY")
                        .anyRequest().authenticated()
        );
        
        http.addFilterBefore(new JwtAuthFilter(jwtProvider), UsernamePasswordAuthenticationFilter.class);

        return http.build();

    }
    
    @Bean
    public CorsConfigurationSource corsConfigurationSource() {...}
}

Method Security - Authority 기반 인가

  • 각 API 메서드에 요구사항에 맞도록 Authority (사용자의 권한)기반 인가 처리 수행
@RequiredArgsConstructor
@RequestMapping("/factory/ingredient")
@RestController
public class IngredientAPI {

	private final IngredientService ingredientService;

	// ADMIN 권한을 갖고있는 사용자만 자재를 삭제할 수 있다.	
	@PreAuthorize("hasAuthority('AUTHORITY_ADMIN')")
  @DeleteMapping("/{ingredient-id}")
  public ResponseEntity<?> deleteIngredient(
        @PathVariable("ingredient-id") Long ingredientId
  ) {...}
}
profile
소통을 중요하게 여기며, 정보의 공유를 통해 완전한 학습을 이루어 냅니다.

0개의 댓글