0+ 스프링/0+ 스프링 Security

[스프링 시큐리티] 5. 기본 API 및 Filter 이해(권한(인가) 설정)

힘들면힘을내는쿼카 2023. 1. 9. 10:58
728x90
반응형

[스프링 시큐리티] 5. 기본 API 및 Filter 이해(권한(인가) 설정)

해당 포스팅은 인프런에서 스프링 시큐리티 정수원님의 강의를 참고하여 작성했습니다.
스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security - 인프런 | 강의

 

스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security - 인프런 | 강의

초급에서 중.고급에 이르기까지 스프링 시큐리티의 기본 개념부터 API 사용법과 내부 아키텍처를 학습하게 되고 이를 바탕으로 실전 프로젝트를 완성해 나감으로써 스프링 시큐리티의 인증과

www.inflearn.com

권한(인가) 설정

스마트 폰에서 위와 같은 메시지를 보신적 있으신가요?

위와 같은 상황은 현재 접근 권한이 없기 때문에 발생한 문제 입니다.

 

예를 들어 보겠습니다.

당신이 20년전 보고서를 참고하여 업무를 진행해야하는 상황에 있습니다.
그래서 보고서를 조회하기위해 지원팀에 연락했지만, 해당 자료에 접근 할 수 없다는 메시지를 받았습니다.
이말은 무엇일까요?
당신은 지원팀에 연락은 할 수 있지만, 보고서는 조회할 수 없다는 것을 의미합니다.
인증은 받았지만, 권한으로 인하여 서버의 자원을 조회할 수 없다는 의미이죠.

여기서 2가지 해결방법이 존재합니다.
첫 번째 권한을 변경하는 방법, 두 번째 권한이 있는 사람에게 부탁하는 방법
결국에는 서버의 자원을 조회할 수 있는 권한이 있는 사람이 필요하겠군요…!

파일 시스템 권한
대부분의 파일 시스템은 특정 사용자와 그룹에 접근 권한(file-system permissions)을 할당하는 방식을 제공한다. 이러한 시스템들은 사용자가 파일 시스템의 내용을 보거나 변경할 수 있는 기능을 제어한다.(위키백과)

권한은 사용자가 갖고 있는 역할에 따라 부여되는 책임을 의미한다고 생각하면 쉬울것 같습니다.

스프링 시큐리티는 권한 설정하는 방법 2가지를 제공합니다.

  • 선언적 방식
  • 동적 방식

선언적 방식

  • URL
    • 설정 시 구체적인 경로가 먼저 오고 그것 보다 큰 범위의 경로가 뒤에 오도록 해야 합니다. 
@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .authorizeRequests()
            .antMatchers("/mypage").hasRole(USER)
            .antMatchers("/messages").hasRole(MANAGER)
            .antMatchers("/config").hasRole(ADMIN)
            .antMatchers("/shop/admin/**").access("hasRole('ADMIN') or hasRole(USER)");
            .anyRequest().authenticated();
}

 

  • Method
@PreAuthorize(“hasRole(‘USER’)”)
public void user() {}

 

동적 방식(DB 연동 프로그래밍)

  • URL
  • Method

나중에 추가로 포스팅 할 예정

인가 API 표현식

실습

선언적 방식을 사용해서 권한처리 테스트를 해봅시다.

MySecurityConfig

@EnableWebSecurity
public class MySecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("user").password("{noop}123").roles("USER");
        auth.inMemoryAuthentication().withUser("manager").password("{noop}123").roles("MANAGER");
        auth.inMemoryAuthentication().withUser("admin").password("{noop}123").roles("ADMIN");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/user").hasRole("USER")
                .antMatchers("/admin-manager").access("hasRole('ADMIN') or hasRole('MANAGER')")
                .antMatchers("/manager").hasRole("MANAGER")
                .anyRequest().authenticated();

        http
                .formLogin();
    }
}

MyController

@RestController
public class MyController {
    @GetMapping("/user")
    public String user() {
        return "user";
    }

    @GetMapping("/manager")
    public String manager() {
        return "manager";
    }

    @GetMapping("/admin-manager")
    public String adminManager() {
        return "admin-manager";
    }
}

 

권한에 맞게 접근 가능한 것을 알 수 있습니다.

USER

 

MANAGER

 

ADMIN

 

 

 

728x90
반응형