Произошла внутренняя ошибка при попытке аутентификации пользователя - PullRequest
0 голосов
/ 13 марта 2019

Я создал UserDetailsServiceImpl. Здесь я получаю имя пользователя и роль этого пользователя. Но я не мог понять, в чем проблема. Я пробовал SQL-запрос в базе данных.


SecurityConfig.java

@EnableWebSecurity
@ComponentScan("com")
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
private UserDetailsService userDetailsService;

@Bean
public BCryptPasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
};

@Autowired
protected void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}


@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().antMatchers("/login", "/", "/veteriner").permitAll().antMatchers("/**")
            .hasRole("ADMIN").and().formLogin().loginPage("/login").defaultSuccessUrl("/login/login-status-success")
            .failureUrl("/login/login-status-error").permitAll().usernameParameter("username")
            .passwordParameter("password").and().logout().logoutSuccessUrl("/logout-success")
            .invalidateHttpSession(true).permitAll().and().csrf();
}

LoginController.java

 @Controller
 @RequestMapping(value = "/login", method = RequestMethod.GET)
 public class LoginController {

 @GetMapping
 public ModelAndView home() throws Exception {
    ModelAndView mv = new ModelAndView();
    mv.setViewName("login");
    return mv;
}

@RequestMapping(path="/login-status-error",method = RequestMethod.GET)
@ResponseBody
public ModelAndView erorLogin() throws Exception {
    ModelAndView mv = new ModelAndView();
    mv.setViewName("main");
    return mv;
}

@RequestMapping(path="/login-status-succes",method = RequestMethod.GET)
@ResponseBody
public ModelAndView succesLogin() throws Exception {
    ModelAndView mv = new ModelAndView();
    mv.setViewName("veteriner");
    return mv;
}

}


@Service("userDetailsService")
public class UserDetailsServiceImpl implements UserDetailsService {

@Autowired
private UserService userService;

@Transactional(readOnly = true)
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

    com.model.User user = userService.findByUsername(username);
    if (user == null) {
        throw new UsernameNotFoundException("User not found.");
    }

    User securityUser = new User(user.getUsername(), user.getPassword(), true, true, true, true,
            buildUserAuthority(user.getUserRoles()));
    return securityUser;
}

private List<GrantedAuthority> buildUserAuthority(List<User_role> userRoles) {
    Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>();

    for (User_role userRole : userRoles) {
        setAuths.add(new SimpleGrantedAuthority(userRole.getRole().getRoleName()));
    }

    List<GrantedAuthority> results = new ArrayList<GrantedAuthority>(setAuths);
    return results;
}

