@PreAuthorize с бином в выражении (Spring Boot)
Простой вопрос, я получил класс @Service @Autowired
в моем контроллере.
Пытаюсь немного защитить один из методов моего контроллера. Так что для простоты я сделал это, чтобы проверить
@PreAuthorize("@myService.helloThere()")
public void someControllerMethod() {
...
}
Но безуспешно. Получение исключения во время вызова метода.
java.lang.IllegalArgumentException: не удалось оценить выражение '@myService.helloThere()'
Я что-то упустил с EL здесь?
Обновить
Просто добавление последнего, вызванного исключением
Вызвано: org.springframework.expression.spel.SpelEvaluationException: EL1057E:(pos 1): в контексте не зарегистрирован преобразователь компонента для разрешения доступа к компоненту 'dummyServiceImpl'
Теперь я не понимаю, почему он не будет доступен в StandardEvaluationContext, если я использую @Autowired?
Обновление 2
Так как у меня была своя собственная Ролевая Иерархия, подключенная в обычае GlobalMethodSecurityConfiguration
расширенный класс, DefaultMethodSecurityExpressionHandler
не было applicationContext
устанавливается по умолчанию. Я не уверен, почему это так, или я упустил что-то очевидное. Я искал справочные страницы и нашел другой поток SO, который помог мне решить проблему. Я публикую обновленную конфигурацию безопасности.
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class GlobalMethodSecurityConfig extends GlobalMethodSecurityConfiguration {
@Autowired
ApplicationContext applicationContext; //added this
@Override
protected MethodSecurityExpressionHandler createExpressionHandler() {
final DefaultMethodSecurityExpressionHandler handler = new DefaultMethodSecurityExpressionHandler();
handler.setApplicationContext(applicationContext); //added this
RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_USER_MANAGER > ROLE_USER");
handler.setRoleHierarchy(roleHierarchy);
return handler;
}
}