【问题标题】:Grails Multi-tenant & Spring Security Core pluginsGrails 多租户和 Spring Security 核心插件
【发布时间】:2011-11-23 08:56:23
【问题描述】:

我正在使用具有单租户模式的 Grails 多租户插件。我已经使用 spring security core 插件进行身份验证。我用过域名解析器。用户表在默认数据库中并不常见。每个租户数据库都有自己的用户表。除了以下 2 个问题外,它工作正常。

  1. 当客户端(租户)用户尝试登录时,有时它会访问默认数据库并显示“未找到用户”。如果我在刷新页面后尝试(输入 url 并按 CTRL+F5),它会正确登录。

  2. 我有一个跨租户的通用用户,具有不同的访问权限。首先,我使用一个租户 URL 在浏览器中打开我的应用程序,使用凭据登录并成功登录。接下来,我在同一个浏览器中打开另一个选项卡,输入第二个 url 和登录凭据。在这里,我可以登录应用程序,但我获得了第一个租户的权限。如果我如上所述注销并刷新页面,或者如果我在登录前刷新页面并尝试,它工作正常。

我调试的时候发现,在解析租户之前,spring security会用之前的db session命中数据库。

我该如何解决这个问题?

【问题讨论】:

    标签: grails multi-tenant


    【解决方案1】:

    当请求到达我的登录页面时,我得到了tenantId并将其保存在会话中

    Integer tenantId = tenantResolver?.getTenantFromRequest(request)
    if (session.tenantId == null) {
       session.tenantId = tenantId
    }
    

    为了获取登录用户的详细信息,我通过实现 GrailsUserDetailsS​​ervice 并在事务中调用来覆盖“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)
         }
      }
    }
    

    现在我的问题解决了。

    【讨论】:

    • 嗨,ramesh,你能 ping 我的邮件 id..我面临类似的问题
    【解决方案2】:

    您必须确保在 Spring 安全过滤器之前注册了多租户 servlet 过滤器。我不确定如何在不重新编译插件的情况下执行此操作。

    【讨论】:

      猜你喜欢
      • 2016-05-24
      • 2012-05-24
      • 2013-11-24
      • 2016-08-30
      • 2013-06-21
      • 2015-07-01
      • 2016-04-16
      • 1970-01-01
      • 2015-08-07
      相关资源
      最近更新 更多