Если вы хотите, чтобы @PreAuthorize("hasRole('USER')")
вызывал ваш метод вместо метода в SecurityExpressionRoot
, тогда да, вам нужно заменить его, выставив свой MethodSecurityExpressionHandler
в качестве компонента.Вы бы переопределили его createSecurityExpressionRoot
метод:
class MyExpressionHandler extends DefaultMethodSecurityExpressionHandler {
@Override
protected MethodSecurityExpressionOperations
createSecurityExpressionRoot(Authentication a, MethodInvocation mi) {
return new MyRoot(super.createSecurityExpressionRoot(a, mi));
}
}
@EnableGlobalMethodSecurity(prePostEnabled=true)
class UsingCustomExpressionHandler extends GlobalMethodSecurityConfiguration {
@Override
protected MethodSecurityExpressionHandler createExpressionHandler() {
return new MyExpressionHandler();
}
}
НО , есть менее инвазивные вещи, которые вы можете попробовать сначала.
Использование компонента
Например, вы можете обращаться к любому из ваших собственных bean-компонентов внутри SpEL .Итак, если вы создали @Bean
, который может выполнять оценку, вам не нужно вызывать hasRole
.Вместо этого вы можете просто:
@PreAuthorize("@myBean.evaluate(authentication)")
Это дает вам большую гибкость, чтобы делать все, что вам нужно делать с Authentication
для определения доступа.
Mapping Authorities
Или вы можете сопоставить все, что у вас есть в виде пользовательских ролей, с набором GrantedAuthority
s.Некоторые механизмы аутентификации в Spring Security предоставляют способ сопоставления пользовательских представлений прав доступа.
Например, я заметил ваш комментарий // turn on OAuth
.Если вы хотите переопределить hasRole
из-за областей OAuth, вы можете использовать oauth2ResourceServer()
и , предоставив пользовательские JwtAuthenticationConverter
, чтобы адаптировать ваши пользовательские права доступа к GrantedAuthority
s.В этом случае hasRole
может не потребоваться переопределять вообще.(Конечно, я не знаю, какова ваша конкретная ситуация в отношении того, как вы аутентифицируете пользователя. Это только один из примеров GrantedAuthority
преобразования среди многих.)