programing

Spring Boot/Spring Security에서 사용자가 자신의 데이터에만 접근할 수 있도록 하는 방법

codeshow 2023. 3. 8. 21:39
반응형

Spring Boot/Spring Security에서 사용자가 자신의 데이터에만 접근할 수 있도록 하는 방법

다음과 같은 rest api가 있습니다.

/users/{user_id}
/users/{user_id}/orders
/users/{user_id}/orders/{order_id}

어떻게 고정시켜야 하죠?모든 사용자는 자신의 데이터만 볼 수 있지만 관리자는 모든 데이터를 볼 수 있습니다.

ID == 1인 사용자가 ID == 2인 사용자의 데이터를 볼 수 없는 경우 Spring Security에서 구현해야 하는 방법 및 내용은 모두 볼 수 있는 역할 관리자별 사용자를 예상합니까?

세션 내의 모든 메서드 사용자 ID가 api에 전달된user_id 파라미터와 동일한지 확인하기 전에 확인해야 합니까?더 좋은 방법은 없을까?

p.s: 봄 보안으로 JWT를 사용합니다.

어느쪽이든@Controller,@RestController사용할 수 있는 주석 콩Principal메서드 인수로 직접 사용합니다.

    @RequestMapping("/users/{user_id}")
    public String getUserInfo(@PathVariable("user_id") Long userId, Principal principal){
        // test if userId is current principal or principal is an ADMIN
        ....
    }

보안 검사를 원하지 않는 경우Controllers Spring EL 식을 사용할 수 있습니다.이미 다음과 같은 표현을 사용하고 있을 것입니다.hasRole([role]).

그리고 당신은 자신만의 표현을 쓸 수 있습니다.

  1. 작성하다bean
    @Component("userSecurity")
    public class UserSecurity {
         public boolean hasUserId(Authentication authentication, Long userId) {
            // do your check(s) here
        }
    }
  1. 당신의 표현을 사용하세요.
    http
     .authorizeRequests()
     .antMatchers("/user/{userId}/**")
          .access("@userSecurity.hasUserId(authentication,#userId)")
        ...

좋은 점은 다음과 같은 표현도 조합할 수 있다는 것입니다.

    hasRole('admin') or @userSecurity.hasUserId(authentication,#userId)

서비스 인터페이스에서 @PreAuthorize 를 사용할 수도 있습니다.커스텀 userdetails 오브젝트가 있으면 쉽게 할 수 있습니다.제 프로젝트 중 하나에서는 다음과 같이 했습니다.

@PreAuthorize(value = "hasAuthority('ADMIN')"
        + "or authentication.principal.equals(#post.member) ")
void deletePost(Post post);

그런데 이건 서비스인터페이스에 있어요사전 허가를 받으려면 올바른 주석을 추가해야 합니다.

먼저 보안 전략을 선택해야 합니다.필요한 이름은 3A의 인증 개념 중 하나인 "Row Filtering"입니다.감사 )의 개념.

포괄적인 솔루션을 실장하는 경우는, 다음을 참조해 주세요.

https://docs.spring.io/spring-security/site/docs/3.0.x/reference/domain-acls.html

스프링 ACL에서는 "행 필터링", "화이트 블랙리스트", "역할 기반 인증", "ACL 상속", "역할 유권자" 등의 개념을 모두 다룹니다.

그렇지 않으면 보호할 비즈니스 케이스별로 소유자를 저장하고 서비스 계층에서 필터링해야 합니다.

다음과 같은 주석을 만들 수 있습니다.@IsUser컨트롤러 방식으로 사용합니다.

예:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@PreAuthorize(value = "hasRole('ROLE_USER')" + "and authentication.principal.equals(#userId) ")
public @interface IsUser { }

언급URL : https://stackoverflow.com/questions/51712724/how-to-allow-a-user-only-access-their-own-data-in-spring-boot-spring-security

반응형