У меня возникла проблема с 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");
});
}
}
@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)
Я не знаком с SecurityExpressionRoot, но мне кажется, что это неправильный путь. В это время пользователь уже должен быть в UserDetails, поэтому в этом выражении не должно выполняться обращение к базе данных. Найдите DaoAuthenticationProvider и DaoAuthenticationProvider (весенние классы безопасности), чтобы узнать, как это сделать.
Спасибо, я использовал этот «хак», потому что информация о пользователе в UserDetails не обновлялась (похоже, информация о пользователе не обновлялась из базы данных). Пойду проверю DaoAuthenticationProvider спасибо за подсказку!




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