首页IT科技自定义springstarter(Spring Security(5))

自定义springstarter(Spring Security(5))

时间2025-06-21 08:52:56分类IT科技浏览4440
导读:您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~...

您好            ,我是湘王                  ,这是我的博客园      ,欢迎您来            ,欢迎您再来~

经常上网的人都应该有这样的体验:很多网站或者APP只需要第一次登录时输入用户名和密码之后                  ,后面很长一段时间内就不需要再次输入密码了            。这确实是一个非常好的体验      ,不然每次都让人输用户名和密码就太麻烦了                  。

SpringSecurity也提供了这样的功能      ,也就是Remember-Me(记住我)      。

要实现这个功能也异常简单:只需要稍稍修改一下WebSecurityConfiguration即可:

postman的参数中增加remember-me参数                  ,并设为true再访问就行了:

结果也很清楚:

虽然用cookie实现记住我很方便            ,但是如果涉及到敏感信息的话      ,cookie太过简单满足不了需求            。所以                  ,Spring Security提供了另外一种实现机制:保存到数据库中                  。也就是自动登录时            ,用cookie中的加密串到数据库中验证,如果通过                  ,自动登录才算成功      。使用这种方式实现remember-me很简单                  ,只需要在WebSecurityConfiguration中增加一段代码就行了:

// 控制逻辑 @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() // 设置自定义认证成功            、失败及登出处理器 .and().formLogin().loginPage("/login") .successHandler(successHandler).failureHandler(failureHandler).permitAll() .and().logout().logoutUrl("/logout").deleteCookies("JSESSIONID") .logoutSuccessHandler(logoutSuccessHandler).permitAll() // 配置无权访问的自定义处理器 .and().exceptionHandling().accessDeniedHandler(accessDeniedHandler) // 记住我 .and().rememberMe() // 数据库保存,这种方式在关闭服务之后仍然有效 .tokenRepository(persistentTokenRepository()) // 默认的失效时间会从用户最后一次操作开始计算过期时间            ,过期时间最小值就是60秒                  , // 如果设置的值小于60秒      ,也会被更改为60秒 .tokenValiditySeconds(30 * 24 * 60 * 60) .and() .cors().and().csrf().disable(); }

因为需要在数据库中保存            ,那么自然就需要创建相应的数据库表:

同样                  ,在WebSecurityConfiguration中再加入如下代码(需要注意的是      ,datasource是不能够通过连接池得到的      ,这里连接池注入的是javax.sql.DataSource):

// 如果使用hikariCP这里就无法注入DataSource @Autowired private DataSource dataSource; // MySQL方式实现记住我 @Bean public PersistentTokenRepository persistentTokenRepository() { // mysql方式 JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl(); // 需要给JdbcTokenRepositoryImpl注入一个数据源                  ,实现CRUD tokenRepository.setDataSource(dataSource); return tokenRepository; }

这样就可以了            ,然后运行postman进行测试      。

可以看到      ,由于是60秒失效                  ,因此在第一次访问60秒后            ,再调用同样的接口时,名称为remember-me的cookie消失了                  。数据库的persistent_logins表中也多了一条用户访问记录            。

失效规律:

1                  、过期时间的最小值是60秒                  ,如果设置的值小于60秒                  ,也会被更改为60秒;

2      、默认的失效时间会从用户最后一次操作开始计算过期时间      。

MySQL虽然方便,但是一般MySQL是用来保存主要业务数据的            ,这种技术性的数据最好不要和业务混在一起                  。所以                  ,下一次就来说说怎么用NoSQL实现记住我            。

感谢您的大驾光临!咨询技术      、产品                  、运营和管理相关问题      ,请关注后留言。欢迎骚扰            ,不胜荣幸~

声明:本站所有文章                  ,如无特殊说明或标注      ,均为本站原创发布                  。任何个人或组织      ,在未征得本站同意时                  ,禁止复制            、盗用      、采集                  、发布本站内容到任何网站            、书籍等各类媒体平台                  。如若本站内容侵犯了原著者的合法权益            ,可联系我们进行处理。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
java程序开发实战教程答案(读Java实战(第二版)笔记07_用Optional取代null)