AutoLogin与spring security不工作

AutoLogin与spring security不工作,spring,spring-security,autologin,Spring,Spring Security,Autologin,成功注册用户后,我已实现自动登录功能。但它停止了 AuthenticationAuthenticatedUser=authenticationManager.Authentication(用户名密码AuthenticationToken) 没有给出任何错误。有人能纠正我的错误吗 SecurityConfiguration.java @Configuration @EnableWebSecurity public class SecurityConfiguration extends WebSec

成功注册用户后,我已实现自动登录功能。但它停止了

AuthenticationAuthenticatedUser=authenticationManager.Authentication(用户名密码AuthenticationToken)

没有给出任何错误。有人能纠正我的错误吗

SecurityConfiguration.java

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    CustomSuccessHandler customSuccessHandler;
    @Autowired
    DataSource dataSource;

    @Autowired
    public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {

        auth.jdbcAuthentication().dataSource(dataSource).passwordEncoder(passwordEncoder())
                .usersByUsernameQuery("SELECT username, password, enabled FROM users WHERE username = ?")
                .authoritiesByUsernameQuery("SELECT username, authority FROM authorities WHERE username = ?");
    }

    @Bean
    public PasswordEncoder passwordEncoder() {

        PasswordEncoder encoder = new BCryptPasswordEncoder();
        return encoder;
    }

    @Autowired
    @Bean(name = "authenticationManager")
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    /*
     * @Bean public DaoAuthenticationProvider authenticationProvider() {
     * DaoAuthenticationProvider authenticationProvider = new
     * DaoAuthenticationProvider();
     * authenticationProvider.setPasswordEncoder(passwordEncoder()); return
     * authenticationProvider; }
     */

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests()
            .antMatchers("/").permitAll()
            .antMatchers("/home/**").access("hasRole('ROLE_USER')")
            .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
            .and()

        .formLogin()
        .loginPage("/login").failureUrl("/login?error").loginProcessingUrl("/j_spring_security_check")
        .successHandler(customSuccessHandler).usernameParameter("username").passwordParameter("password").and()
        .logout().logoutSuccessUrl("/j_spring_security_logout").and().exceptionHandling()
        .accessDeniedPage("/403").and().csrf().and().rememberMe().tokenRepository(persistentTokenRepository())
        .tokenValiditySeconds(86400);
        /*
         * .and().exceptionHandling().accessDeniedPage("/Access_Denied");
         */ }

    @Bean
    public PersistentTokenRepository persistentTokenRepository() {
        JdbcTokenRepositoryImpl db = new JdbcTokenRepositoryImpl();
        db.setDataSource(dataSource);
        return db;
    }

    @Bean
    public AuthenticationTrustResolver getAuthenticationTrustResolver() {
        return new AuthenticationTrustResolverImpl();
    }

}
这是我的注册请求映射:

@RequestMapping(value = "/registerHere", method = RequestMethod.POST)
public ModelAndView registerUser(@ModelAttribute("user") Users user, BindingResult result,
        HttpServletRequest request, HttpServletResponse response) {
    System.out.println("Starting register");

    ModelAndView mv = new ModelAndView("/home");
    mv.addObject("homePagee", "true");

    String uname = user.getUsername();

    if (userDAO.getUserByName(uname) == null) {

        userDAO.saveOrUpdate(user);
        /*
         * userDAO.autologin(user.getUsername(), user.getPassword());
         */
        authenticateUserAndSetSession(user, request);


    }

    System.out.println("ending register");

    log.debug("Ending of the method registerUser");
    return mv;
}
private void authenticateUserAndSetSession(Users user, HttpServletRequest request){

    String username = user.getUsername();
    String password = user.getPassword();
    System.out.println("username:  " + username + " password: " + password);                        

    UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(username, password);
    request.getSession();

    System.out.println("Line Authentication 1");

    usernamePasswordAuthenticationToken.setDetails(new WebAuthenticationDetails(request));

    System.out.println("Line Authentication 2");

    Authentication authenticatedUser = authenticationManager.authenticate(usernamePasswordAuthenticationToken);// authenticates the token

    System.out.println("Line Authentication 3");


    if (usernamePasswordAuthenticationToken.isAuthenticated()) {
        SecurityContextHolder.getContext().setAuthentication(authenticatedUser);
        System.out.println("Line Authentication 4");

    }

 request.getSession().setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, SecurityContextHolder.getContext());// creates context for that session.

    System.out.println("Line Authentication 5");

    session.setAttribute("username", user.getUsername());

    System.out.println("Line Authentication 6");

    session.setAttribute("authorities", usernamePasswordAuthenticationToken.getAuthorities());

    System.out.println("username:  " + user.getUsername() + "password: " + user.getPassword()+"authorities: "+ usernamePasswordAuthenticationToken.getAuthorities());

    user = userDAO.validate(user.getUsername(), user.getPassword());
    log.debug("You are successfully register");

}
当我注册控制台时:

