当前位置: 首页 > 科技观察

SpringSecurity功能实现及源码分析

时间:2023-03-12 22:55:34 科技观察

环境:SpringBoot2.2.11.RELEASE请先阅读《Spring Boot Security防重登录及在线总数 》、《Springboot Security 基础应用 (1) 》相关配置安全配置@ResourceprivateDataSourcedataSource;//这里配置持久登录令牌@BeanpublicPersistentTokenRepositorypersistentTokenRepository(){JdbcTokenRepositoryImpltokenRepository=newJdbcTokenRepositoryImpl();tokenRepository.setDataSource(dataSource);returntokenRepository;}SQL脚本进入JdbcTokenRepositoryImpl复制CREATE_TABLE_SQL语句并执行。HttpSecurity配置http.rememberMe().tokenRepository(persistentTokenRepository()).userDetailsS??ervice(userDetailsS??ervice())//UserDetailsS??ervice.tokenValiditySeconds(1800)用于查询记住我功能有效期内的用户详情;//token有效期登录页面Rememberme

注意这里checkbox的name属性值必须是remember-me。这样就可以实现记住我的功能。只要token有效,每次打开页面都不需要重新登录。测试登录后,关闭浏览器改写后再打开页面,无需重新登录,查看数据表如下:源码分析我们从第一次登录开始1.1首先进入UsernamePasswordAuthenticationFilter过滤器,进入该过滤器的doFilter方法父类(AbstractAuthenticationProcessingFilter)。直接进入登录成功的方法1.2执行successfulAuthentication方法successfulAuthentication(request,response,chain,authResult);1.3进入loginSuccess方法在AbstractRememberMeServices类中进入loginSuccess方法1.4执行子类PersistentTokenBasedRememberMeServices中的onLoginSuccess方法。这里的tokenRepository就是我们上面配置的。那我们再看看如何实现再次打开浏览器免登录。1.1首先执行RememberMeAuthenticationFilter的doFilter方法。只有启用“记住我”功能,此过滤器才会生效。从当前Security上下文中获取对象,但不能通过rememberMeService自动登录1.2执行AbstractRememberMeServices中的autoLogin方法执行extractRememberMeCookie方法获取cookie中的remember-me信息1.3执行processAutoLoginCookie方法这里解析的信息已经匹配到数据库。这样就可以得到用户名了。1.4接下来对token是否过期进行一些判断,更新token的有效期,验证是否过期。更新令牌的有效期。1.5根据查询到的用户名查询用户信息returngetUserDetailsS??ervice().loadUserByUsername(token.getUsername());1.6最后将用户信息存入SecurityDoneincontext!!!