Spring/Spring Security

[Spring Security] 유저별 권한 설정

빅콜팝 2022. 10. 28. 23:51
728x90
반응형

1. 표현식


메소드 동작
authenticated() 인증된 사용자의 접근을 허용
fullyAuthenticated() 인증된 사용자의 접근을 혀용, rememberMe(로그인 상태유지) 인증 제외
permitAll() 무조건 접근 허용
denyAll() 무조건 접근 허용하지 않음
anonymous() 익명 사용자만 접근 허용 (인증된 사용자는 접근 불가)
rememberMe() 기억하기를 통해 인증된 사용자의 접근 허용
access(String) 주어진 SpEL 표현식의 평가 결과가 true이면 접근을 허용
hasRole(String) 사용자가 주어진 역할이 있다면 접근을 허용 -> ex) USER
hasAuthority(String) 사용자가 주어진 권한이 있다면 접근을 허용 -> ex) ROLE_USER
hasAnyRole(String...) 사용자가 주어진 권한이 있다면 접근을 허용 (AND)
hasAnyAuthority(String...) 사용자가 주어진 권한 중 어떤 것이라도 있다면 접근을 허용 (OR)
hasOpAddress(String) 주어진 IP로부터 요청이 왔다면 접근을 허용

 

2. 권한 설정(URL )


http.antMatchers("/users/**").hasRole("ROLE_REMP")
import lombok.RequiredArgsConstructor;
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.WebSecurityCustomizer;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@RequiredArgsConstructor
public class SecurityConfig {

	...

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        
        ...

        http.antMatcher("/shop/**") // 생략 시 전체경로 "/**"
                .authorizeRequests()
                .antMatchers("/shop/login/**").permitAll()
                .antMatchers("/shop/mypage").hasRole("ROLE_USER")
                .antMatchers("/shop/admin/pay").access("hasROLE('ROLE_REMP')")
                .antMatchers("/shop/adminPay/**").access("hasRole('ROLE_ADMIN') or hasRole('SYS')")
                .anyRequest().authenticated();
       
       // 설정 시 구체적인 경로가 먼저 오고 그것 보다 큰 범위의 경로가 뒤에 오도록 설정 해야 함.
      
        return http.build();
    }

	...

}

 

3. 권한 설정(Method, Controller)


@PreAuthorize("hasRole('USER')") // 해당 컨트롤러의 최소 권한은 USER
@Controller
public class MemberController {

    @PreAuthorize("hasRole('REMP')") // 해당 메서드의 최소 권한은 REMP
    public void rempPage(){
        System.out.println("REMP 이상의 권한을 가진 사용자만 접근 가능");
    }
    
}

                   

Reference 

https://www.inflearn.com/course -> 11) 권한설정과 표현식

728x90
반응형