[ODOP] 78일차 - Spring security 권한 설정 및 표현식
💡
최신 버전에서는 아래의 방식과는 조금 다르게 권한설정을 진행한다.
아래의 설명들은 모두 구버전(2.6.7)을 기준으로 설명하고 있다
아래의 설명들은 모두 구버전(2.6.7)을 기준으로 설명하고 있다
권한 설정 전략
선언적 방식
URL
http.antMatchers("/users/**").hasRole("USER")
Method
@PreAuthorize("hasRole('USER')")
public void user() {
System.out.println("user");
}
동적 방식 (DB연동)
- URL
- Method
선언적 권한 설정 - URL
설정 방법
private void roleConfigure(HttpSecurity http) throws Exception {
// 주의사항 : 설정 시 구체적인 경로가 먼저 오고 그것 보다 큼 범위의 경로가 뒤에 오도록 해야 한다
http.antMatcher("/shop/**") // 아래의 해당 보안 속성을 설정할 기준
.authorizeRequests()
.antMatchers("/shop/login", "/shop/users/**").permitAll()
.antMatchers("/shop/mypage").hasRole("USER")
.antMatchers("/shop/admin/pay").access("hasRole('ADMIN')")
.antMatchers("/shop/admin/**").access("hasRole('ADMIN') or hasRole('SYS')")
.anyRequest()
.authenticated()
;
}| 메소드 | 설명 |
|---|---|
| authehticated() | 인증된 유저의 접근을 허용 |
| fullyAuthenticated() | 인증된 유저의 접근을 허용, remember-me 제외 |
| permitAll() | 무조건 접근을 허용 |
| denyAll() | 무조건 접근을 차단 |
| anonymous() | 익명유저의 접근을 허용 |
| rememberMe() | remember-me 를 통해 인증된 사용자의 접근을 허용 |
| access(String) | 주어진 SpEL 표현식의 평과 결과가 true 이면 접근을 허용 |
| hasRole(String) | 유저가 주어진 권한이 있다면 접근을 허용 |
| hasAuthority(String) | 특정 (ROLE_ 접두사가 붙은)권한이 있다면 접근 허용 |
| hasAnyRole(String...) | 특정 권한들중 하나라도 일치하면 접근 허용 |
| hasAnyAuthority(String...) | 특정 (ROLE_ 접두사가 붙은)권한들중 하나라도 일치하면 접근 허용 |
| hasIpAddress(String) | 특정 IP로부터 요청이 왔다면 접근 허용 |
예제
사용자 생성 및 권한 부여
사용자를 생성하고 권한을 부여할 수 있다
이 기능은 Spring Security 에서 지원하는 configure(AuthenticationManagerBuilder) 를 통해 사용할 수 있다
사용 방법:
@Override
protected void configure(AuthenticationManagerBuilder auth) throw Exception {
auth.inMemoryAuthentication()
.withUser("user")
.password("{noop}1111")
.roles("USER")
;
}
위 코드에서 password 를 보면 "{noop}1111" 이라고 적혀있는 모습을 확인할 수 있다.
이는 패스워드 인코딩 이라고 하며 스프링 시큐리티에서 지원하는 패스워드 암호화 컴포넌트를 통해 이루어진다.
만약 이를 지정해주지 않고 비밀번호만 입력 한다면 id 가 지정되지 않았다는 오류가 발생한다.
따라서 암호화를 사용하지 않는 경우 해당 접두사({noop}) 을 꼭 작성해야 한다
{noop}: 암호화를 적용하지 않는다