Когда я вызываю свой API для проверки токена для внешнего интерфейса, я сталкиваюсь с проблемой при вызове моего метода loadUserByUsername
UserDetailsService. Я могу передать имя пользователя методу, но мой userRepository
не может выполнить метод findByUsername
, и я не уверен, что происходит. Я печатаю имя перед вызовом, и он возвращает правильное имя пользователя, также пользователь с таким именем существует в БД.
Это то, что я получаю в консоли:
2020-07-09 22:46:55.121 INFO 18048 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet : Completed initialization in 10 ms
2020-07-09 22:46:55.153 INFO 18048 --- [nio-8080-exec-4] c.g.Apollo.security.jwt.JwtFilter : token not presented...
2020-07-09 22:46:55.759 INFO 18048 --- [nio-8080-exec-4] c.g.Apollo.service.UserService : success...
2020-07-09 22:47:10.885 INFO 18048 --- [nio-8080-exec-5] c.g.Apollo.security.jwt.JwtFilter : token not presented...
2020-07-09 22:47:10.898 INFO 18048 --- [nio-8080-exec-5] c.g.A.s.jwt.JwtUserDetailsService : load user... max123
2020-07-09 22:47:10.909 WARN 18048 --- [nio-8080-exec-5] g.e.SimpleDataFetcherExceptionHandler : Exception while fetching data (/verifyToken) : null
java.lang.NullPointerException: null
at com.**.Apollo.security.jwt.JwtUserDetailsService.loadUserByUsername(JwtUserDetailsService.java:23) ~[classes/:na]
at com.**.Apollo.service.UserService.verifyToken(UserService.java:173) ~[classes/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:564) ~[na:na]
at io.leangen.graphql.metadata.execution.SingletonMethodInvoker.execute(SingletonMethodInvoker.java:21) ~[spqr-0.9.9.jar:na]
Метод UserRepository отлично работает, когда я вхожу в систему, но здесь не работает.
JwtUserDetailsService, это вызывается из метода verifyToken:
@Slf4j
@Service
public class JwtUserDetailsService implements UserDetailsService {
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) {
log.info("load user... {}", username);
Optional<User> user = userRepository.findByUsername(username);
log.info("after");
if (user.isPresent()) {
log.info("user:: {}", user.get().getUsername());
return getJwtUser(user.get());
} else {
log.info("user not found");
return null;
}
}
public JwtUser getJwtUser(User user) {
return new JwtUser(
user.getId(),
user.getUsername(),
user.getFirstName(),
user.getLastName(),
user.getEmail(),
user.getPassword(),
List.of(new SimpleGrantedAuthority(user.getRole().getRoleName().name())),
user.getEnabled(),
null
);
}
UserRepository:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByUsername(String username);
boolean existsByUsername(String username);
Optional<User> findByToken(String token);
}
UserSerice, это то, что выставлено на фронтенд:
@GraphQLQuery
public User verifyToken(String token) {
Optional<User> optionalUser = userRepository.findByToken(token);
if(optionalUser.isPresent()) {
UserDetails userDetails = jwtUserDetailsService.loadUserByUsername(optionalUser.get().getUsername());
if(jwtTokenUtil.isTokenValid(token, userDetails)) {
return optionalUser.get();
}
}
return null;
}