Spring Boot/Spring Security

[Spring Security] 권한 설정

수수한개발자 2022. 6. 29.
728x90

권한 설정

권한 설정은 선언적 방식과 동적 방식으로 나뉜다

선언적 방식

선언적방식은 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()
}

이렇게 인가 설정을 해놓으면 생성된 계정의 권한에 따라 인가받을 수 있습니다.

728x90

댓글