在 Grails 中使用 SpringSecurity 插件设置鉴别器多租户
Discriminator multi-tenant setup with SpringSecurity plugin in Grails
我正在尝试根据 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 安全 3.1.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
}
}
}
您可能想看一下示例项目 over on grails-samples。它有一个功能齐全的 "user as tenant" 租户解析器,可用作您自己工作的基础。
我正在尝试根据 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 安全 3.1.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
}
}
}
您可能想看一下示例项目 over on grails-samples。它有一个功能齐全的 "user as tenant" 租户解析器,可用作您自己工作的基础。