выберите user0_.id в качестве id1_6_, user0_.email в качестве email2_6_, user0_.password в качестве password3_6_, user0_.username в качестве username4_6_ из общедоступного. 16: 37: 16.930 [http-nio-8186-exec-12] ОШИБКА org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter - при попытке аутентификации пользователя произошла внутренняя ошибка. org.springframework.security.authentication.InternalAuthenticationServiceException: java.util.ArrayList не может быть приведен к com.model.User в org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser (DaoAuthenticationProvider.java:123) ~ [spring-security-core-5.1.4.RELEASE.jar: 5.1.4.RELEASE] at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate (AbstractUserDetailsAuthenticationProvider.java:144) ~ [spring-security-core-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в org.springframework.security.authentication.ProviderManager.authenticate (ProviderManager.java:175) ~ [spring-security-core-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в org.springframework.security.authentication.ProviderManager.authenticate (ProviderManager.java:200) ~ [spring-security-core-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication (UsernamePasswordAuthenticationFilter.java:94) ~ [spring-security-web-5.1.4.RELEASE.jar: 5.1.4.RELEASE] at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter (AbstractAuthenticationProcessingFilter.java:212) [spring-security-web-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:334) [spring-security-web-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в org.springframework.security.web.authentication.logout.LogoutFilter.doFilter (LogoutFilter.java:116) [spring-security-web-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:334) [spring-security-web-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в org.springframework.security.web.csrf.CsrfFilter.doFilterInternal (CsrfFilter.java:124) [spring-security-web-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:107) [spring-web-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:334) [spring-security-web-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal (HeaderWriterFilter.java:74) [spring-security-web-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:107) [spring-web-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:334) [spring-security-web-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter (SecurityContextPersistenceFilter.java:105) [spring-security-web-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:334) [spring-security-web-5.1.4.RELEASE.jar: 5.1.4.RELEASE]at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal (WebAsyncManagerIntegrationFilter.java:56) [spring-security-web-5.1.4.RELEASE.jar: 5.1.4.RELEprings).web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:107) [spring-web-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в org.springframework.security.web.FilterChainProxy $ FilterFilterChaterter.do.java: 334) [spring-security-web-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в org.springframework.security.web.FilterChainProxy.doFilterInternal (FilterChainProxy.java:215) [spring-security-web-5.1.4.RELEASE.jar: 5.1.4.RELEASE] at org.springframework.security.web.FilterChainProxy.doFilter (FilterChainProxy.java:178) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE] на org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate (DelegatingFilterProxy.java:357) [spring-web-5.1.4.RELEASE.jar: 5.1.4.RELEASE] на org.springframework.web.filter.DelegatingFilterProxy.doFilter (DelegatingFilterProxy.java:270) [spring-web-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:193) [каталина.jar: 9.0.16] в org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166) [catalina.jar: 9.0.16] в org.apache.logging.log4j.web.Log4jServletFilter.doFilter (Log4jServletFilter.java:71) [log4j-web-2.11.1.jar: 2.11.1] в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:193) [catalina.jar: 9.0.16] вorg.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166) [catalina.jar: 9.0.16] в org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:200): 9.0.16] at org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:96) [catalina.jar: 9.0.16] at org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:490) [каталина.jar: 9.0.16] в org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:139) [catalina.jar: 9.0.16] в org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java: 92) [catalina.jar: 9.0.16] в org.apache.catalina.valves.AbstractAccessLogValve.invoke (AbstractAccessLogValve.java:668) [catalina.jar: 9.0.16] в org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:74) [catalina.jar: 9.0.16] в org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:343) [catalina.jar: 9.0.16] в орг.apache.coyote.http11.Http11Processor.service (Http11Processor.java:408) [tomcat-coyote.jar: 9.0.16] в org.apache.coyote.AbstractProcessorLight.process (AbstractProcessorLight.java:66) [tomcat-coy: 9.0.16] в org.apache.coyote.AbstractProtocol $ ConnectionHandler.process (AbstractProtocol.java:834) [tomcat-coyote.jar: 9.0.16] в org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun (NioEndpoint.java:1415) [tomcat-coyote.jar: 9.0.16] в org.apache.tomcat.util.net.SocketProcessorBase.run (SocketProcessorBase.java:49) [tomcat-coyote.jar: 9.0.16] в java.util.concurrent.ThreadPoolExecutor.runWorker (неизвестный источник) [?: 1.8.0_202]в java.util.concurrent.ThreadPoolExecutor $ Worker.run (неизвестный источник) [?: 1.8.0_202] в org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run (TaskThread.java:61) [tomcat-util.jar: 9.0.16] at java.lang.Thread.run (неизвестный источник) [?: 1.8.0_202] Причина: java.lang.ClassCastException: java.util.ArrayList не может быть приведен к com.model.User по адресуcom.dao.UserDaoImpl.findByUsername (UserDaoImpl.java:23) ~ [classes / :?] в com.service.UserServiceImpl.findByUsername (UserServiceImpl.java:26) ~ [classes / :?] в sun.reflect.NativeMetholAmpor.invoke0 (собственный метод) ~ [?: 1.8.0_202]at sun.reflect.NativeMethodAccessorImpl.invoke (неизвестный источник) ~ [?: 1.8.0_202] at sun.reflect.DelegatingMethodAccessorImpl.invoke (неизвестный источник) ~ [?: 1.8.0_202] at java.lang.reflect.Method.invoke(Неизвестный источник) ~ [?: 1.8.0_202] at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection (AopUtils.java:343) ~ [spring-aop-5.1.4.RELEASE.jar: 5.1.4.RELEASE] at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint (ReflectiveMethodInvocation.java:198) ~ [spring-aop-5.1.4.RELEASE.jar: 5.1.4..proceed (ReflectiveMethodInvocation.java:163) ~ [spring-aop-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction (TransactionAsjava: 29)spring-tx-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в org.springframework.transaction.interceptor.TransactionInterceptor.invoke (TransactionInterceptor.java:98) ~ [spring-tx-5.1.4.RELEASE.jar: 5.1.4.RELEASE] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:186) ~ [spring-aop-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в org.springra.framework.JdkDynamicAopProxy.invoke (JdkDynamicAopProxy.java:212) ~ [spring-aop-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в com.sun.proxy. $ Proxy238.findByUsername (Неизвестный источник) ~ [?:?] at com.service.UserDetailsServiceImpl.loadUserByUsername (UserDetailsServiceImpl.java:29) ~ [classes / :?] at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) ~ [?: 1.8.0_20f] at.NativeMethodAccessorImpl.invoke (Неизвестный источник) ~ [?: 1.8.0_202] at sun.reflect.DelegatingMethodAccessorImpl.invoke (Неизвестный источник) ~ [?: 1.8.0_202] at java.lang.reflect.Method.invoke (неизвестный источник)~ [?: 1.8.0_202] в org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection (AopUtils.java:343) ~ [spring-aop-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в орг.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint (ReflectiveMethodInvocation.java:198) ~ [spring-aop-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:16) -16:-5.1.4.RELEASE.jar: 5.1.4.RELEASE] at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction (TransactionAspectSupport.java:294) ~ [spring-tx-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в org.springframework.transaction.interceptor.TransactionInterceptor.invoke (TransactionInterceptor.java:98) ~ [spring-tx-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в org.springframework.aop.рамки) ~ [spring-aop-5.1.4.RELEASE.jar: 5.1.4.RELEASE] в com.sun.proxy. $ Proxy239.loadUserByUsername (неизвестный источник) ~ [?:?] в org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser (DaoAuthenticationProvider.java:108) ~ [spring-security-core-5.1.4.RELEASE.jar: 5.1.4.RELEASE] ... еще 45


1 Ответ

0 голосов
/ 13 марта 2019

Слишком много всего происходит для меня, но я думаю, что это просто тот случай, когда вы не можете одновременно создавать и вводить один и тот же компонент в одном классе.

Т.е.

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserDetailsService userDetailsService;

    @Bean
    public UserDetailsService userDetailsService() {...}
}

не будет работать.Подумайте об этом, вам нужно UserDetailsService, чтобы создать класс, который должен создать UserDetailsService.Как это сработает?

Вместо этого вы можете сделать следующее:

@EnableWebSecurity
@ComponentScan("com")
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public UserDetailsService userDetailsService() {
        return super.userDetailsService();
    }

    @Bean
    public DaoAuthenticationProvider getDaoAuthenticationProvider() {
        DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
        //call the userDetailsService() method here
        authProvider.setUserDetailsService(userDetailsService());
        authProvider.setPasswordEncoder(this.passwordEncoder());
        return authProvider;
    }

    ...

}

Хотя это выглядит странно, оно делает правильные вещи.Spring проксирует все вызовы методов, поэтому, когда вы, по-видимому, вызываете userDetailsService() напрямую, он фактически вводит соответствующий бин.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...