spring-security(记住密码,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();