2010-12-08 30 views
0

我可以创建一个安全的,多租户网络与Grails的应用程序:如何使用Spring安全插件作为解析器将多租户插件配置为单租户?

  • 设置弹簧安全插件,
  • 建立多租户的插件通过多租户(安装和多租户弹簧安全)
  • 更新Config.groovy中:

    租户{ 模式= “多租户” resolver.type = “springSecurity” }

  • 附加:整数userTenntId在用户域

  • 添加域类租户组织
  • 联营租户组织
  • 编辑BootStrap.groovy中。

在多租户模式下一切正常,但如何使用mode =“singleTenant”?
不灵这种配置的声音:

租户{ 模式= “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) 

回答

0

我还在测试中singleTenant模式多租户的插件(核心),但它已经不是本书虽然是测试throughlly运行。

步骤如下:

1-安装弹簧安全插件,运行Grails的S2-快速启动建立角色

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

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


3-安装多租户(核)插件并设置数据源解析器加上DNS解析器我做到了以静态方式。另外本书虽然在插件医生说,我们可以配置dataSoruceTenantMap这样的:


dataSourceTenantMap {

  • T1 = “的jdbc:mysql的://本地主机/ ets_dev1”

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

}
didnt为我工作,所以我通过grails.naming.entries在配置中使用的JNDI选项:

/** Config.groovy中 **/

grails.naming.entries = [
“JDBC/lh_dev1”:[
类型: “为javax.sql.DataSource”
AUTH: “容器”,
descripti上: “我的数据源”,
driverClassName: “com.mysql.jdbc.Driver”,
网址:为 “jdbc:mysql的://本地主机:3306/lh_dev1”,
用户名: “XXX”,
密码: “XXX”,
maxActive: “100”,
了maxidle: “30”,
MAXWAIT: “10000”
],
“JDBC/lh_dev2”:[
类型:“javax.sql中.DataSource“,
auth:”Container“,
description:“我的数据源”,
driverClassName:“com.mysql.jdbc。驱动程序 “
网址:为 ”jdbc:mysql的://本地主机:3306/lh_dev2“,
用户名: ”XXX“,
密码: ”XXX“,
maxActive: ”100“,
了maxidle:” 30" ,
MAXWAIT: “10000”
]
]

//多租户插件配置

租户{

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个diferent数据库链接ü一次点击,例如:

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



4-安装多租户弹簧安全插件,并按照这个步骤(注意,一旦我这样做,我会后的结果我没有实现的安全插件还):

Config.groovy中,租客解析器属性应该是这样的:

tenant{ 
resolver.type = "springSecurity" 
} 



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

整数userTenantId



最后的问题 - >

每次我们启动Grails时,他只会在默认情况下创建/更新t数据库所有其他人将保持清洁,因为我仍然不知道如何解决这个问题,所以我简单地导出默认的数据库结构到我所有的其他租户数据库。

最后我没有在域上执行@MultiTenant Annoation,因为我与不同的数据库工作没有看到注入tenantid的观点,因为每个db都有他自己的个人记录。