본문 바로가기

Spring security

스프링 시큐리티 기본 API 및 Filter 이해 - 권한설정과 표현식

인프런 정수원님의 “스프링 시큐리티 - 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());