#spring #spring-boot #spring-security #spring-data-jpa #thymeleaf
#spring #spring-boot #spring-безопасность #spring-data-jpa #thymeleaf
Вопрос:
Здравствуйте, пожалуйста, у меня ошибка при подключении пользователя только с его электронной почтой и паролем.
В stacktrace у меня есть исключение с нулевым указателем из-за того, что методы getUserAuthority и loadUserByUsername не возвращают пользователя, присутствующего в моей базе данных. это мой класс AdminController:
@Controller
публичный класс AdminController {
@GetMapping(value = { "/", "/login" })
public ModelAndView login(@RequestParam(value = "error", required = false) String error,
@RequestParam(value = "logout", required = false) String logout) {
ModelAndView modelAndView= new ModelAndView("login");
if (error !=null) {
modelAndView.addObject("error", "Invalid Username and password!");
}
if (logout !=null) {
modelAndView.addObject("message", "You're been logout out successfully.");
}
return modelAndView;
}
@GetMapping(value = {"/logout"})
private String logout() {
SecurityContextHolder.getContext().setAuthentication(null);
return "redirect:login";
}
@GetMapping(value = "/home")
public String home() {
return "redirect:dashboard";
}
}
класс customUservice:
@Service("customUserDetailsService")
открытый класс CustomuserDetailService реализует UserDetailsService {
private final UserService userService;
@Autowired
public CustomuserDetailService(UserService userService) {
super();
this.userService = userService;
}
@Override
@Transactional
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
UserDto userDto = userService.findUserByEmail(email);
if (userDto !=null) {
List<GrantedAuthority> authorities = getUserAuthority(userDto.getRolesDtos());
return buildUserForAuthentication(userDto, authorities);
}else {
throw new UsernameNotFoundException("user with email" email "does not exist.");
}
}
private List<GrantedAuthority> getUserAuthority(Set<RoleDto> userRoles) {
Set<GrantedAuthority> roles = new HashSet<>();
userRoles.forEach((role) -> {
roles.add(new SimpleGrantedAuthority(role.getName()));
});
return new ArrayList<GrantedAuthority>(roles);
}
private UserDetails buildUserForAuthentication(UserDto user, List<GrantedAuthority> authorities) {
return new org.springframework.security.core.userdetails.User(user.getEmail(), user.getPassword(), authorities);
}
}
и stackTace:
Переход в спящий режим: выберите user0_.users_id как users_id1_7_, user0_.email как email2_7_, user0_.first_name как first_na3_7_, user0_.last_name как last_nam4_7_, user0_.mobile_number как mobile_n5_7_, user0_.password как password6_7_ из bankass.users user0_ где user0_.email=? Переход в спящий режим: выберите roles0_.users_id как users_id1_8_0_, roles0_.role_id как role_id2_8_0_, role1_.role_id как role_id1_2_1_, role1_.role как role_2_2_1_ из bankass.users_roles roles0_ внутреннее соединение bankass.role role1_ на roles0_.role_id=role1_.role_id где roles0_.users_id=? Переход в спящий режим: выберите users0_.role_id как role_id2_8_0_, users0_.users_id как users_id1_8_0_, user1_.users_id как users_id1_7_1_, user1_.email как email2_7_1_, user1_.first_name как first_na3_7_1_, user1_.last_name как last_nam4_7_1_, user1_.mobile_number как mobile_n5_7_1_, user1_.password как password6_7_1_ от bankass.users_roles users0_ внутреннее присоединение к bankass.usersuser1_ на users0_.users_id=user1_.users_id где users0_.role_id=? Переход в спящий режим: выберите roles0_.users_id как users_id1_8_0_, roles0_.role_id как role_id2_8_0_, role1_.role_id как role_id1_2_1_, role1_.role как role_2_2_1_ из bankass.users_roles roles0_ внутреннее соединение bankass.role role1_ на roles0_.role_id=role1_.role_id где roles0_.users_id=? Переход в спящий режим: выберите roles0_.users_id как users_id1_8_0_, roles0_.role_id как role_id2_8_0_, role1_.role_id как role_id1_2_1_, role1_.role как role_2_2_1_ из bankass.users_roles roles0_ внутреннее соединение bankass.role role1_ на roles0_.role_id=role1_.role_id где roles0_.users_id=? Переход в спящий режим: выберите roles0_.users_id как users_id1_8_0_, roles0_.role_id как role_id2_8_0_, role1_.role_id как role_id1_2_1_, role1_.role как role_2_2_1_ из bankass.users_roles roles0_ внутреннее соединение bankass.role role1_ на roles0_.role_id=role1_.role_id где roles0_.users_id=? Переход в спящий режим: выберите roles0_.users_id как users_id1_8_0_, roles0_.role_id как role_id2_8_0_, role1_.role_id как role_id1_2_1_, role1_.role как role_2_2_1_ из bankass.users_roles roles0_ внутреннее соединение bankass.role role1_ на roles0_.role_id=role1_.role_id где roles0_.users_id=? 2020-11-20 23:14:38.042 ОШИБКА 330726 — [nio-8080-exec-1] w.a.UsernamePasswordAuthenticationFilter : при попытке аутентификации пользователя произошла внутренняя ошибка.
org.springframework.security.authentication.InternalAuthenticationServiceException: null в org.springframework.security.authentication.dao.DaoAuthenticationProvider.RetrieveUser(DaoAuthenticationProvider.java:123) ~ [spring-security-core-5.3.4.RELEASE.jar:5.3.4.RELEASE] в org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:144 ) ~[spring-security-core-5.3.4.ВЫПУСК.jar:5.3.4.RELEASE] в org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:199) ~[spring-security-core-5.3.4.RELEASE.jar:5.3.4.RELEASE] в org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:219) ~[spring-security-core-5.3.4.RELEASE.jar:5.3.4.RELEASE] в org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication(UsernamePasswordAuthenticationFilter.java:95 ) ~[spring-security-web-5.3.4.RELEASE.jar:5.3.4.RELEASE] в организации.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter .doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.3.4.RELEASE.jar:5.3.4.RELEASE] в org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.3.4.RELEASE.jar:5.3.4.RELEASE] в org.springframework.security.web.authentication.Выход.LogoutFilter .doFilter(LogoutFilter.java:116) ~[spring-security-web-5.3.4.RELEASE.jar:5.3.4.RELEASE] в org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.3.4.RELEASE.jar:5.3.4.RELEASE] в org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) ~[spring-web-5.2.9.RELEASE.jar:5.2.9.RELEASE] в org.springframework.web.filter.OncePerRequestFilter .doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.9.RELEASE.jar:5.2.9.RELEASE] в org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.3.4.RELEASE.jar:5.3.4.RELEASE] в организации.springframework.security.web.header.HeaderWriterFilter .doHeadersAfter(HeaderWriterFilter.java:92) ~[spring-security-web-5.3.4.RELEASE.jar:5.3.4.RELEASE] в org.springframework.security.web.header.HeaderWriterFilter .doFilterInternal(HeaderWriterFilter.java:77) ~[spring-security-web-5.3.4.RELEASE.jar:5.3.4.RELEASE] в org.springframework.web.filter.OncePerRequestFilter .doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.9.RELEASE.jar:5.2.9.RELEASE] в org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.3.4.RELEASE.jar:5.3.4.RELEASE] в org.springframework.security.web.context.SecurityContextPersistenceFilter .doFilter(SecurityContextPersistenceFilter.java:105) ~[spring-security-web-5.3.4.RELEASE.jar:5.3.4.RELEASE] в org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.3.4.RELEASE.jar:5.3.4.RELEASE] в org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) ~[spring-security-web-5.3.4.RELEASE.jar:5.3.4.RELEASE] в организации.springframework.web.filter.OncePerRequestFilter .doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.9.RELEASE.jar:5.2.9.RELEASE] в org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.3.4.RELEASE.jar:5.3.4.RELEASE] в org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) ~ [spring-security-web-5.3.4.RELEASE.jar: 5.3.4.RELEASE] в org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) ~ [spring-security-web-5.3.4.RELEASE.jar:5.3.4.RELEASE] в org.springframework.web.filter.Делегирование filterproxy.invokeDelegate(делегирование filterproxy.java:358) ~[spring-web-5.2.9.RELEASE.jar:5.2.9.RELEASE] в org.springframework.web.filter.Делегирование filterproxy.doFilter(делегирование filterproxy.java:271) ~[spring-web-5.2.9.RELEASE.jar:5.2.9.RELEASE] в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.38.jar:9.0.38] в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.38.jar:9.0.38] в org.springframework.web.filter.RequestContextFilter .doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.2.9.RELEASE.jar:5.2.9.RELEASE] в org.springframework.web.filter.OncePerRequestFilter .doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.9.RELEASE.jar:5.2.9.RELEASE] в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.38.jar:9.0.38] в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.38.jar:9.0.38] в org.springframework.web.filter.FormContentFilter .doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.2.9.RELEASE.jar:5.2.9.RELEASE] в org.springframework.web.filter.OncePerRequestFilter .doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.9.RELEASE.jar:5.2.9.RELEASE] в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.38.jar:9.0.38] в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.38.jar:9.0.38] в org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:93) ~[spring-boot-actuator-2.3.4.RELEASE.jar:2.3.4.RELEASE] в org.springframework.web.filter.OncePerRequestFilter .doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.9.RELEASE.jar:5.2.9.RELEASE] в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.38.jar:9.0.38] в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.38.jar:9.0.38] в org.springframework.web.filter.CharacterEncodingFilter .doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.2.9.RELEASE.jar:5.2.9.RELEASE] в org.springframework.web.filter.OncePerRequestFilter .doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.9.RELEASE.jar:5.2.9.RELEASE] в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.38.jar:9.0.38] в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.38.jar:9.0.38] в org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.38.jar:9.0.38] в org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.38.jar:9.0.38] в org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) ~[tomcat-embed-core-9.0.38.jar:9.0.38] в org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.38.jar:9.0.38] в org.apache.catalina.valves.Ошибка reportvalve.invoke(ошибка reportvalve.java:92) ~[tomcat-embed-core-9.0.38.jar:9.0.38] в org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.38.jar:9.0.38] в org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.38.jar:9.0.38] в org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~ [tomcat-embed-core-9.0.38.jar:9.0.38] в org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.38.jar:9.0.38] в org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) ~[tomcat-embed-core-9.0.38.jar:9.0.38] в org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java: 1590) ~[tomcat-embed-core-9.0.38.jar:9.0.38] в org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.38.jar:9.0.38] в java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] в java.base/java.util.concurrent .ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] в org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.38.jar:9.0.38] в java.base/java.lang.Thread.run(Thread.java:834) ~ [na:na] Вызвано: java.lang .Исключение NullPointerException: null в com.busreseravtionsystem.busreservation.security.CustomuserDetailService.getUserAuthority(CustomuserDetailService.java:50) ~[classes/:na] в com.busreseravtionsystem.busreservation.security.Пользовательскийdetailservice.loadUserByUsername(пользовательскийdetailservice.java:40) ~[classes/:na] в com.busreseravtionsystem.busreservation.security.CustomuserDetailService$$FastClassBySpringCGLIB$$b6891340.invoke() ~[classes/:na] в org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.2.9.RELEASE.jar:5.2.9.RELEASE] в org.springframework.aop.framework.cglibopproxy$cglibmethod invocation.invokeJoinpoint(CglibAopProxy.java:771) ~[spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE] в org.springframework.aop.framework.ReflectiveMethodInvocation .продолжить (ReflectiveMethodInvocation.java:163) ~[spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE] в org.springframework.aop.framework.cglibopproxy$cglibmethod Вызов.продолжить (CglibAopProxy.java:749) ~[spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE] в org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:367) ~[spring-tx-5.2.9.RELEASE.jar:5.2.9.RELEASE] в org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118) ~[spring-tx-5.2.9.RELEASE.jar:5.2.9.RELEASE] в организации.springframework.aop.framework.ReflectiveMethodInvocation .продолжить (ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE] в org.springframework.aop.framework.cglibopproxy$cglibmethod Вызов.продолжить (CglibAopProxy.java:749) ~[spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE] в org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) ~[spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE] в com.busreseravtionsystem.busreservation.security.CustomuserDetailService$$EnhancerBySpringCGLIB$$9c7d4a88.loadUserByUsername() ~[classes/:na] в org.springframework.security.authentication.dao.DaoAuthenticationProvider.RetrieveUser(DaoAuthenticationProvider.java:108) ~[spring-security-core-5.3.4.RELEASE.jar:5.3.4.RELEASE] … 58 общих фреймов опущены
Комментарии:
1. Я знаю, что префикс «ROLE_» используется, когда вы хотите предоставить роль пользователю с помощью roles.add(new SimpleGrantedAuthority(«ROLE_» role.getName());. В моей таблице ролей у меня есть ADMIN в моей базе данных postgresql, однако я получаю сообщение об ошибке org .springframework.security.authentication. Исключение InternalAuthenticationServiceException: null
2. Когда я должен использовать префикс ROLE_ с Spring Security 5 в базе данных или в коде приложения?
Ответ №1:
роль равна нулю, потому что в UserDTO у меня есть RoleDto . Поэтому мне нужно переименовать «RoleName» в «роль», поскольку это сложный объект.