将 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)