인프런 정수원님의 “스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security"를 보고 작성한 글입니다.
권한 설정
추가
스프링 시큐리티 5.4버전이후 코드이다.
유저를 추가하는 코드는 다음과 같다. 이때 password에 {noop}이라고 되어 있는것은 비밀번호를 암화화해서 처리하겠다는 의미이다.
@Bean
public UserDetailsManager userDetailsManager() {
UserDetails user = User.builder()
.username("user")
.password("{noop}1111")
.roles("USER")
.build();
UserDetails sys = User.builder()
.username("sys")
.password("{noop}1111")
.roles("SYS")
.build();
UserDetails admin = User.builder()
.username("admin")
.password("{noop}1111")
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(user, sys, admin);
}
특정 경로에 대해 인가 설정하는 코드이다.
// 스프링 시큐리티 5.4에 맞춘 강의 예제
http.authorizeHttpRequests(authorizeHttpRequests ->
authorizeHttpRequests
// /user 경로: 'USER' 역할이 있는 사용자만 접근 가능
.requestMatchers("/user").hasRole("USER")
// /admin/pay 경로: 'ADMIN' 역할이 있는 사용자만 접근 가능
.requestMatchers("/admin/pay").hasRole("ADMIN")
// /admin/** 경로: 'ADMIN' 또는 'SYS' 역할이 있는 사용자만 접근 가능
.requestMatchers("/admin/**").hasAnyRole("ADMIN", "SYS")
// 모든 다른 요청: 인증된 사용자만 접근 가능
.anyRequest().authenticated());
다른 블로그나 강의에서 access, antMatchers를 사용하는 글들이 많아서 다음과 정리를 해놓는다.
(1) access
스프링 시큐리티에서 authorizeRequests가 deprecate되면서 hasRole('ADMIN') or hasRole('SYS')에 인자로 문자열만 받을 수 있게 되었습니다.
이로 인해 특정 경로에 대한 인가를 2개 이상의 role에 주고 싶을시 hasAnyRole을 사용해야 합니다.
(2) antMatchers
deprecate된 authorizeRequests 대신 스프링에서 사용을 권장하는 authorizeHttpRequests를 사용한 사용자별 인가를 설정하는 코드입니다.
// 스프링 시큐리티 5.4에 맞춘 강의 예제http
.authorizeHttpRequests(authorizeHttpRequests ->
authorizeHttpRequests
.requestMatchers("/user").hasRole("USER")
.requestMatchers("/admin/pay").hasRole("ADMIN")
.requestMatchers("/admin/**").hasAnyRole("ADMIN", "SYS")
.anyRequest().authenticated());