Это модель разрешений ABA C, решение о безопасности которой определяется не только информацией пользователя, но и состоянием / атрибутом защищенного ресурса.
С точки зрения безопасности Spring, это лучше всего реализовать с использованием @PreAuthorize
/ @PostAuthorize
/ @PostFilter
, что позволяет вам использовать выражение SpEL для декларативного определения logi безопасности c, которое является выражением, которое будет окончательно оценивать на истину / ложь. В SpEL вы можете получить доступ к входному параметру и возвращаемому объекту метода, который выполняет тот прецедент, который вы хотите применить, или даже обратиться к компоненту Spring для вызова его метода для выполнения оценки.
Например, вы можете сделать что-то вроде:
@PreAuthorize("@authzService.isAllowToKickMember(principal , #userToKick)")
public void kickMemeber(User userToKick){
}
@Service
public class AuthzService{
public boolean isAllowToKickMember(User currentUser , User userToKick){
//check if current user can kick a given user
}
}
Для указателей проверьте this .