권한 설정
권한 설정은 선언적 방식과 동적 방식으로 나뉜다
선언적 방식
선언적방식은 URL과 Method로 나뉜다.
• URL
- http.antMatchers("/users/**"). hasRole(“USER")
• Method
- @PreAuthorize(“hasRole(‘USER’)”) public void user(){ System.out.println(“user”)}
동적 방식 – DB 연동 프로그래밍
• URL
• Method
지금은 선언적 방식의 URL방식을 다뤄 보겠습니다.
적용
@Override
protected void configure(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()
}
antMachar(). authorizeRequests() 하위 경로는 인가 심사를 하겠다.
- . antMatchers(“/shop/login”, “/shop/users/**”). permitAll() : 이 경로에 대해서는 permitAll() : 모든 요청을 허용하겠다.
- . antMatchers(“/shop/mypage”). hasRole(“USER”) /shop/mypage 요청에 대해서는 권한이 USER인 회원만 가능하다.
- . antMatchers("/shop/admin/pay"). access("hasRole('ADMIN')"); /shop/admin/pay 요청에 대해서는 어드민 권한만 허용된다
- . antMatchers("/shop/admin/**"). access("hasRole('ADMIN') or hasRole(‘SYS ')"); /shop/admin/** 에 대해서는 어드민 과 SYS 만 허용된다.
- . anyRequest(). authenticated() 이 외에 다른 요청에 대해서는 인가 심사를 하겠다.
설정할 때에는 구체적인 경로가 먼저 오고 넓은 경로는 뒤에 와야 한다.
예를 들어
1. /admin/** 에는 admin만 가능하고
2. /admin/shop/ 에는 admin과 sys가 접근 가능하다고 하면
스프링 시큐리티는 인가 처리를 할 때 위에서부터 아래로 해석하기 때문에
1번을 위에 작성할 시에 2번은 1번에 포함되는 경로 이므로 2번 인가 심사는 아예 안 하게 됩니다. 그래서 구체적인 2번을 위에 적고 그다음에 1번을 적어주어야 합니다.
표현식
그럼 지금부터 DB와 연동하기 전에 사용자를 생성해서 테스트해보겠습니다.
WebSecurityConfigurerAdater를 상속받은 SecurityConfig 클래스에서 다음과 같이 해줍니다.
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("user").password("{noop}1111").roles("USER");
auth.inMemoryAuthentication().withUser("sys").password("{noop}1111").roles("SYS");
auth.inMemoryAuthentication().withUser("admin").password("{noop}1111").roles("ADMIN");
}
이러면 메모리에서 사용자를 생성할 수 있습니다. 사용자의 수는 제한이 없이 생성할 수 있습니다.
이렇게 user, sys, admin과 같이 유저 이름과, 패스워드, 권한을 줄 수 있습니다. password앞에서는 암호화하는 방식을 넣을 수 있습니다.
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login").permitAll()
.antMatchers("/user").hasRole("USER")
.antMatchers("/admin/pay").hasRole("ADMIN")
.antMatchers("/admin/**").access("hasRole('ADMIN') or hasRole('SYS')")
.anyRequest().authenticated();
http
.formLogin()
}
이렇게 인가 설정을 해놓으면 생성된 계정의 권한에 따라 인가받을 수 있습니다.
'Spring Boot > Spring Security' 카테고리의 다른 글
[Spring Security] CSRF (0) | 2022.06.29 |
---|---|
[Spring Security] 예외 처리 및 요청 캐시 필터 (0) | 2022.06.29 |
[Spring Security] 동시 세션제어, 세션 고정 보호, 세션정책 (0) | 2022.06.29 |
[Spring Security] Remember Me 인증, RememberMeAuthenticationFilter (0) | 2022.06.29 |
[Spring Security] Logout처리, LogoutFilter (0) | 2022.06.29 |
댓글