[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.update ()에서 changeData ()를 직접 호출하면 프록시를 통과하지 않습니다. 프록시 호출 만 주석 처리 된 비헤이비어로 향상됩니다.
update ()에서 changeData ()를 직접 호출하면 프록시를 통과하지 않습니다. 프록시 호출 만 주석 처리 된 비헤이비어로 향상됩니다.
이 메소드를 다른 bean으로 옮길 수는 있지만, 같은 bean을 호출 할 수도 있지만 다음과 같이 프록시를 통해 호출 할 수 있습니다.
@Secured({"ROLE_ADMIN"}) public void update(Person person) { if(person.isActive()) { context.getBean(MyBean.class).changeData(person); } }
-
==============================
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 (...) 호출 후 실행해야하는 추가 코드가있는 경우이 방법이 적합하지 않을 수 있습니다.
from https://stackoverflow.com/questions/28168108/preauthorize-on-a-nested-method-in-spring-controller by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring Boot Plugin에서 시스템 속성 정의하기 (0) | 2019.05.22 |
---|---|
[SPRING] 인터페이스는 IoC / DI의 @Component 주석으로 주석 처리됩니다. 그 이유는 무엇일까요? (0) | 2019.05.22 |
[SPRING] Spring Data JPA를 사용하는 동안 내 저장소를 자동으로 초기화 할 수 없습니다. (0) | 2019.05.22 |
[SPRING] 폼의 장점은 무엇입니까? Spring의 label 태그? (0) | 2019.05.22 |
[SPRING] spring-boot 기본 JSP 404 찾을 수 없음 (0) | 2019.05.21 |