Grails +保护应用程序

时间:2010-09-01 14:04:29

标签: security grails spring-security shiro

我正致力于传统的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是否可行?四郎?

提前致谢

3 个答案:

答案 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,

莱斯