我正在使用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令牌?我的视图都是静态的,并且服务器在登录请求时首先命中,所以没有jsp,也无法通过jsp标记库从服务器获取csrf令牌。第一个答案中的建议假设我们使用的是jsp,但事实并非如此。有没有办法允许CSRF保护,或者我需要禁用它并执行我自己的请求验证?
发布于 2014-11-20 11:43:35
启用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/
https://stackoverflow.com/questions/27023119
复制相似问题