У меня есть оценщик таможенных разрешений, настроенный примерно так:
public class MyPermissionEvaluator implements PermissionEvaluator {
@Override
public boolean hasPermission(Authentication authentication, Object target, Object permission) {
//do stuff
}
Затем в моей конфигурации у меня есть
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends GlobalMethodSecurityConfiguration {
@Autowired
private MyPermissionEvaluator myPermissionEvaluator;
@Override
protected MethodSecurityExpressionHandler createExpressionHandler() {
DefaultMethodSecurityExpressionHandler methodSecurityExpressionHandler = new DefaultMethodSecurityExpressionHandler();
methodSecurityExpressionHandler.setPermissionEvaluator(myPermissionEvaluator);
return methodSecurityExpressionHandler;
}
Это отлично работает для стандартных случаев использования при использовании " hasPermission "в preAuth для безопасности моих методов, например
@PreAuthorize("hasPermission(#model.appName, 'RETRIVE')")
Однако теперь мне нужно добавить собственный метод, чтобы проверить что-то еще, а hasPermission мне недостаточно, мне нужно иметь свой собственный метод, поэтому Я попытался добавить его в текущий оценщик разрешений
public boolean myNewMethod(String app) {
// do something
}
Затем в моей сигнатуре метода я обновил preAuth, чтобы получить
@PreAuthorize("hasPermission(#model.appName, 'RETRIVE') or myNewMethod(#model.value)")
, это дает следующую ошибку: " org.springframework.expression.spel.SpelEvaluationException: EL1004E: Вызов метода: Метод hasRoleAndStoreFor (java .lang.String) не может быть найден для типа org.springframework.security.access.expression.method.MethodSecurityExpression Root " *
Затем я попытался обновить preAuth до
@PreAuthorize("hasPermission(#model.appName, 'RETRIVE') or @myPermissionEvaluator.myNewMethod(#model.value)")
, и это дает мне следующую ошибку:
* 102 7 * В контексте не зарегистрирован преобразователь bean-компонентов для разрешения доступа к bean-компоненту myPermissionEvaluator
Затем я попытался переместить метод в новую службу и выполнить
@PreAuthorize("hasPermission(#model.appName, 'RETRIVE') or @newService.myNewMethod(#model.value)")
но не повезло.
Есть идеи? Я не понимаю, как это сделать