我可以使用Grails创建一个安全的多租户Web应用程序:
更新config.groovy:
租客{ mode =“multiTenant” resolver.type =“springSecurity” }在用户域中添加:Integer userTenntId
在多租户模式下一切正常,但如何使用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)
答案 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个不同的数据库链接:
http://lh_dev1:8080/myProject - >它会打开你的项目数据库 lh_dev1
http://lh_dev2:8080/myProject - >它会打开你的项目数据库 lh_dev2
每个租户(客户)都有自己的数据库。
4 - 安装 多租户弹簧安全插件 并按照以下步骤操作(注意我还没有实现安全插件我会发布结果):
在 Config.groovy 中,您的租户解析程序属性应如下所示:
tenant{
resolver.type = "springSecurity"
}
您还需要将以下字段添加到Spring-Security用户域类
整数userTenantId
最终问题 - >
每次我们启动grails时,他只会在默认数据库上进行创建/更新,所有其他数据库将保持干净,因为我仍然不知道如何解决这个问题所以我简单地将默认数据库结构导出到我所有其他租户数据库中。
最后我没有对域名进行@MultiTenant Annoation,因为我正在使用不同的数据库,因为每个数据库都有自己的个人记录,所以没有看到注入tenantid的点。