Как настроить плагин Multi-tenant как однопользовательский, а плагин безопасности Spring - в качестве распознавателя? - PullRequest
0 голосов
/ 08 декабря 2010

Я могу создать безопасное мультитенантное веб-приложение с Grails:

  • Настройка плагина безопасности Spring,
  • установка модуля с несколькими арендаторами (с помощью установки с несколькими арендаторами и безопасности нескольких арендаторов)
  • update config.groovy:

    арендатор { mode = "multiTenant" resolver.type = "springSecurity" }

  • добавить: целочисленный userTenntId в домене пользователя

  • добавить класс домена для организации-арендатора
  • связать арендаторов с Организацией
  • Редактировать BootStrap.groovy.

В мультитенантном режиме все работает нормально, но как использовать режим = "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)

1 Ответ

0 голосов
/ 27 октября 2011

Я все еще тестирую мультитенантный плагин (ядро) в режиме SingleTenant, но он уже запущен, но не тестируется полностью.

Вот шаги:

1- установить плагин безопасности пружины , запустить grails s2-quickstart для установки ролей

2- Установить плагин multi-tenant-ehcache и измените свой cache.provider_class в Datasource.groovy на:

cache.provider_class = 'grails.plugin.multitenant.ehcache.cache.MultiTenantEhCacheProvider '


3- Установите мультитенантный (основной) плагин и настройте источник данныхresolver плюс dns resolver я сделал это статическим способом.Кроме того, в документации по плагину сказано, что мы можем настроить dataSoruceTenantMap следующим образом:


dataSourceTenantMap {

  • t1 = "jdbc: mysql: // localhost / ets_dev1 "

  • t2 =" jdbc: mysql: // localhost / ets_dev2 "

}
не работаетдля меня, поэтому я использовал опцию jndi через grails.naming.entries в конфигурации:

/ ** 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:" Контейнер ",
описание:" Мой источник данных ",
driverClassИмя: "com.mysql.jdbc.Driver",
url: "jdbc: mysql: // localhost: 3306 / lh_dev2",
имя пользователя: "xxx",
пароль: "xxx",
maxActive: "100",
maxIdle: "30",
maxWait: "10000"
]
]

// Настройка модуля MultiTenant

tenant {

    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 различными базами данных, как только вы нажмете, например:

каждый арендатор (клиент) имеет свою собственную базу данных.



4- Install multi-tenant-spring-подключаемый модуль безопасности и выполните следующие действия (обратите внимание, что я еще не внедрил подключаемый модуль безопасности, как только я это сделаю, я опубликую результаты):

В Config.groovy , ваш клиентсвойство resolver должно выглядеть следующим образом:

tenant{ 
 resolver.type = "springSecurity"
}



You wТакже мне нужно добавить следующее поле в свой пользовательский домен Spring-Security. Класс

Целочисленный userTenantId



Окончательные проблемы ->

Каждый раз, когда мы запускаем grails, он будет только создавать / обновлять базу данных по умолчанию, все остальные будут оставаться чистыми, так как я все еще не знаю, как решить эту проблему, поэтому я просто экспортировал структуру базы данных по умолчанию для всех моих других арендаторов.база данных.

Наконец, я не сделал @MultiTenant Annoation для доменов, потому что я работаю с другой базой данных, не видел смысла вводить tenantid, так как каждый БД имеет свои личные записи.

...