Grails多租户&;Spring安全核心插件

Grails多租户&;Spring安全核心插件,grails,multi-tenant,Grails,Multi Tenant,我正在使用Grails多租户插件和单租户模式。我使用了spring安全核心插件进行身份验证。我用过域名解析程序。用户表在默认数据库中不常见。每个租户数据库都有自己的用户表。除了以下两个问题外,它工作正常 当客户端(租户)用户尝试登录时,有时会点击默认数据库并说“找不到用户”。如果我在刷新页面后尝试(输入url并按CTRL+F5),它将正确登录 我在租户中有一个具有不同访问权限的普通用户。首先,我使用一个租户URL在浏览器中打开我的应用程序,使用凭据登录并成功登录。接下来,我在同一浏览器中打开另一

我正在使用Grails多租户插件和单租户模式。我使用了spring安全核心插件进行身份验证。我用过域名解析程序。用户表在默认数据库中不常见。每个租户数据库都有自己的用户表。除了以下两个问题外,它工作正常

  • 当客户端(租户)用户尝试登录时,有时会点击默认数据库并说“找不到用户”。如果我在刷新页面后尝试(输入url并按CTRL+F5),它将正确登录

  • 我在租户中有一个具有不同访问权限的普通用户。首先,我使用一个租户URL在浏览器中打开我的应用程序,使用凭据登录并成功登录。接下来,我在同一浏览器中打开另一个选项卡,输入第二个url和登录凭据。在这里,我可以登录到应用程序,但我获得了第一个租户的权限。如果我注销并刷新页面(如前所述),或者在登录并尝试之前刷新页面,则效果良好

  • 当我调试时,我发现在解析租户之前,spring security会使用上一个db会话访问数据库


    如何解决此问题?

    您必须确保在Spring安全筛选器之前注册了多租户servlet筛选器。我不知道如何在不重新编译插件的情况下做到这一点

    当请求到达我的登录页面时,我会获取租户ID并将其保留在会话中

    Integer tenantId = tenantResolver?.getTenantFromRequest(request)
    if (session.tenantId == null) {
       session.tenantId = tenantId
    }
    
    为了获取登录的用户详细信息,我通过实现GrailsUserDetailsService并在事务中调用来重写'loadUserByUsername'方法

    UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
      def requst = SecurityRequestHolder.request
      def httpSession = requst.getSession(false)
      Integer tenant = httpSession.tenantId
      TenantUtils.doWithTenant (tenant) {
     User.withTransaction { status ->
           User user = User.findByUsername(username)
         }
      }
    }
    

    现在我的问题解决了。

    你好,拉梅什,你能帮我打个邮件id吗?我也面临类似的问题