zoukankan      html  css  js  c++  java
  • SpringSecurity(七): Remember-Me 记住我功能

    Remember-Me 记住我功能效果: 登录后会记住用户令牌,不用反复登录 。
     
    1. 用户选择了“记住我”成功登录后,将会把username、随机生成的序列号、生成的token存入一个数据库表中,同时将它们的组合生成一个cookie发送给客户端浏览器。
     
    2. 当没有登录的用户访问系统时,首先检查 remember-me 的 cookie 值 ,有则检查其值包含的 username、序列号和 token 与数据库中是否一致,一致则通过验证。并且系统还会重新生成一个新的 token 替换数据库中对应旧的 token,序列号 series 保持不变 ,同时删除旧的 cookie,重新生成 cookie 值(新的 token + 旧的序列号 + username)发送给客户端。
     
    3. 如果对应cookie不存在,或者包含的username、序列号和token 与数据库中保存的不一致,那么将会引导用户到登录页面。因为cookie被盗用后还可以在用户下一次登录前顺利的进行登录,所以如果你的应用对安全性要求比较高就不要使用Remember-Me功能。
     
    4.登录页面form表单中的imput标签中的name属性必须为remember-me         <input type="checkbox" name="remember-me" > 记住我
     
    5. 在安全配置类SpringSecurityConfig使用 JdbcTokenRepository 实现类,并进行配置
      
    /**
         * 记住我 功能
         */
        @Autowired
        DataSource dataSource;
        @Bean
        public JdbcTokenRepositoryImpl jdbcTokenRepository(){
            JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();
            jdbcTokenRepository.setDataSource(dataSource);
            // 是否启动时自动创建表,第一次启动创建就行,后面启动把这个注释掉,不然报错已存在表
            //jdbcTokenRepository.setCreateTableOnStartup(true);
            return jdbcTokenRepository;
        }
    
        /**
         * 资源权限配置(过滤器链):
         * 1、被拦截的资源
         * 2、资源所对应的角色权限
         * 3、定义认证方式:httpBasic 、httpForm
         * 4、定制登录页面、登录请求地址、错误处理方式
         * 5、自定义 spring security 过滤器
         *
         * @param http
         * @throws Exception
         */
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            //http.httpBasic()//采用httpBasic 认证方式
            /*http.formLogin()
                    .loginPage("/login/page")// 交给 /login/page 响应认证(登录)页面
                    .loginProcessingUrl("/login/form")  // 登录表单提交处理Url, 默认是 /login
                    .usernameParameter("name") // 默认用户名的属性名是 username
                    .passwordParameter("pwd") // 默认密码的属性名是 password
                    .and()
                    .authorizeRequests()//认证请求
                    .antMatchers("/login/page").permitAll()//自定义登录页不需要认证
                    .anyRequest().authenticated();// 所有进入应用的HTTP请求都要进行认证*/
    
            http.addFilterBefore(verifyCodeValidateFilter, UsernamePasswordAuthenticationFilter.class)//将校验过滤器 imageCodeValidateFilter 添加到 UsernamePasswordAuthenticationFilter 前面
                    .formLogin()
                    .loginPage(securityProperties.getLoginPage())// 交给 /login/page 响应认证(登录)页面
                    .loginProcessingUrl(securityProperties.getLoginProcessingUrl())  // 登录表单提交处理Url, 默认是 /login
                    .usernameParameter(securityProperties.getUsernameParameter()) // 默认用户名的属性名是 username
                    .passwordParameter(securityProperties.getPasswordParameter()) // 默认密码的属性名是 password
                    .successHandler(customAuthenticationSuccessHandler)//自定义认证成功处理器
                    .failureHandler(customAuthenticationFailureHandler)//自定义认证失败处理器
                    .and()
                    .authorizeRequests()//认证请求
                    .antMatchers(securityProperties.getLoginPage(),"/code/image").permitAll()//自定义登录页不需要认证,生成图片验证码也不需要验证
                    .anyRequest().authenticated()// 所有进入应用的HTTP请求都要进行认证
                    .and()
                    .rememberMe()//记住我功能
                    .tokenRepository(jdbcTokenRepository())//保存登录信息
                    .tokenValiditySeconds(7*24*60*60);//记住我有效时长一周
        }

    6.测试

    (1).数据库会自动创建表 persistent_logins
     

     (2).访问首页跳转到登录页面,登录成功后,查看浏览器 cookies,有保存 token 值。数据库中也有数据

      未登录前:

      

      登录时勾选记住我

       登录后:

        浏览器:

       数据库:

       (3). 再重启,Session会把清除。再次访问首页,不会跳转到登录页,因为上次已经记录了。这时浏览器会带着Cookie中保存的token从数据库查找用户名,然后进行自动登录。

     7.底层源码debugger

      

    (1)

     (2)

     (3)

     (4)

     (5)

     完整代码地址:https://gitee.com/zhechaochao/security-parent.git

  • 相关阅读:
    Problem of saving images in WPF (RenderTargetBitmap)zz
    巴特沃斯(Butterworth)滤波器 (2)
    巴特沃斯(Butterworth)滤波器 (1)
    vs发布的程序不依赖运行时库msvcp100.dll
    [leetcode]Word Search @ Python
    [leetcode]Merge Sorted Array @ Python
    [leetcode]Set Matrix Zeroes @ Python
    [leetcode]Restore IP Addresses @ Python
    [leetcode]Interleaving String @ Python
    [leetcode]Distinct Subsequences @ Python
  • 原文地址:https://www.cnblogs.com/yscec/p/14244330.html
Copyright © 2011-2022 走看看