[스프링(spring)]시큐리티는 어떻게 동작할까??총정리(6/6)

allnight5·2023년 1월 5일
0

스프링

목록 보기
29/62

SecurityFilterChain도 시큐리티 보안에 Filter를 결졍하는데 사용되는데.. 나중에 다시 합쳐서 정리해보겠다.

시큐리티를 적용하여 Controller에서 사용시
기본적으로 메소드의 파라미터에 @AuthenticationPrincipal UserDetailsImpl userDetails라는 내용을 적어주게된다.

@EnableWebSecurity에대한 설명
@EnableGlobalMethodSecurity에대한설명
이제이 파라미터에서 @AuthenticationPrincipal이 있다면
파라미터내에 @AuthenticationPrincipal가 존재한다면 SecurityContextHolder.getContext().getAuthentication().getPrincipal()라는 내용을 찾아서 반환해주는것을 실행해주는 자바 클래스 AuthenticationPrincipalArgumentResolver가 있다.

하지만 이렇게 되기위해서는 Authentication객체에 내용을 저장해주어야하는데 이것을 우리가하는 UserDetails의 인터페이스의를 상속하여 구현하는 클래스를 UserService인터페이스의 내용을 구현해주는 클래스에서 DB에서 찾고 싶은내용을 찾아와서 UserDetails의 인터페이스의를 상속하여 구현하는 클래스를 UserDetails 인스턴스화해서 받은 userdetails를 UsernamePasswordAuthenticationToken에 넣어 값을 반환해주면서 Authentication 인스턴스화한 형태의 변수에 내용을 넣어주는 형태로 구현한다.

인터페이스인 Athentication -> 추상메소드 AbstratAuthenticationToken(인터페이스 Athentication상속) -> UsernamePasswordAuthenticationToken(추상메소드 AbstratAuthenticationToken상속)으로 되어있으니

Athentication에 UsernamePasswordAuthenticationToken을 넣을수있다.

UsernamePasswordAuthenticationToken 클래스안에 들어가보면 4가지 형태로 내용을 담아 반환할 수 있다.

SecurityContextHolder부분은 미세하게 좀더 들어가면 이렇게 된다

  • SecurityContextHolder 에는 스프링 시큐리티로 인증을 한 사용자의 상세 정보를 저장한다.
  • SecurityContext 란? SecurityContextHolder 로 접근할 수 있으며 Authentication 객체를 가지고 있다.

자 이제 서버쪽에서 html을 하지 않았을때 돌아가는 자세한 설명이 끝났다.

권한 부여하고 제한하기

만약 Html을 활용하여 풀스택을 완성하였는데. 이때 vip고객이랑 일반고객이랑 관리자랑 접속하는 사이트에 차이를 주고 싶다고 할때 하는것이 UserDetails를 상속받아 구현하는 CustomerUserDetails(예시이름)클래스에 Collection<? extends GrantedAuthority> getAuthorities()라는 메소드를 만들어 오버라이드한후 GrantedAuthority이라는 권한을 주는 인터페이스로 SimpleGrantedAuthority와 같이 GrantedAuthority를 상속받은 클래스에 해당 유저의 객체를 자료형으로 하여 데이터를 받아와서 그 내용을(ROLE_ADMIN, ROLE_USER,ROLE_PRIMIUM)과 같이 추가해준다면 이제 권한을 준것인데 이걸로 끝이 아니다.

권한을 주었다면 그권한을 사용해야 하지 않겠는가?
controller에서
@Secured("ROLE_ADMIN")를 넣어줘도 된다

@Secured("ROLE_ADMIN")
    @GetMapping("/api/admin/products")
    public List<Product> getAllProducts() {
        return productService.getAllProducts();
    }

이러한 형식으로 말이다.
그러나. controller가 많고 그안에 메소드도 많다면? 이것을 다시 바꿔야 할때가 있다면? 언제 거기를 다들어가서 바꿔줄것인가?

  1. authorizeRequests()가 있었는데 2. authorizeHttpRequests()가 버전이 올라가면서 나왔는데 2)의 경우authorizeHttpRequests()사용할수있다.

1) .antMatchers("/api/get).hasAnyAuthority("ROLE_ADMIN")
2) .requestMatchers("/api/get/prim").hasAnyAuthority("ROLE_PRIMIUM")

.antMatchers("/admin/**").hasAnyAuthority("ROLE_ADMIN")의 경우 관리자만 들어가게 설정해주는것 만약 DB속 user의 Role이 ADMIN이라면 여기서 확인하고 페이지를 접속할수 있게 해주는것이다.하지만 일반유저나 vip고객은 관리자가 아니니 들어갈수없다.

.requestMatchers("/api/get/prim").hasAnyAuthority("ROLE_PRIMIUM") 의 경우 vip만 들어가게 설정해주는것 만약 DB속 user의 Role이 PRIMIUM이라면 여기서 확인하고 페이지를 접속할수 있게 해주는것이다.하지만 일반유저나 관리자는 vip가 아니니 들어갈수없다. 그런데 관리자도 들어가야하니 추가로 설정해주는것이좋다.
.requestMatchers("/api/get/prim").hasAnyAuthority("ROLE_PRIMIUM", "ROLE_ADMIN")
이러한 식으로 사용자의 권한을 부여해줄수있다.

//-------------------------------------------------------------
//ADMIN Authorization(ADMIN권한, ROLE_ADMIN)-3가지 방법
//.antMatchers("/admin/").hasRole("ROLE_ADMIN")
//.antMatchers("/admin/
").access("hasRole('ROLE_ADMIN')")
.antMatchers("/admin/**").hasAnyAuthority("ROLE_ADMIN")
//hasAnyAuthority권한을 확인하겠다.ROLE_ADMIN라면 권한이 ADMIN인 관리자만
//만약 ROLE_PRIMIUM이라면 PRIMIUM고객만 페이지를 접속할수있도록 해줄수 있다.
.anyRequest().authenticated()
//authenticated() 인증이 되어야 통과된다는 뜻이다.
//-------------------------------------------------------------

profile
공부기록하기

0개의 댓글