关于spring-security(记住密码,CSRF)

 更新时间:2024年11月16日 08:56:54   作者:何老生  
文章主要介绍了Spring Security中的PersistentTokenRepository、CSRF保护机制以及如何在登录页面添加记住我功能,并分享了相关实现代码和配置

注册PersistentTokenRepository

  • PersistentTokenRepository实现类
  • InMemoryTokenRepositoryImpl基于内存实现
  • JdbcTokenRepositoryImpl基于数据库实现

基于内存实现

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public PersistentTokenRepository persistentTokenRepository() {
PersistentTokenRepository tokenRepository = new InMemoryTokenRepositoryImpl();
return tokenRepository;
}
}

修改安全配置类

http.rememberMe().tokenRepository(persistentTokenRepository())
                .tokenValiditySeconds(120)//设置有效时长,单位秒
                .userDetailsService(userDetailsService)

页面添加记住我复选框

记住我:

<input type="checkbox"name="remember-me"title="记住密码"/><br/>

此处:name 属性值必须位remember-me.不能改为其他值

CSRF 理解(默认开启)

跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

跟跨网站脚本(XSS)相比,XSS利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。

由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。

这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。

从Spring Security 4.0开始,默认情况下会启用CSRF保护,以防止CSRF攻击应用程序,Spring Security CSRF会针对PATCH,POST,PUT和DELETE方法进行防护。

解决方案

检查Referer字段

Referer字段通常由浏览器在HTTP请求中发送,告诉服务器用户是从哪个页面链接过来的。然而,由于Referer字段可以被用户修改或禁用,因此不能完全信任它来确保请求是从指定页面发起的。

以下是检查Referer字段的一些常见缺点:

  • 用户可以修改Referer字段:一些用户可能会修改HTTP请求头中的Referer字段,以试图绕过安全检查。
  • Referer字段可能被缓存:某些代理服务器或缓存服务器可能会缓存Referer字段

CSRFToken

由于CSRF 是开启的所以我们在登陆是未检出token,则被认定为csrf攻击,报异常

security实现

在登录页面添加一个隐藏域:

<input type="hidden"th:if="${_csrf}!=null" th:value="${_csrf.token}" name="_csrf"/>

关闭安全配置的类中的csrf

// http.csrf().disable();

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • HttpClient详细使用示例详解

    HttpClient详细使用示例详解

    这篇文章主要介绍了HttpClient详细使用示例详解,本文给大家介绍的非常想详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Java泛型中的通配符举例详解

    Java泛型中的通配符举例详解

    Java泛型中的通配符是指使用"?"来表示未知类型,可以用于定义泛型类、泛型方法和泛型接口,下面这篇文章主要给大家介绍了关于Java泛型中通配符的相关资料,需要的朋友可以参考下
    2023-06-06
  • springboot多模块化整合mybatis,mapper自动注入失败问题及解决

    springboot多模块化整合mybatis,mapper自动注入失败问题及解决

    这篇文章主要介绍了springboot多模块化整合mybatis,mapper自动注入失败问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • java 数据结构 冒泡排序实现代码

    java 数据结构 冒泡排序实现代码

    这篇文章主要介绍了java 数据结构 冒泡排序的相关资料,并附实例代码,有需要的小伙伴可以参考下
    2016-09-09
  • Java基于HttpClient实现RPC的示例

    Java基于HttpClient实现RPC的示例

    HttpClient可以实现使用Java代码完成标准HTTP请求及响应。本文主要介绍了Java基于HttpClient实现RPC,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • SpringBoot Redis配置Fastjson进行序列化和反序列化实现

    SpringBoot Redis配置Fastjson进行序列化和反序列化实现

    这篇文章主要介绍了SpringBoot Redis配置Fastjson进行序列化和反序列化实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Java源码解析HashMap成员变量

    Java源码解析HashMap成员变量

    今天小编就为大家分享一篇关于Java源码解析HashMap成员变量,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • 超详细解释Java反射

    超详细解释Java反射

    本文非常详细的讲解了java反射具体的内容以及使用,java反射在现今的使用中很频繁,希望此文可以帮大家解答疑惑,可以帮助大家理解
    2021-11-11
  • Spring Boot 开发私有即时通信系统(WebSocket)

    Spring Boot 开发私有即时通信系统(WebSocket)

    本文利用Spring Boot作为基础框架,Spring Security作为安全框架,WebSocket作为通信框架,实现点对点聊天和群聊天
    2017-04-04
  • JDK1.6“新“特性Instrumentation之JavaAgent(推荐)

    JDK1.6“新“特性Instrumentation之JavaAgent(推荐)

    这篇文章主要介绍了JDK1.6“新“特性Instrumentation之JavaAgent,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08

最新评论