@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;
    }
}

1 ответ

Попробуй это.

@PreAuthorize ("myService.helloThere ()")

Другие вопросы по тегам