HttpServletRequest - Role 기반 인가
- Spring Security는 요청 레벨에서 인가 처리를 할 수 있도록 해준다.
ex. /admin 에 대한 요청은 인증처리가 되있어야 한다.
- Security 설정 파일에 요구사항에 맞도록 각 URL 에 대한 Role(사용자의 역할) 기반 인가 처리를 수행
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
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()
.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;
@PreAuthorize("hasAuthority('AUTHORITY_ADMIN')")
@DeleteMapping("/{ingredient-id}")
public ResponseEntity<?> deleteIngredient(
@PathVariable("ingredient-id") Long ingredientId
) {...}
}