Не удается получить доступ к свойству UserRepository внутри пользовательского выражения безопасности

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

Итак, мой класс расширяет SecurityExpressionRoot и реализует MethodSecurityExpressionOperations. Все работает нормально (метод успешно вызван), но я не могу использовать свой атрибут 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");
        });
    }
}

Ваш CustomMethodSecurityExpressionRoot должен быть пружинным компонентом! а чтобы ввести свой UserRepository, вы можете сделать это с помощью @Autowired

TinyOS 21.03.2019 14:38

@TinyOS Спасибо за (очень) быстрый ответ! Я попытался добавить @Component вверху класса и установить @Autowired в UserRepository, и у меня есть исключение при запуске моего сервера: Error creating bean with name 'methodSecurityConfig': **Injection of autowired dependencies failed; nested exception is java.lang.RuntimeException: Could not postProcess (извините, я новичок в SpringBoot, исходящий из Node.JS: p)

iStornZ 21.03.2019 14:48

Я не знаком с SecurityExpressionRoot, но мне кажется, что это неправильный путь. В это время пользователь уже должен быть в UserDetails, поэтому в этом выражении не должно выполняться обращение к базе данных. Найдите DaoAuthenticationProvider и DaoAuthenticationProvider (весенние классы безопасности), чтобы узнать, как это сделать.

user2189998 21.03.2019 14:58

Спасибо, я использовал этот «хак», потому что информация о пользователе в UserDetails не обновлялась (похоже, информация о пользователе не обновлялась из базы данных). Пойду проверю DaoAuthenticationProvider спасибо за подсказку!

iStornZ 21.03.2019 15:02
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
304
2

Ответы 2

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

CustomMethodSecurityExpressionRoot должен быть пружинным компонентом и внедрять UserRepository с помощью @Autowired.

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