반응형
Spring boot를 이용하면 tomcat의 기본 port : 8080이므로 변경한다.
페이지가 아닌 SecurityContectHoler에서 Authentication을 얻어서 각 url의 요청에 권한 및 인증을 진행해본다.
@RestController
public class HomeController {
@RequestMapping("/")
public String index(){
return "home";
}
@RequestMapping("/auth")
public Authentication auth(){
return SecurityContextHolder.getContext()
.getAuthentication();
}
@PreAuthorize("hasAnyAuthority('ROLE_USER')")
@RequestMapping("/user")
public SecurityMessage user (){
return SecurityMessage.builder()
.authentication(SecurityContextHolder.getContext().getAuthentication())
.message("User 개인정보").build();
}
@PreAuthorize("hasAnyAuthority('ROLE_ADMIN')")
@RequestMapping("/admin")
public SecurityMessage admin(){
return SecurityMessage.builder()
.authentication(SecurityContextHolder.getContext().getAuthentication())
.message("관리자 개인정보").build();
}
}
이 방법은 @PreAuthorize를 사용해 각 요청에 대한 권한을 설정하는 방법이다.
컨트롤러에 다음과 같이 설정을 했다면 Security를 위한 config 클래스가 존재해야 한다.
완성본
@EnableWebSecurity(debug = true)
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
/*만약 여기서 user에대한 provider를 추가하게 되면 yml설정된 user는 사용할 수가 없다.*/
auth.inMemoryAuthentication()
.withUser(User.builder()
.username("user2")
.password(passwordEncoder().encode("2222"))
.roles("USER"))
.withUser(User.builder()
.username("admin")
.password(passwordEncoder().encode("3333"))
.roles("ADMIN"));
/*password 인코딩 필요
* spring Security는 기본적으로 BcryptPasswordEncoder를 지원한다.
* */
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests((requests) ->
requests
.antMatchers("/").permitAll()
.anyRequest()
.authenticated());
http.formLogin();
http.httpBasic();
}
@Bean
PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}
yml에서 간단한 테스트를 위한 유저를 설정할 수 있다.
하지만 다음과 같이 WebSecurityConfigurerAdapter를 상속받아서 다음과 같이 User를 추가해준다면 yml에서 설정한 USER는 사용할 수 없다.
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser(User.builder()
.username("user2")
.password("2222")
.roles("USER"))
.withUser(User.builder()
.username("admin")
.password("3333")
.roles("ADMIN"));
}
또한 이렇게 user를 추가하면 에러가 발생한다.
그 이유는 password를 인코딩하지 않았기 때문인데 SpringSecurity에서 지원하는 BCryptEncoder를 사용해서 인코딩하기 위해 @Bean을 추가한다.
@Bean
PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
위의 어노테이션은 다음과 같습니다.
@EnableWebSecurity(debug = true)
@EnableGlobalMethodSecurity(prePostEnabled = true)
- @EnableWebSecurity(debug = true) 설정을 통해 Security와 관련된 디버깅을 켜줍니다.
- 시큐리티에서 prePostEnabled = true로 설정해 아까 컨트롤러에 설정한 @PreAuthorize 사용해 권한 설정을 합니다.
Spring Securty는 다음과 같이 모든 페이지에 대해서 권한을 검사하는데, 메인 index페이지 정도는 로그인 안 한 사용자도
확인할 수 있도록 할 수 있습니다.
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests((requests) ->
requests
.antMatchers("/").permitAll()
.anyRequest()
.authenticated());
http.formLogin();
http.httpBasic();
}
antMatchers를 통해 해당 url은 허가해줄 수 있습니다.
반응형
'Spring|Spring-boot > Spring Security' 카테고리의 다른 글
Spring Security(4) (0) | 2021.04.04 |
---|---|
Spring Security Basic (0) | 2021.03.28 |
Spring Security Form Login (0) | 2021.03.28 |
Spring Security(2) (0) | 2021.03.21 |
Spring Security (0) | 2021.03.21 |
댓글