Grails 2.2.3 + Spring安全核心+多租户单个DB插件

时间:2013-11-12 02:02:55

标签: multi-tenant

我是grails的新手,我正在尝试实现spring security core和Multi-tenant单个db插件。 我首先实现了spring安全核心,并实现了自定义AuthenticationProvider和Authentication。 然后我安装了多租户单个db插件并运行了自动创建自定义tenantResolver和tenantRepository的'mt-spring-security'脚本。我在tenantResolver中对tenantId进行了硬编码以进行测试。 我在域类中添加了@MultiTenant注释。

@MultiTenant

类ClientUser实现Serializable {

long idclient_user
Userprofile user
Client client
int tenantId
...

}

在AuthenticationProvider中,不会过滤当前租户的ClientUser数据。它将数据带给所有租户。

类ClientAuthenticationProvider实现AuthenticationProvider {

Authentication authenticate(Authentication auth) throws AuthenticationException {
    ClientAuthentication authentication = auth
    String password = authentication.credentials
    String username = authentication.name
    String clientName = authentication.clientName
    ...
    Userprofile.withTransaction { status ->

        def user = Userprofile.findWhere(username: username)
        def client = Client.findWhere(clientname: clientName)
        def clientUser = ClientUser.findWhere(client: client, user: user) <-- NOT FILTERED FOR THE CURRENT TENANT. I HARD-CODED INVALID TENANTID IN THE TENANTRESOLVER AND EXPECTING IT TO FAIL BUT IT STILL FINDS THE USER.

        if (!clientUser) {
            throw new UsernameNotFoundException('User not found', username)
        }
        ...
    }
    ...
    result
}

我不确定多租户和弹簧安全如何协同工作。我很难理解架构/设计。

如果有人能为我提供示例实施或指出我正确的方向,那将非常有帮助。 谢谢, 迪内希

1 个答案:

答案 0 :(得分:0)

问题是多租户过滤器是在spring安全过滤器之前注册的,因此在Spring安全认证之后才调用tenantResolver。我通过在config.groovy

中将resolveTenantBeforeLogin设置为true来解决此问题

在config.groovy中,添加此行

multiTenant.resolveTenantBeforeLogin =真

添加此行后,先调用tenantResolver,然后再进行身份验证。