【问题标题】:Adding Spring Security to Existing Spring AngularJS Application将 Spring Security 添加到现有 Spring AngularJS 应用程序
【发布时间】:2015-01-17 08:11:55
【问题描述】:

我正在开发一个使用 AngularJS 和 Spring (4.1.0.RELEASE) 作为后端的 Web 应用程序。目前一切都很好。现在功能已经完成,我想将 Spring Security (3.2.5.RELEASE) 添加到项目中,以进行身份​​验证,然后授权所有请求。当我使用 Angular 时,我所有的视图都是静态的,并且从不被服务器渲染。因此,典型的 Spring Security 设置(带有登录 jsp)将不起作用。我看过很多例子,没有一个符合我的需要。我不想使用任何外部框架(例如 Jersey)来帮助进行身份验证,也不想使用任何服务器呈现的视图,例如jsps。

当我启用 Spring Security 时,我的 GET 请求仍然可以正常工作,但我的 POST 请求(例如我的登录请求)不再有效,并返回 404 错误。控制器已正确映射,并且 URL 有效,所以我知道它必须与 Spring Security 拦截请求并认为它无效有关。我不确定这是为什么,但我认为这可能与没有正确标头的请求和 Spring 的 CSRF 保护有关。我不想禁用此保护。我的问题是,如何使用 Spring Security 定义自定义登录 url,它将验证我的登录 POST 请求,然后发回所有必要的标头以启用未来的经过身份验证的请求?

编辑:我已经得到了工作的网址。有没有办法从 ajax 调用中检索 CSRF 令牌?我的视图都是静态的,服务器首先点击登录请求,所以没有jsps,也没有办法通过jsp标签库从服务器获取csrf token。第一个答案中的建议假设我们在 jsp 上,但事实并非如此。有什么方法可以允许 CSRF 保护,还是我需要禁用它并执行我自己的请求验证?

【问题讨论】:

  • 我自己也在寻找您问题的答案。感谢您在这里发帖!
  • 听起来你调用 Post 方法的方式可能有问题,你能显示你正在使用的代码吗?
  • 这些方法在添加 Spring Security 之前运行良好,所以我知道这与这些无关。这和 Spring Security 有关系

标签: java angularjs spring rest spring-security


【解决方案1】:

启用 Spring 安全性后,您需要将 CSRF 令牌添加到所有 POST、PATCH、PUT 和 DELETE 请求。这可以在请求标头中发送,您应该能够使用 GET 请求来获取令牌。默认标头为X-CSRF-TOKEN=<tokenvalue>

来源:http://docs.spring.io/spring-security/site/docs/3.2.0.CI-SNAPSHOT/reference/html/csrf.html (这是文档的旧版本,但包含有关 Ajax 和 Json 请求的非常相关的部分。)

如果你想为特定 URL 禁用 CSRF 保护,你需要编写一个自定义的 RequestMatcher 来排除你的登录 URL。 在 XML 配置中,它看起来像:

<csrf request-matcher-ref="myCustomRequestMatcher"/>

见:http://blogs.sourceallies.com/2014/04/customizing-csrf-protection-in-spring-security/

【讨论】:

  • 谢谢,我知道我需要将其添加到所有发布请求中,但我的问题是关于登录 url。客户端在登录 ajax 调用之前没有与服务器交互,因此无法获取 csrf 令牌。此外,该链接中没有关于在 html 页面上获取 CSRF 的任何内容,这些都使用 jsp 标签,我的应用程序既不使用也不支持。
猜你喜欢
  • 2023-04-07
  • 2014-03-07
  • 2014-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
  • 2015-04-19
  • 1970-01-01
相关资源
最近更新 更多