如何使用Spring安全插件作为解析器将多租户插件配置为单租户?

时间:2010-12-08 00:32:50

标签: grails groovy grails-plugin multi-tenant

我可以使用Grails创建一个安全的多租户Web应用程序:

  • 设置spring security插件,
  • 设置多租户插件(通过多租户安装和多租户 - 弹簧安全)
  • 更新config.groovy:

    租客{   mode =“multiTenant”   resolver.type =“springSecurity” }

  • 在用户域中添加:Integer userTenntId

  • 为租户组织添加域类
  • 将租户与组织联系起来
  • 编辑BootStrap.groovy。

在多租户模式下一切正常,但如何使用mode =“singleTenant”? 此配置听起来不起作用:

租客{   mode =“singleTenant”   resolver.type =“springSecurity” }


编辑:

我尝试这个配置:

tenant {
  mode = "singleTenant"
  resolver.type = "springSecurity"
  datasourceResolver.type = "config"

  dataSourceTenantMap {
    t1 = "jdbc:hsqldb:file:custFoo"
    t2 = "jdbc:hsqldb:file:custBar"
  }
}

但我明白了:

ERROR errors.GrailsExceptionResolver  - Executing action [list] of controller [org.example.TicketController]  caused exception: java.lang.StackOverflowError

和:

Caused by: java.lang.StackOverflowError
    at org.grails.multitenant.springsecurity.SpringSecurityCurrentTenant.getTenantIdFromSpringSecurity(SpringSecurityCurrentTenant.groovy:50)
    at org.grails.multitenant.springsecurity.SpringSecurityCurrentTenant.this$2$getTenantIdFromSpringSecurity(SpringSecurityCurrentTenant.groovy)
    at org.grails.multitenant.springsecurity.SpringSecurityCurrentTenant$this$2$getTenantIdFromSpringSecurity.callCurrent(Unknown Source)
    at org.grails.multitenant.springsecurity.SpringSecurityCurrentTenant.get(SpringSecurityCurrentTenant.groovy:41)
    at com.infusion.tenant.spring.TenantBeanContainer.getBean(TenantBeanContainer.java:53)
    at com.infusion.tenant.spring.TenantMethodInterceptor.invoke(TenantMethodInterceptor.java:32)
    at $Proxy14.getConnection(Unknown Source)

1 个答案:

答案 0 :(得分:0)

我仍然在singleTenant模式下测试多租户插件(核心),但它已经在运行,但还没有经过全面测试。

以下是步骤:

1 - 安装 spring安全插件 ,运行 grails s2-quickstart 设置角色

2 - 安装 多租户-ehcache插件 ,并将Datasource.groovy中的cache.provider_class更改为:

cache.provider_class ='grails.plugin.multitenant.ehcache.cache.MultiTenantEhCacheProvider'


3 - 安装多租户(核心)插件并设置数据源解析器和dns解析器我是以静态方式完成的。另外在插件文档中说我们可以像这样配置 dataSoruceTenantMap


dataSourceTenantMap {

  • t1 =“jdbc:mysql:// localhost / ets_dev1”

  • t2 =“jdbc:mysql:// localhost / ets_dev2”

}
没有为我工作所以我在配置中通过 grails.naming.entries 使用了jndi选项:

/ ** Config.groovy ** /

grails.naming.entries = [
    “jdbc / lh_dev1”:[
        键入:“javax.sql.DataSource”,
        auth:“容器”,
        描述:“我的数据源”,
        driverClassName:“com.mysql.jdbc.Driver”,
        url:“jdbc:mysql:// localhost:3306 / lh_dev1”,
        用户名:“xxx”,
        密码:“xxx”,
        maxActive:“100”,
        maxIdle:“30”,
        maxWait:“10000”
    ],
        “jdbc / lh_dev2”:[
                键入:“javax.sql.DataSource”,
                auth:“容器”,
                描述:“我的数据源”,
                driverClassName:“com.mysql.jdbc.Driver”,
                url:“jdbc:mysql:// localhost:3306 / lh_dev2”,
                用户名:“xxx”,
                密码:“xxx”,
                maxActive:“100”,
                maxIdle:“30”,
                maxWait:“10000”
        ]
]

// MultiTenant插件配置

租户{

    mode = "singleTenant" // "singleTenant" OR "multiTenant"
    datasourceResolver.type = "config" //This is the default and can be omitted

    dataSourceTenantMap { 
        **t1 = "java:comp/env/jdbc/lh_dev1"****
        **t2 = "java:comp/env/jdbc/lh_dev2"**
    }

    resolver.request.dns.type = "config"  //This is the default
            domainTenantMap {
                      lh_dev1 = 1
                      lh_dev2 = 2

            }
    }

此时,一旦点击,您将有2个域与2个不同的数据库链接:

每个租户(客户)都有自己的数据库。



4 - 安装 多租户弹簧安全插件 并按照以下步骤操作(注意我还没有实现安全插件我会发布结果):

Config.groovy 中,您的租户解析程序属性应如​​下所示:

tenant{ 
 resolver.type = "springSecurity"
}



您还需要将以下字段添加到Spring-Security用户域类

整数userTenantId



最终问题 - >

每次我们启动grails时,他只会在默认数据库上进行创建/更新,所有其他数据库将保持干净,因为我仍然不知道如何解决这个问题所以我简单地将默认数据库结构导出到我所有其他租户数据库中。

最后我没有对域名进行@MultiTenant Annoation,因为我正在使用不同的数据库,因为每个数据库都有自己的个人记录,所以没有看到注入tenantid的点。