Grails + 保护应用程序
Posted
技术标签:
【中文标题】Grails + 保护应用程序【英文标题】:Grails + Securing Application 【发布时间】:2011-04-06 20:11:31 【问题描述】:我正在开发一个遗留的 grails 应用程序。
我有几张这样的桌子
User ( id, name,enterprise_id)
Enterprise (id, name)
Asset (id,description, enterprise_id)
我想验证当某个用户想要访问一项资产时,它具有正确的 enterprise_id(即该用户与该资产属于同一个企业)。
例如,考虑
Microsoft 的用户 John 和 Charles(来自 Oracle),只有 Charles 应该能够访问 Java 虚拟机。
Enterprise
id,name
--------
1 Oracle
2 Microsoft
Asset
id,description,enterprise_id
----------------------------
1 Java VM 1
2 .NET 2
User
id name enterprise_id
----------------------
1 John 2
2 Charles 1
我一直在阅读spring security,但它看起来对我没有帮助。我看到的只是用户身份验证、密码、角色等(当然,我可能是错的)。这些东西已经得到保护并且工作正常。目前我正在考虑过滤器, 但不能让它们工作 并滚动我自己的安全性(请参阅this 问题),这似乎不正确。
有什么想法吗? Spring Security 是要走的路吗?四郎?
提前致谢
【问题讨论】:
我想你想说的是'身份验证'已经到位,你想实施'授权'对吗? @Gopi,可能。我不确定这两者之间的语义和区别,但听起来很合理。 【参考方案1】:Apache Shiro 内置了访问控制,并且还有一个 grails 插件。
身份验证是证明某人是他们所说的人的行为 - 即登录到应用程序。授权是控制对某些数据或应用程序功能的访问的过程(控制“谁”可以做“什么”)。
Shiro 在其 API 中内置了这两个概念并且做得很好 - 您甚至可以控制对单个实例的访问(例如,“查看”ID 为 12345 的“用户”等)。我强烈建议查看 Shiro 的 Grails 插件以及 Shiro 的发行版——它包括一些示例 Web 应用程序(有和没有 Spring),你可以看到如何使用它的访问控制——或者使用基于 URL 的资源的 servlet 过滤器控制或通过注释来保护各个方法。
HTH,
莱斯
【讨论】:
【参考方案2】:我为此使用了 Hibernate Filter 插件。还有 MultiTenant 插件及其配套的 Falcone 插件。
这些所做的基本上是为所有数据库查询添加约束,以完成我认为您的目标。您(使用休眠过滤器)的典型解决方案是将其添加到资产域(更改每个新域的过滤器名称)...
static hibernateFilters =
assetEnterpriseFilter(condition: ':enterpriseId=enterprise_id', types: 'integer', default: true)
...并从插件中提取 HibernateFilterFilters 以像这样覆盖(将会话变量设置为参数)...
class HibernateFilterFilters
def filters =
all(controller:'*', action:'*')
before =
def hibernateSession = grailsApplication.mainContext.sessionFactory.currentSession
DefaultHibernateFiltersHolder.defaultFilters.each name ->
hibernateSession.enableFilter(name).setParameter('enterpriseId', session?.enterpriseId ? session.enterpriseId.toInteger() : new Integer(0))
after =
afterView =
...并确保不要在数据库中使用 enterprise_id = 0。
【讨论】:
【参考方案3】:您可以使用 spring-security-acl 实现此功能(取决于 spring-security-core)
否则,您可以使用一组对象级授权filters 实现两阶段方法(身份验证+授权)。
【讨论】:
我认为过滤器是要走的路,因为我看不到如何自定义 @PreXYZ 注释来访问我的数据库表并检查权限。谢谢以上是关于Grails + 保护应用程序的主要内容,如果未能解决你的问题,请参考以下文章
使用 Shiro 插件保护 Grails 应用程序中的一些页面,但不是所有页面
Grails、Spring Security 和 Angular JS - 如何保护 URL?
使用 Spring Security Rest 插件保护 Grails Rest Api