代码之家  ›  专栏  ›  技术社区  ›  Tom

Grails+保护应用程序

  •  1
  • Tom  · 技术社区  · 14 年前

    我正在开发一个遗留的grails应用程序。

    我有几张这样的桌子

    User ( id, name,enterprise_id)
    
    Enterprise (id, name)
    
    Asset (id,description, enterprise_id)
    

    我想验证当某个用户想要访问某个资产时,它是否具有正确的企业id(即该用户与该资产属于同一个企业)。

    例如,考虑

    来自微软的用户John和来自Oracle的Charles,只有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

    提前谢谢

    3 回复  |  直到 8 年前
        1
  •  3
  •   Colin Harrington    14 年前

    spring-security-acl (这取决于spring安全内核)

    否则,您可以使用一组对象级授权实现两阶段方法(身份验证+授权) filters .

        2
  •  1
  •   wwwclaes    14 年前

    我正在使用Hibernate过滤器插件。还有多租户插件和它的同伴Falcone插件。

    它们所做的基本上是向所有DB查询添加约束,以实现我认为您的目标。一个典型的解决方案(使用Hibernate过滤器)是将其添加到资产域(更改每个新域的过滤器名称)。。。

    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 = {
    
                }
            }
        }
    
    }
    

        3
  •  0
  •   Les Hazlewood    14 年前

    ApacheShiro内置了访问控制,还有一个grails插件。

    Shiro在其API中内置了这两个概念,而且做得非常好—您甚至可以控制对单个实例的访问(例如,“查看”id为12345的“用户”,等等)。我强烈建议您查看Shiro的Grails插件以及Shiro的发行版—它包括一些示例web应用程序(带和不带Spring),您可以看到如何使用它的访问控制—可以使用servlet过滤器进行基于URL的资源控制,也可以通过注释来保护各个方法。

    嗯,