【问题标题】:securing SPA multi-tenant SaaS application保护 SPA 多租户 SaaS 应用程序
【发布时间】:2013-04-23 20:10:14
【问题描述】:
【问题讨论】:
标签:
login
angularjs
spring-security
saas
single-page-application
【解决方案1】:
我已经参与了 SPA 和安全方面的两个项目。最后一个是 GWT + Spring Security。我确信您可以成功地同时使用 Angular 和 Spring Security。
不幸的是,在 Spring Security AFAIK 中没有内置配置参数“我们处于 SPA 模式”。因此,有必要从 Spring Security 方面进行一些调整/配置。例子:
想象一下,在登录期间,您调用内置的 Spring Security 登录控制器。默认情况下,如果认证成功,用户将被重定向到索引页面,在失败的情况下,它将被重定向到相应的错误页面。这是标准 Web 应用程序的正常行为,但对 SPA Web 应用程序没有太大用处。在 SPA 的情况下,您需要检测 AJAX 调用并使用用户名/角色打印 JSON 以获取成功案例,或发送 401 代码以获取失败(然后在 JS 中检测 401 并显示相应的错误)。您可以使用 Spring Security 中的相应扩展点来执行此操作:AuthenticationSuccessHandler 和 AuthenticationFailureHandler。
还有一点需要调整:默认情况下,会话到期后,用户将被重定向到登录页面(SPA 应用程序接收登录页面作为对下一次 AJAX 调用的响应)。
查看我的个人经验一般指南将是这样的:登录后将角色列表加载到 JS 中。使用它在 UI 端显示/隐藏相应的组件。 在服务器端也应用相同的限制列表。确保用户不在浏览器中编辑 JS(尽管在某些中型应用程序的缩小 JS 的情况下,这将是非常复杂的任务)。在服务器端,您必须选择:
- AJAX 调用的安全 URL
- 保护一些 Java 方法。
我更喜欢第二个(服务上的安全业务方法)。我认为这更方便,因为通常我们想要安全的业务运营,而不是某些端点。作为adwantage,您将能够通过其他一些协议公开您的业务逻辑,并且安全性已经存在。从另一方面来说,我可以想象一些业务要求对不同的端点/协议具有不同的权限。所以这更多地取决于你的实际情况。
大型 JS 应用程序必须拆分为模块。为了减少直接依赖,最好使用直接调用的事件来在模块之间进行通信。 Addy Osmany 关于如何在这些代码中进行安全性有一些有趣的想法。我没有找到好的链接,也许this 或this 会有所帮助(搜索“许可”)。
随时发布任何问题。祝你好运。