본문 바로가기
Spring|Spring-boot/Spring Security

Spring Security(1)

by oncerun 2021. 3. 21.
반응형

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

댓글