java - 将 Spring Security 添加到现有的 Spring AngularJS 应用程序

标签 java angularjs spring rest spring-security

我正在开发一个使用 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/

相关文章:

spring - 在 PasswordEncoder 中获取用户名

java - PDF/A 验证

java - 是否可以从另一个虚拟机中杀死一个 Java 虚拟机?

angularjs - 使用 angularjs 渲染 json 而不是 html

angularjs - Angular Bootstrap 选项卡未获取输入字段

javascript - Spring MVC + Javascript

java - hibernate命名查询

Java Apache HttpComponents,如何读取 POST 响应?

java - 如何创建一个在 x :00 x:15 x:30 and x:45 do something different at 2:00 运行的线程

javascript - 如何使用 AngularJS 在应用程序的生命周期内存储 'Token' ?