链接上一篇文章: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 过滤器来完成。