首页 > 其他分享 >Spring Security(5)

Spring Security(5)

时间:2022-11-25 09:11:16浏览次数:36  
标签:自定义 Spring 数据库 permitAll 60 logout successHandler Security

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

 

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

Spring Security也提供了这样的功能,也就是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()
            .and()
            .cors().and().csrf().disable();
}

 

 

在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实现记住我。

 

 


 

 

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

 

标签:自定义,Spring,数据库,permitAll,60,logout,successHandler,Security
From: https://www.cnblogs.com/xiangwang1111/p/16923330.html

相关文章

  • SpringCloud-OpenFeign-使用细节
    1.openfeign调用HttpServletRequest作为参数报错..(主要针对请求头信息透传)https://blog.csdn.net/qq_44783283/article/details/1135309102.OpenFeign传输文件(针对文件......
  • springboot笔记
    微服务阶段javase:OOPmysql:持久化html+css+js+jquery+框架:视图,框架不熟练,css不好;Javaweb:独立开发MVC三层架构的网站了:原始ssm:框架:简化了我们的开发流程,配置也开始较......
  • 在Spring Security中如何获取AuthenticationManager对象?
    有时需要使用AuthenticationManager(以下简称Manager)对象,可是这个对象不是Bean,没有直接保存在Spring的Bean库中。那么如何获取SpringSecurity中的这个对象呢?在SpringSecu......
  • SpringBoot整合Quartz
    1.Quartz1.1.Quartz简介Quartz是OpenSymphony开源组织在JobScheduling领域又一个开源项目,是完全由Java开发的一个开源任务日程管理系统,“任务进度管理器”就......
  • Spring 5 中文解析之测试篇-Spring测试介绍和单元测试
    微信公众号:测试本章介绍了Spring对集成测试的支持以及单元测试的最佳实践。Spring团队提倡测试驱动开发(TDD)。Spring的团队发现,正确使用控制反转(IoC)的确是简化单元测试和......
  • Spring 5 中文解析之测试篇-集成测试(下)
    3.6SpringMVC测试框架SpringMVC测试框架提供了一流的支持,可使用可与JUnit、TestNG或任何其他测试框架一起使用的流畅API测试SpringMVC代码。它基于​​spring-test​​......
  • Spring 5 中文解析之测试篇-集成测试(上)
    本节(本章其余部分)涵盖了Spring应用程序的集成测试。它包括以下主题:​​概要​​​​集成测试目标​​​​JDBC测试支持​​​​注解​​​​SpringTestContext框架​​​​......
  • Spring5全栈知识体系分享计划安排表
    Spring5全栈知识体系分享计划安排表第一阶段:翻译编号任务开始时间结束时间执行人完成进度1Spring52020-05-052020-10-01青年IT男已完成Spring-CoreSpring-TestingSpring-Da......
  • Spring Boot MongoDB How to remove _class from spring data mongodb collection
    摘要:在使用SpringBoot整合Mongodb的过程中,在做insert对象的时候,在Collection中会出现一个_class字段属性,出现这个问题的原因是在调用mongoTemplate的insert方法时,spring-......
  • Spring Boot 整合 RabbitMQ 之 Fanout Exchange模式 (三)
    摘要:那前面已经介绍过了Direct模式(一)Topic转发模式(二),这次介绍下FanoutExchange形式又叫广播形式,因此我们发送到路由器的消息会使得绑定到该路由器的每一个Queue接收......