Spring Security 和单页应用程序

Posted

技术标签:

【中文标题】Spring Security 和单页应用程序【英文标题】:Spring Security and Single Page Applications 【发布时间】:2013-10-05 10:28:45 【问题描述】:

我的申请将是: - 单页应用程序(比如角度/主干) - 基于 Spring MVC 的服务器。

我发现了很多关于使用 Spring-Security 的示例,其中登录页面、注销页面等都是 html。 Spring Security 会根据 Session State 定向到适当的页面。

但在我的情况下,登录/注销页面将使用 javascript - 与服务器进行登录/注销的所有交互都是通过 HTTP(REST 样式 URL)和响应 JSON。这里没有 HTML。

问题 在这种情况下,我该如何使用 Spring Security?换句话说 - 我如何将登录/注销行为公开为 API?

由于前端是基于浏览器的应用程序...我猜通常的 cookie 等应该仍然可以用于识别会话。

【问题讨论】:

【参考方案1】:

是的,Cookie 在您的情况下仍然有效。但是您需要点击 ajax 网址而不是普通网址。我有过使用基于移动设备的单页应用程序的经验,并且我设法使用 grails 后端来做到这一点。登录时点击 /j_spring_security_check?ajax=true 如果 http 响应为 302 并将您重定向到 /login/ajaxSuccess ,则表示您已成功登录。否则您无法登录。

【讨论】:

如何管理 Angular 模板,如果它已经被缓存了? 如果用户对相同的 url 有不同的权限(相同的角度模板),你如何管理情况 你想过使用 ajax 加载模板并通过 spring security 保护 url 吗?在我看来,这应该在您的角度代码中定义,而不是使用弹簧安全性。在您的角度范围内,您需要获取用户详细信息和角色 如果您有 2-5 个角色,并且 URL 很少 - 对于某些应用程序来说可能没问题。但是如果您的应用程序有 20-50 个角色(我不是说 2-10 个模板取决于角色)这将很难管理和支持。有一次,如果有人说“我们不应该使用 10 个角色,但我们会得到 5 个新角色” - 这将是地狱因为 UI 逻辑集成。如果您信任 UI 管理角色 - 您将失去灵活性。并且遵循最佳实践的任何方式,您都应该永远不要向 UI 提供有关重要安全部分的信息! UI 应该尽可能少的逻辑。在完美的情况下 - 零。

以上是关于Spring Security 和单页应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在单页应用(spring security)中提供 CSRF Token?

在基于令牌的身份验证和单页应用程序中注销

社交登录,spring-security-oauth2 和 spring-security-jwt?

Spring Security 3 - Ajax 注销

使用 Spring Security 实现 OAuth2 隐式授权

Spring Security 在登录响应中使用新的会话令牌设置 CSRF