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

Posted

技术标签:

【中文标题】将 Spring Security 添加到现有 Spring AngularJS 应用程序【英文标题】:Adding Spring Security to Existing Spring AngularJS Application 【发布时间】: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 有关系 【参考方案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 标签,我的应用程序既不使用也不支持。

以上是关于将 Spring Security 添加到现有 Spring AngularJS 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

使用 spring-security-core 插件将 Facebook 登录 (oauth) 与现有 grails 应用程序集成

是否可以将相同站点属性添加到 Spring Security CSRF 的 .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFal

您能否将 Workspace Security 添加到现有 Magnolia 工作区?

将标头添加到 oauth/token 响应(spring-security)

Spring Security 4 ACL - 用户创建和数据库配置

Spring Security OAuth2 - 将参数添加到授权 URL