[ODOP] 78일차 - Spring security 권한 설정 및 표현식
![[ODOP] 78일차 - Spring security 권한 설정 및 표현식](/content/images/size/w1200/2023/08/-----2023-08-01----10.29.26-11.png)
💡
최신 버전에서는 아래의 방식과는 조금 다르게 권한설정을 진행한다.
아래의 설명들은 모두 구버전(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}
: 암호화를 적용하지 않는다