将 Spring 安全性添加到现有的 Spring AngularJS 应用程序中



我正在开发一个使用AngularJS和Spring(4.1.0.RELEASE)作为后端的Web应用程序。 目前一切正常。 现在功能已经完成,我想将 Spring 安全性 (3.2.5.RELEASE) 添加到项目中,以进行身份验证,然后授权所有请求。 当我使用 Angular 时,我的所有视图都是静态的,并且永远不会由服务器渲染。 因此,典型的 Spring 安全性设置(使用登录 jsp)将不起作用。 我看过很多例子,没有一个符合我的需求。 我不想使用任何外部框架(如 Jersey)来帮助进行身份验证,或任何服务器渲染的视图,例如 jsps。

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

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

启用 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 保护,则需要编写一个排除登录 URL 的自定义 RequestMatcher。 在 XML 配置中,它如下所示:

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

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

最新更新