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

4
我正在使用AngularJS和Spring (4.1.0.RELEASE)构建一个Web应用程序,一切都运行良好,现在我想将Spring Security(3.2.5.RELEASE)添加到项目中,以对所有请求进行身份验证和授权。由于我使用的是Angular,所有的视图都是静态的,从未由服务器呈现。因此,典型的Spring Security设置(带有登录jsp)将无法工作。我查看了许多示例,没有一个符合我的需求。我不想使用任何外部框架(如Jersey)来帮助进行身份验证,也不想使用任何服务器呈现的视图,例如jsp。
当我开启Spring Security后,我的GET请求仍然正常工作,但我的POST请求,例如我的登录请求,不再工作,并返回404错误。控制器正确映射,URL有效,所以我知道这一定与Spring Security拦截请求并认为其无效有关。我不确定为什么,但我认为这可能与请求没有正确的头信息和Spring的跨站请求伪造保护有关。我不想禁用此保护。我的问题是,如何使用Spring Security定义自定义登录URL,以对我的登录POST请求进行身份验证,并发送回所有必要的头信息以启用未来的身份验证请求?
编辑:我已经成功使URL工作。是否有方法从ajax调用中检索CSRF令牌?我的所有视图都是静态的,服务器首先在登录请求上被访问,因此没有JSP,也没有通过jsp标记库从服务器获取csrf令牌的方法。第一个答案中的建议假设我们在JSP上,但这并不是事实。是否有办法允许CSRF保护,或者我需要禁用它并执行自己的请求验证?

我也在寻找你的问题的答案。感谢你在这里发布! - Asik
听起来你调用Post方法的方式可能有误,你能展示一下你正在使用的代码吗? - Aeseir
在添加Spring Security之前,这些方法都运行良好,因此我知道与它们无关。这与Spring Security有关。 - holtc
1个回答

0

启用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/


谢谢,我知道我需要将它添加到所有的 POST 请求中,但我的问题是关于登录 URL 的。在登录 Ajax 调用之前,客户端与服务器没有任何交互,因此无法获取 CSRF 令牌。此外,那个链接中没有关于如何在 HTML 页面上获取 CSRF 的信息,那些都使用 JSP 标签,而我的应用程序既不使用也不支持它们。 - holtc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接