项目中Spring Security 整合Spring Session实现记住我功能

Spring Session提供了与Spring Security的“我记得”身份验证的集成的支持:

目的:

 

  • 更改会话过期长度
  • 确保会话cookie在Integer.MAX_VALUE处过期。将cookie过期设置为最大的可能值,因为只有在创建会话时才设置cookie。如果将其设置为与会话到期相同的值,那么当用户使用该值时,会话将得到更新,但是cookie过期不会更新,导致过期时间被修复。

具体做法:

1.login.html

     

注意:name必须为remember-me,否则设置失败。

2.SecurityConfig配置


   
   
   
   
  1. @Override
  2. protected void configure(HttpSecurity http) throws Exception {
  3. http.authorizeRequests() // 该方法所返回的对象的方法来配置请求级别的安全细节
  4. .antMatchers(HttpMethod.GET, "/user/login", "/user/forget", "/user/regist").permitAll() // 登录页面不拦截
  5. .antMatchers(HttpMethod.POST, "/user/checkLogin").permitAll().anyRequest().authenticated() // 对于登录路径不进行拦截
  6. .and().formLogin() // 配置登录页面
  7. .loginPage( "/user/login") // 登录页面的访问路径;
  8. .loginProcessingUrl( "/user/checkLogin") // 登录页面下表单提交的路径
  9. .failureUrl( "/user/login?error=true") // 登录失败后跳转的路径,为了给客户端提示
  10. .defaultSuccessUrl( "/index") // 登录成功后默认跳转的路径;
  11. .and().logout() // 用户退出操作
  12. .logoutRequestMatcher( new AntPathRequestMatcher( "/user/logout", "POST")) // 用户退出所访问的路径,需要使用Post方式
  13. .permitAll().logoutSuccessUrl( "/user/login?logout=true") /// 退出成功所访问的路径
  14. .and().csrf().disable().rememberMe().rememberMeServices(rememberMeServices()).and().headers()
  15. .frameOptions() // 允许iframe内呈现。
  16. .sameOrigin().and().sessionManagement().maximumSessions( 1).expiredUrl( "/user/login?expired=true");
  17. }
  18. @Bean
  19. public static RememberMeServices rememberMeServices() {
  20. SpringSessionRememberMeServices rememberMeServices = new SpringSessionRememberMeServices();
  21.  / /设置 1000秒后过期
  22. rememberMeServices.setValiditySeconds( 1000);
  23. return rememberMeServices;
  24. }

源码:

      //登录成功后的检验


   
   
   
   
  1.   public final void loginSuccess(HttpServletRequest request,
  2. HttpServletResponse response, Authentication successfulAuthentication) {
  3.   //alwaysRemember:默认为false,设置true为永久记住
  4. if (! this.alwaysRemember
  5. && !rememberMeRequested(request, this.rememberMeParameterName)) {
  6. logger.debug( "Remember-me login not requested.");
  7. return;
  8. }
  9. request.setAttribute(REMEMBER_ME_LOGIN_ATTR, true);
  10.                 //validitySeconds默认为2592000 即30天
  11. request.getSession().setMaxInactiveInterval( this.validitySeconds);
  12. }
  13. /**
  14. * Allows customization of whether a remember-me login has been requested. The default
  15. * is to return {@code true} if the configured parameter name has been included in the
  16. * request and is set to the value {@code true}.
  17. * @param request the request submitted from an interactive login, which may include
  18. * additional information indicating that a persistent login is desired.
  19. * @param parameter the configured remember-me parameter name.
  20. * @return true if the request includes information indicating that a persistent login
  21. * has been requested.
  22. */
  23. protected boolean rememberMeRequested(HttpServletRequest request, String parameter) {
  24.       //获取参数remember-me对应的值
  25. String rememberMe = request.getParameter(parameter);
  26.   //如果设置满足以下条件证明用户设置了记住我的功能
  27. if (rememberMe != null) {
  28. if (rememberMe.equalsIgnoreCase( "true") || rememberMe.equalsIgnoreCase( "on")
  29. || rememberMe.equalsIgnoreCase( "yes") || rememberMe.equals( "1")) {
  30. return true;
  31. }
  32. }
  33. if (logger.isDebugEnabled()) {
  34. logger.debug( "Did not send remember-me cookie (principal did not set "
  35. + "parameter '" + parameter + "')");
  36. }
  37. return false;
  38. }

                                           项目中Spring Security 整合Spring Session实现记住我功能_第1张图片

                                                                       JAVA程序猿成长之路

                                                    分享学习资源,学习方法,记录程序员生活。

 

你可能感兴趣的:(项目中Spring Security 整合Spring Session实现记住我功能)