【问题标题】:Discriminator multi-tenant setup with SpringSecurity plugin in Grails在 Grails 中使用 SpringSecurity 插件设置鉴别器多租户
【发布时间】:2017-03-28 09:46:40
【问题描述】:

我正在尝试根据GORM guide 中的文档设置基于鉴别器的多租户系统

确定哪个租户正在使用我要使用Spring Security Plugin 的系统,并根据用户 ID 显示数据。

这是我的租户解析器:

class MyTenantResolver implements AllTenantsResolver {

    def springSecurityService

    @Override
    Iterable<Serializable> resolveTenantIds() {
        return new DetachedCriteria(User)
                .distinct('id')
                .list()
    }

    @Override
    Serializable resolveTenantIdentifier() throws TenantNotFoundException {
        return springSecurityService.currentUser.id
    }
}

我在 resources.groovy 文件中添加了 springsecurityService:

beans = {
    myTenantResolver(MyTenantResolver) {
        springSecurityService = ref("springSecurityService")
    }
}

不幸的是,这会导致循环依赖:

The dependencies of some of the beans in the application context form a cycle:

   grailsCacheFilter
      ↓
   (inner bean)#6c1f419f
      ↓
   urlMappingsHandlerMapping
      ↓
   openSessionInViewInterceptor
┌─────┐
|  hibernateDatastore
↑     ↓
|  hibernateConnectionSourceFactory
↑     ↓
|  myTenantResolver
↑     ↓
|  springSecurityCoreSpringSecurityService
↑     ↓
|  transactionManager
└─────┘

我可以做些什么不同的事情来检查已登录的用户?

(使用 Grails 3.2.8 和 Spring Security 3.1.1)

【问题讨论】:

    标签: grails grails-orm multi-tenant


    【解决方案1】:

    最后通过RequestContextHolder获取会话解决了:

    class MyTenantResolver implements AllTenantsResolver {
    
        @Override
        Iterable<Serializable> resolveTenantIds() {
            return new DetachedCriteria(Customer)
                    .distinct('id')
                    .list()
        }
    
        @Override
        Serializable resolveTenantIdentifier() throws TenantNotFoundException {
            User.withTransaction {
                def session = RequestContextHolder.currentRequestAttributes().getSession()
                return User.read(session.getAttribute('SPRING_SECURITY_CONTEXT').authentication.principal.id).customerId
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可能想查看示例项目over on grails-samples。它有一个功能齐全的“用户即租户”租户解析器,可用作您自己工作的基础。

      【讨论】:

        猜你喜欢
        • 2015-08-07
        • 2018-02-06
        • 1970-01-01
        • 2014-04-07
        • 1970-01-01
        • 1970-01-01
        • 2013-05-24
        • 2011-11-23
        • 1970-01-01
        相关资源
        最近更新 更多