我正致力于传统的grails应用程序。
我有几张像这样的表
User ( id, name,enterprise_id)
Enterprise (id, name)
Asset (id,description, enterprise_id)
我想验证当某个用户想要访问资产时,它具有正确的enterprise_id(即该用户属于与该资产相同的企业)。
例如,考虑
John,来自Microsoft的用户和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是否可行?四郎?
提前致谢
答案 0 :(得分:3)
您可以使用spring-security-acl(取决于spring-security-core)
来实现此功能否则,您可以使用一组对象级授权filters实施两阶段方法(身份验证+授权)。
答案 1 :(得分:1)
我正在使用Hibernate Filter插件。还有MultiTenant插件及其伴随Falcone插件。
这些操作基本上是为所有数据库查询添加约束,以实现我认为您的目标。一个典型的解决方案(使用Hibernate Filter)将其添加到Asset域(更改每个新域的过滤器名称)...
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 = {
}
}
}
}
...并确保不在DB中使用enterprise_id = 0.
答案 2 :(得分:0)
Apache Shiro内置了访问控制,并且还有一个grails插件。
身份验证是证明某人是他们所说的人 - 即登录应用程序的行为。授权是控制对某些数据或应用程序功能的访问的过程(控制“谁可以做'什么')。
Shiro在其API中内置了这两个概念并且做得非常好 - 您甚至可以控制对单个实例的访问(例如,'查看'id为12345的'user'等)。我强烈建议您查看Shiro的Grails插件以及Shiro的发行版 - 它包含一些示例Web应用程序(使用和不使用Spring),您可以看到如何使用其访问控制 - 使用基于URL的资源的servlet过滤器控制或通过注释来保护个别方法。
HTH,
莱斯