我正在开发一个使用 AngularJS 和 Spring (4.1.0.RELEASE) 作为后端的 Web 应用程序。目前一切都很好。现在功能已经完成,我想将 Spring Security (3.2.5.RELEASE) 添加到项目中,以进行身份验证,然后授权所有请求。当我使用 Angular 时,我所有的 View 都是静态的,并且从不由服务器呈现。因此,典型的 Spring Security 设置(带有登录 jsp)将不起作用。我看了很多例子,没有一个符合我的需要。我不想使用任何外部框架(如 Jersey)来帮助进行身份验证,或使用任何服务器呈现的 View ,例如jsps。
当我启用 Spring Security 时,我的 GET 请求仍然可以正常工作,但我的 POST 请求(例如我的登录请求)不再有效,并返回 404 错误。 Controller 已正确映射,并且 URL 有效,所以我知道这一定与 Spring Security 拦截请求并将其视为无效有关。我不确定这是为什么,但我认为这可能与没有正确 header 的请求和 Spring 的 CSRF 保护有关。我不想禁用此保护。我的问题是,我如何使用 Spring Security 定义自定义登录 url,这将验证我的登录 POST 请求,然后发回启用 future 经过身份验证的请求所需的所有 header ?
编辑:我已经获得了可以使用的网址。有什么方法可以从 ajax 调用中检索 CSRF token 吗?我的 View 都是静态的,服务器首先点击登录请求,因此没有 jsp,也无法通过 jsp 标记库从服务器获取 csrf token 。第一个答案中的建议假设我们在 jsp 上,事实并非如此。有什么方法可以允许 CSRF 保护,还是我需要禁用它并执行我自己的请求验证?
最佳答案
启用 Spring 安全性后,您需要将 CSRF token 添加到所有 POST、PATCH、PUT 和 DELETE 请求。这可以在请求 header 中发送,您应该能够使用 GET 请求来获取 token 。默认标题为 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 保护,您需要编写一个排除您的登录 URL 的自定义 RequestMatcher。 在 XML 配置中,它看起来像:
<csrf request-matcher-ref="myCustomRequestMatcher"/>
参见:http://blogs.sourceallies.com/2014/04/customizing-csrf-protection-in-spring-security/
关于java - 将 Spring Security 添加到现有的 Spring AngularJS 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27023119/