spring学习之springSecurity(六)之记住我和csrf

我爱海鲸 2022-11-08 13:09:53 java

简介web鉴权、基于数据库的记住我

链接上一篇文章:spring学习之springSecurity(五)

1、基于数据库记住我

创建表

CREATE TABLE `persistent_logins` (
 `username` varchar(64) NOT NULL,
 `series` varchar(64) NOT NULL,
 `token` varchar(64) NOT NULL,
 `last_used` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE 
CURRENT_TIMESTAMP,
 PRIMARY KEY (`series`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

编写配置类

@Configuration
public class BrowserSecurityConfig {
@Autowired
private DataSource dataSource;
@Bean
public PersistentTokenRepository persistentTokenRepository(){
 JdbcTokenRepositoryImpl jdbcTokenRepository = new 
JdbcTokenRepositoryImpl();
// 赋值数据源
jdbcTokenRepository.setDataSource(dataSource);
// 自动创建表,第一次执行会创建,以后要执行就要删除掉!
jdbcTokenRepository.setCreateTableOnStartup(true);
return jdbcTokenRepository;
 }
}

修改安全配置类

@Autowired
private UsersServiceImpl usersService;
@Autowired
private PersistentTokenRepository tokenRepository;
// 开启记住我功能
http.rememberMe()
 .tokenRepository(tokenRepository)
 .userDetailsService(usersService);

页面添加记住我复选框

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

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

设置有效期

默认 2 周时间。但是可以通过设置状态有效时间,即使项目重新启动下次也可以正常登
录。

在配置文件中设置

        // 开启记住我功能
        http.rememberMe()
                // 单位是秒
                .tokenValiditySeconds(10) 
                .tokenRepository(tokenRepository)
                .userDetailsService(myUserDetailsService);

用户注销

在登录页面添加一个退出连接

success.html

<body>
登录成功<br>
<a href="/logout">退出</a>
</body>

在配置类中添加退出映射地址

http.logout().logoutUrl("/logout").logoutSuccessUrl("/index").permitAll()

退出之后,是无法访问需要登录时才能访问的控制器!

2、CSRF

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 方法进行防护。

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

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

关闭安全配置的类中的 csrf

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

Spring Security 实现 CSRF 的原理: 

生成 csrfToken 保存到 HttpSession 或者 Cookie 中。

SaveOnAccessCsrfToken 类有个接口 CsrfTokenRepository

当前接口实现类:HttpSessionCsrfTokenRepository,CookieCsrfTokenRepository

请求到来时,从请求中提取 csrfToken,和保存的 csrfToken 做比较,进而判断当
前请求是否合法。主要通过 CsrfFilter 过滤器来完成。

 

 

你好:我的2025