findOne()
определяется как <S extends T> Optional<S> findOne(Example<S> example);
.
Это означает, что в вашем случае он принимает Example<Reader>
и возвращает Optional<Reader>
.
Вы передали ему String
, что неверно, и вы используете его как лямбда-возврат в AuthenticationManagerBuilder.userDetailsService()
, что также неверно
потому что UserDetailsService
- это интерфейсный функционал, определенный как
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
Таким образом, вам нужно вернуть UserDetails
экземпляр, а не Optional
его или выбросить UsernameNotFoundException
, если нет совпадения с именем пользователя , чтобы соответствовать javadoc :
Возвращает:
полностью заполненная запись пользователя (никогда не ноль)
Выдает:
UsernameNotFoundException - если пользователь не может быть найден или пользователь
не имеет предоставленных полномочий
Кроме того, вам не нужно использовать findOne()
, это пример запроса. Запрос по идентификатору достаточно.
Так что вы могли бы написать что-то вроде этого:
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(username -> readerRepository.findById(username)
.orElseThrow( () -> new UsernameNotFoundException("user with username " + username + " not found"));
}
В качестве примечания, getOne()
достаточно сложен, поскольку полагается на ленивую загрузку, которая в некоторых случаях может преподнести неприятные сюрпризы.
Замечание Дж. Б. Низета было интересным.
Итак, я проверил прямо сейчас. Случается, что сессия JPA все еще не открыта, когда к объекту (а именно isAccountNonLocked()
) обращаются классы Spring Security.
Поэтому в любом случае выдается LazyInitializationException
(имя пользователя правильное или нет):
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:155)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:268)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:73)
at davidhxxx.example.angularsboot.model.db.User_$$_jvstd90_5.isAccountNonLocked(User_$$_jvstd90_5.java)
at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider$DefaultPreAuthenticationChecks.check(AbstractUserDetailsAuthenticationProvider.java:352)
at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:165)
Этот вопрос может вас заинтересовать.