2014-09-25 174 views
4

我有几个AngularJS应用程序都使用Spring/Java和SAML 2.0用于SSO(利用Spring Security SAML扩展)。我的SSO id提供程序是OpenAM,一切正常。但是,我遇到了一种情况,即用户在一个应用程序内执行全局注销,但打开了其他选项卡。由于这些是单页网页应用程序,因此很多功能仍然可以在孤立选项卡中使用,直到用户做某件事来调用ajax请求。当然,这些AJAX请求会被Spring Security SAML过滤器拦截,并通过REDIRECT向OpenAM登录URL触发认证尝试。当然,这会在浏览器中造成严重破坏,因为AJAX请求不允许重定向到另一个域。此外,我不能对Angular的$ http拦截器做任何事情,因为这些请求被“取消”,并且$ http错误回调函数中没有可用的质量信息(例如方便的401/403状态码)。我只知道请求失败。处理SAML重定向AJAX请求

我不想假设所有坏的$ http请求都是由于身份验证问题(并执行$ window.location.reload()),因为可能有合法的失败原因。我的首选是禁止Spring安全重定向(到OpenAM登录页面)ajax请求,而是发回一个401/403状态代码。这将允许我处理$ http拦截器中的错误,并且如果它是身份验证失败,则执行整页加载,从而优雅地重定向到登录页面,就好像他们第一次访问该网站一样。

如何完成此任何想法?

回答

3

负责初始化身份验证并决定返回HTTP错误,执行重定向的bean,...是AuthenticationEntryPoint的实例。为了改变自己的行为,你可以:

  • 自定义当前SAMLEntryPoint(延长commence方法),并覆盖的情况下,请求的默认行为是从角AJAX调用,所以它返回,而不是执行重定向到一个HTTP错误IDP
  • 或定义在Spring上下文中的另一个security:http元素(目前1)之前只覆盖你的AJAX请求(例如,使用属性pattern="/api/**"),并使用一个入口点,这表现在你所希望的方式(见Http403ForbiddenEntryPoint
+0

Vladimir ... t回答。我在你回复的时候发现了同样的解决方案。由于Spring Security非常抽象(自从我深入研究之后已经有一段时间了),我花了一些时间进行挖掘,但最终我发现它是我需要扩展的SAMLEntryPoint。现在我的角$ http拦截器可以在浏览器中正确处理403响应。再次感谢! – 2014-09-26 12:12:56

+1

伙计们感谢你们的指导,如果你们中的一个人能够拿出一个github示例教程,这对你会有很大的帮助。干杯。 – 2014-11-20 21:01:40