Hibernate: 
insert 
into
    Cart
    (addedDate, grandTotal, usersID, cartId) 
values
    (?, ?, ?, ?)
Hibernate: 
    update
        USERS 
    set
        billingAddressId=?,
        cartId=?,
        email=?,
        enabled=?,
        mobile=?,
        name=?,
        password=?,
        role=?,
        shippingAddressId=?,
        STATE=?,
        username=? 
    where
        usersID=?
    username:  do password: $2a$10$YX.AKZYoI0g7xAN8mzlHOurK8Hys4aX2Iw75OE.6qgpZ6PeV4qHoy
    Line Authentication 1
    Line Authentication 2
@RequestMapping(value = "/registerHere", method = RequestMethod.POST)
    public ModelAndView registerUser(@ModelAttribute("user") Users user, BindingResult result,
            HttpServletRequest request, HttpServletResponse response) {
        System.out.println("register 3");

        ModelAndView mv = new ModelAndView("/home");
        mv.addObject("homePagee", "true");

        String uname = user.getUsername();

        if (userDAO.getUserByName(uname) == null) {

            String passwordFromForm = user.getPassword();
            userDAO.saveOrUpdate(user);

            try {
                authenticateUserAndSetSession(user, passwordFromForm, request);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


        }

        System.out.println("register 4");

        log.debug("Ending of the method registerUser");
        return mv;
    }
 private void authenticateUserAndSetSession(Users user, String passwordFromForm, HttpServletRequest request){

        String username = user.getUsername();
        System.out.println("username:  " + username + " password: " + passwordFromForm);                        

        UserDetails userDetails = userDetailsService.loadUserByUsername(user.getUsername());

        UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(username, passwordFromForm, userDetails.getAuthorities());
        request.getSession();

        System.out.println("Line Authentication 1");

        usernamePasswordAuthenticationToken.setDetails(new WebAuthenticationDetails(request));

        System.out.println("Line Authentication 2");

        Authentication authenticatedUser = authenticationManager.authenticate(usernamePasswordAuthenticationToken);

        System.out.println("Line Authentication 3");


        if (usernamePasswordAuthenticationToken.isAuthenticated()) {
            SecurityContextHolder.getContext().setAuthentication(authenticatedUser);
            System.out.println("Line Authentication 4");

        }

     request.getSession().setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, SecurityContextHolder.getContext());// creates context for that session.

        System.out.println("Line Authentication 5");

        session.setAttribute("username", user.getUsername());

        System.out.println("Line Authentication 6");

        session.setAttribute("authorities", usernamePasswordAuthenticationToken.getAuthorities());

        System.out.println("username:  " + user.getUsername() + "password: " + user.getPassword()+"authorities: "+ usernamePasswordAuthenticationToken.getAuthorities());

        user = userDAO.validate(user.getUsername(), user.getPassword());
        log.debug("You are successfully register");

    }

线路认证2后停止运行。是否知道我遗漏了什么?

我已经解决了,上面问题的答案是 在控制器中:

Hibernate: 
insert 
into
    Cart
    (addedDate, grandTotal, usersID, cartId) 
values
    (?, ?, ?, ?)
Hibernate: 
    update
        USERS 
    set
        billingAddressId=?,
        cartId=?,
        email=?,
        enabled=?,
        mobile=?,
        name=?,
        password=?,
        role=?,
        shippingAddressId=?,
        STATE=?,
        username=? 
    where
        usersID=?
    username:  do password: $2a$10$YX.AKZYoI0g7xAN8mzlHOurK8Hys4aX2Iw75OE.6qgpZ6PeV4qHoy
    Line Authentication 1
    Line Authentication 2
