从刚开始学习Spring Security时,在配置类中一直存在这样一行代码:

//关闭csrf防护
http.csrf().disable();

如果没有这行代码导致用户无法被认证。

这行代码的含义是:关闭csrf防护。

1.什么是CSRF?

CSRF(Cross-site request forgery)跨域请求伪造,也被称为“OneClick Attack”或者 Session Riding。通过伪造用户请求访问受信任站点的非法请求访问。

跨域:只要网络协议,IP地址,端口中任意一个不相同就是跨域请求。

客户端与服务进行交互时,由于http协议本身是无状态协议,所以引入了cookie进行记录客户端身份。在cookie中会存放session id用来识别客户端身份的。

在跨域的情况下,session id可能被第三方恶意劫持,通过这个session id向服务端发起请求时,服务端会认为这个请求是合法的,可能发生很多意想不到的事情

2.Spring Security中的CSRF

从Spring Security4开始CSRF防护默认开启。默认会拦截请求。进行CSRF处理。

CSRF为了保证不是其他第三方网站访问,要求访问时携带参数名为 _csrf 值为 token(token在服务端产生)的内容,如果token和服务器的token匹配成功,则正常访问。

3.实践:

1.复制static中的login.html到template中



2.将SecurityConfig配置中的关闭CSRF防护注释掉



3.给template中的login.html添加命名空间

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">

4.到controller控制层去写页面跳转

/**
 * @return { java.lang.String}
 * @throws
 * @Author etern
 * @Description //TODO 开启scrf防护后跳转登录页面
 * @Date 12:11 2022/2/8
 * @Param * @param
 **/
@RequestMapping("showLogin")
public String showLogin() {
    return "login";
}

5.到SecurityConfig配置中将自定义的登录页面loginPage修改为上面的跳转链接



拦截器放行也需要将showLogin放行

.antMatchers("/showLogin").permitAll()

6.在template中的login.html中添加CSRF需要的token并进行判断

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
    
    <title>Title</title>
</head>

<from action="/login" method="post">
    <!-- hidden:隐藏域 th:value="${_csrf.token}":获取服务器端产生的token值 th:if="${_csrf}":判断token值是否与服务器中的token值一致 -->
    
    用户名:<br>
    密码:<br>
    记住我:<br>
    
</from>

</html>