MALOUDA-PSA 2024-06-27 16:09 采纳率: 85.6%
浏览 5
已结题

springSecurity中Csrf的问题


        http.formLogin()  //自定义自己编写的登录页面
                .loginPage("/login.html")  //登录页面设置
                .loginProcessingUrl("/user/login")  //登录访问路径
                .defaultSuccessUrl("/main.html").permitAll() //登录成功之后,跳转路径
                .and().authorizeRequests()
                .antMatchers("/test/hello", "/usr/login").permitAll() //设置那些路径可以直接访问,不需要认证
                //.antMatchers("/user/demo","/usr/test").hasAuthority("admins")  //方法2
//                .antMatchers("/user/demo","/usr/test").hasAnyAuthority("admins","users")  //方法3
                .antMatchers("/user/demo").hasRole("sale")
                .anyRequest().authenticated()
                .and().rememberMe().tokenRepository(persistentTokenRepository())
                .tokenValiditySeconds(60) //60秒
                .userDetailsService(userDetailsService);
//                http.and().csrf().disable();   //关闭CSRF防护,也是一种认证方式

http.and().csrf().disable(); 这句直接注释了
html:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <meta name="_csrf" content="${_csrf.token}"/>
    <meta name="_csrf_header" content="${_csrf.headerName}"/>
    <title>Title</title>
</head>
<body>


<form action="/user/login" method="post">
    <input type="hidden" th::name="${_csrf.parameterName}" th::value="${_csrf.token}"/>
    用户名:<input type="text" name="username"/><br/>
    密码: <input type="password" name="password"/><br/>
    记住我:<input type="checkbox" name="remember-me" value="true"/><br/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>


如果不注释http.and().csrf().disable(); 并且Html 不加 <input type="hidden" />
就可以成功登录,可是如果按照上面的写法运行后就无法成功跳转main.html, 总是在login.html上

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-06-27 16:09
    关注

    引自免费微信小程序:皆我百晓生

    首先,让我们理解一下Spring Security中的CSRF(跨站请求伪造)保护机制。CSRF是一种安全机制,用于防止恶意站点通过伪造用户请求来影响用户与应用程序之间的会话。在你的配置和HTML代码中,涉及到CSRF的配置和使用方式。让我们一步步分析你的问题。

    问题:当你启用CSRF防护(不注释http.and().csrf().disable();)并且不在HTML中添加隐藏的CSRF令牌输入框时,无法成功登录并跳转到main.html,而是一直停留在login.html

    原因:当CSRF防护启用时,每次表单提交都需要包含一个CSRF令牌,以确保请求是来自合法的源。如果没有这个令牌或者令牌不正确,Spring Security会拒绝这个请求。在你的HTML表单中,<input type="hidden" th:name="${_csrf.parameterName}" th::value="${_csrf.token}">是用于提交CSRF令牌的。如果不添加这个输入框,提交的请求将缺少CSRF令牌,导致登录失败。

    解决方案:确保在HTML表单中包含CSRF令牌输入框,以通过CSRF验证。这样即使启用了CSRF防护,也可以成功登录并跳转到main.html

    关于你的配置代码,看起来已经很完整并且逻辑正确。只要确保HTML表单中包含CSRF令牌输入框,就应该能够成功登录并跳转到指定页面。如果你仍然遇到问题,请检查以下几点:

    1. 确保_csrf对象在你渲染HTML页面时是可用的。你可以检查是否在控制器中正确设置了该对象。
    2. 检查是否有其他配置或代码干扰了登录流程或页面跳转。
    3. 检查日志输出,查看是否有任何有关CSRF的错误或警告信息。

    总结:根据你的配置和HTML代码,只要确保HTML表单中包含CSRF令牌输入框,就应该能够成功登录并跳转到指定页面。如果仍然遇到问题,请检查上述提到的其他可能原因。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月5日
  • 已采纳回答 6月27日
  • 创建了问题 6月27日