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

时间:2014-11-19 17:26:00

标签: java angularjs spring rest spring-security

我正在使用AngularJS和Spring(4.1.0.RELEASE)作为后端开发Web应用程序。目前一切都很好。现在功能已经完成,我想将Spring Security(3.2.5.RELEASE)添加到项目中,进行身份验证,然后授权所有请求。当我使用Angular时,我的所有视图都是静态的,并且从不由服务器呈现。因此,典型的Spring Security设置(使用登录jsp)将无法正常工作。我看了很多例子,但没有一个符合我的需要。我不想使用像泽西岛这样的任何外部框架来帮助进行身份验证,或者任何服务器呈现的视图,例如JSP页面。

当我启用Spring Security时,我的GET请求仍然正常,但我的POST请求(例如我的登录请求)不再起作用,并返回404错误。控制器已正确映射,并且URL有效,因此我知道它必须与Spring Security拦截请求并认为它无效有关。我不确定为什么会这样,但我认为它可能与没有正确标题和Spring的CSRF保护的请求有关。我不想禁用这种保护。我的问题是,如何定义一个使用Spring Security的自定义登录URL,它将验证我的登录POST请求,然后发回所有必要的头文件以启用未来的,经过身份验证的请求?

编辑:我已经获得了工作的网址。有没有办法从ajax调用中检索CSRF令牌?我的视图都是静态的,服务器首先登录登录请求,因此没有jsps,也无法通过jsp标记库从服务器获取csrf令牌。第一个答案中的建议假设我们使用的是jsp,而事实并非如此。有没有办法允许CSRF保护,还是我需要禁用它并执行我自己的请求验证?

1 个答案:

答案 0 :(得分: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请求的非常相关的部分。)

如果要为特定网址禁用CSRF保护,则需要编写一个排除登录网址的自定义RequestMatcher。  在XML配置中,它看起来像:

<csrf request-matcher-ref="myCustomRequestMatcher"/>

请参阅:http://blogs.sourceallies.com/2014/04/customizing-csrf-protection-in-spring-security/