@RequestMapping(value = "/registerHere", method = RequestMethod.POST)
    public ModelAndView registerUser(@ModelAttribute("user") Users user, BindingResult result,
            HttpServletRequest request, HttpServletResponse response) {
        System.out.println("register 3");

        ModelAndView mv = new ModelAndView("/home");
        mv.addObject("homePagee", "true");

        String uname = user.getUsername();

        if (userDAO.getUserByName(uname) == null) {

            String passwordFromForm = user.getPassword();
            userDAO.saveOrUpdate(user);

            try {
                authenticateUserAndSetSession(user, passwordFromForm, request);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


        }

        System.out.println("register 4");

        log.debug("Ending of the method registerUser");
        return mv;
    }
 private void authenticateUserAndSetSession(Users user, String passwordFromForm, HttpServletRequest request){

        String username = user.getUsername();
        System.out.println("username:  " + username + " password: " + passwordFromForm);                        

        UserDetails userDetails = userDetailsService.loadUserByUsername(user.getUsername());

        UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(username, passwordFromForm, userDetails.getAuthorities());
        request.getSession();

        System.out.println("Line Authentication 1");

        usernamePasswordAuthenticationToken.setDetails(new WebAuthenticationDetails(request));

        System.out.println("Line Authentication 2");

        Authentication authenticatedUser = authenticationManager.authenticate(usernamePasswordAuthenticationToken);

        System.out.println("Line Authentication 3");


        if (usernamePasswordAuthenticationToken.isAuthenticated()) {
            SecurityContextHolder.getContext().setAuthentication(authenticatedUser);
            System.out.println("Line Authentication 4");

        }

     request.getSession().setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, SecurityContextHolder.getContext());// creates context for that session.

        System.out.println("Line Authentication 5");

        session.setAttribute("username", user.getUsername());

        System.out.println("Line Authentication 6");

        session.setAttribute("authorities", usernamePasswordAuthenticationToken.getAuthorities());

        System.out.println("username:  " + user.getUsername() + "password: " + user.getPassword()+"authorities: "+ usernamePasswordAuthenticationToken.getAuthorities());

        user = userDAO.validate(user.getUsername(), user.getPassword());
        log.debug("You are successfully register");

    }
控制器中的上述方法定义为:

Hibernate: 
insert 
into
    Cart
    (addedDate, grandTotal, usersID, cartId) 
values
    (?, ?, ?, ?)
Hibernate: 
    update
        USERS 
    set
        billingAddressId=?,
        cartId=?,
        email=?,
        enabled=?,
        mobile=?,
        name=?,
        password=?,
        role=?,
        shippingAddressId=?,
        STATE=?,
        username=? 
    where
        usersID=?
    username:  do password: $2a$10$YX.AKZYoI0g7xAN8mzlHOurK8Hys4aX2Iw75OE.6qgpZ6PeV4qHoy
    Line Authentication 1
    Line Authentication 2
@RequestMapping(value = "/registerHere", method = RequestMethod.POST)
    public ModelAndView registerUser(@ModelAttribute("user") Users user, BindingResult result,
            HttpServletRequest request, HttpServletResponse response) {
        System.out.println("register 3");

        ModelAndView mv = new ModelAndView("/home");
        mv.addObject("homePagee", "true");

        String uname = user.getUsername();

        if (userDAO.getUserByName(uname) == null) {

            String passwordFromForm = user.getPassword();
            userDAO.saveOrUpdate(user);

            try {
                authenticateUserAndSetSession(user, passwordFromForm, request);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


        }

        System.out.println("register 4");

        log.debug("Ending of the method registerUser");
        return mv;
    }
 private void authenticateUserAndSetSession(Users user, String passwordFromForm, HttpServletRequest request){

        String username = user.getUsername();
        System.out.println("username:  " + username + " password: " + passwordFromForm);                        

        UserDetails userDetails = userDetailsService.loadUserByUsername(user.getUsername());

        UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(username, passwordFromForm, userDetails.getAuthorities());
        request.getSession();

        System.out.println("Line Authentication 1");

        usernamePasswordAuthenticationToken.setDetails(new WebAuthenticationDetails(request));

        System.out.println("Line Authentication 2");

        Authentication authenticatedUser = authenticationManager.authenticate(usernamePasswordAuthenticationToken);

        System.out.println("Line Authentication 3");


        if (usernamePasswordAuthenticationToken.isAuthenticated()) {
            SecurityContextHolder.getContext().setAuthentication(authenticatedUser);
            System.out.println("Line Authentication 4");

        }

     request.getSession().setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, SecurityContextHolder.getContext());// creates context for that session.

        System.out.println("Line Authentication 5");

        session.setAttribute("username", user.getUsername());

        System.out.println("Line Authentication 6");

        session.setAttribute("authorities", usernamePasswordAuthenticationToken.getAuthorities());

        System.out.println("username:  " + user.getUsername() + "password: " + user.getPassword()+"authorities: "+ usernamePasswordAuthenticationToken.getAuthorities());

        user = userDAO.validate(user.getUsername(), user.getPassword());
        log.debug("You are successfully register");

    }
其他答案并没有建议将其放入try/catch中,所以我们不知道为什么逻辑不能在代码运行时工作……而且控制台上也并没有任何错误或异常。所以,如果你不把它放在try-catch中,你就不会得到坏证书的例外