Не удается получить доступ к свойству UserRepository внутри пользовательского выражения безопасности - PullRequest
0 голосов
/ 21 марта 2019

У меня проблема с REST API моего сервера SpringBoot. Фактически я создал собственное выражение безопасности, чтобы проверить, разрешено ли конкретному пользователю доступ к ресурсу (это не роль).

Таким образом, мой класс расширяет SecurityExpressionRoot и реализует MethodSecurityExpressionOperations . Все работает нормально (метод успешно вызван), но я не могу использовать свой атрибут UserRepository: он нулевой.

Итак, мой вопрос: как использовать UserRepository экземпляр внутри пользовательского выражения безопасности ?

Заранее спасибо!

public class CustomMethodSecurityExpressionRoot extends SecurityExpressionRoot implements MethodSecurityExpressionOperations {
    public CustomMethodSecurityExpressionRoot(Authentication authentication) {
        super(authentication);
    }

    @Inject
    private UserRepository userRepository; // This is always null

    @Override
    public void setFilterObject(Object o) { }

    @Override
    public Object getFilterObject() { return null; }

    @Override
    public void setReturnObject(Object o) { }

    @Override
    public Object getReturnObject() { return null; }

    @Override
    public Object getThis() { return null; }

    public boolean isValidated() {
        UserDetails principalUser = (UserDetails)authentication.getPrincipal();

        Optional<User> userFromDatabase = userRepository.findOneByLogin(principalUser.getUsername()); // Username is found here
        return userFromDatabase.map(user -> { // Not executed because userFromDatabase is null :/
            return true;
        }).orElseThrow(() -> {
            return new UsernameNotFoundException("user was not found in the database");
        });
    }
}

1 Ответ

0 голосов
/ 21 марта 2019

Если вы не можете сделать свой класс пружинным компонентом, лучше всего передать UserRepository также в конструктор и передать его из службы в качестве аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...