복붙노트

[SPRING] @PreAuthorize는 Spring 컨트롤러에서 중첩 된 메소드에 대해 수행한다.

SPRING

@PreAuthorize는 Spring 컨트롤러에서 중첩 된 메소드에 대해 수행한다.

나는 두 가지 방법이있는 봄 콩이있다.

@Secured({"ROLE_ADMIN"})
public void update(Person person) {  
   if(person.isActive())
      changeData(person);
}

@PreAuthorize("hasPermission(#person,CHANGE_PERSON_FULL)")
public void changeData(Person person) {
...
}

내 사용자 정의 MethodSecurityExpressionHandler를 추가했습니다. @EnableGlobalMethodSecurity를 ​​설정했습니다 (securedEnabled = true, prePostEnabled = true). 주석 @PreAuthorize가 업데이트 (Person person) 이상이면 모든 것이 잘 작동합니다. changeData에 대해 PreAuthorize를 수행해야합니다. 프록시와 관련이 있습니까? changeData 메소드로 별도의 bean을 생성해야합니까? 중첩 된 메소드에서 스프링이 강제로 보안을 확인하도록 할 수 있습니까?

해결법

  1. ==============================

    1.update ()에서 changeData ()를 직접 호출하면 프록시를 통과하지 않습니다. 프록시 호출 만 주석 처리 된 비헤이비어로 향상됩니다.

    update ()에서 changeData ()를 직접 호출하면 프록시를 통과하지 않습니다. 프록시 호출 만 주석 처리 된 비헤이비어로 향상됩니다.

    이 메소드를 다른 bean으로 옮길 수는 있지만, 같은 bean을 호출 할 수도 있지만 다음과 같이 프록시를 통해 호출 할 수 있습니다.

    @Secured({"ROLE_ADMIN"})
    public void update(Person person) {  
       if(person.isActive()) {
          context.getBean(MyBean.class).changeData(person);
       }
    }
    
  2. ==============================

    2.update 메소드를 호출 할 때 @PreFilter 주석을 사용하면 if 문을 사용하지 않아도됩니다.

    update 메소드를 호출 할 때 @PreFilter 주석을 사용하면 if 문을 사용하지 않아도됩니다.

    이 같은 것이 작동해야합니다 :

    @PreAuthorize("hasRole('ROLE_ADMIN')")
    @PreFilter("hasPermission(#person, CHANGE_PERSON_FULL) and hasPermission(#person.active == true)")
    public void update(Person person) { 
          changeData(person);
    }
    

    changeData (...) 호출 후 실행해야하는 추가 코드가있는 경우이 방법이 적합하지 않을 수 있습니다.

  3. from https://stackoverflow.com/questions/28168108/preauthorize-on-a-nested-method-in-spring-controller by cc-by-sa and MIT license