2010-12-08 50 views
0

Je peux créer un endroit sûr, application web multi-locataire avec Grails par:Comment configurer le plugin multi-tenant en tant que single-locataire avec le plugin de sécurité Spring en tant que résolveur?

  • configuration plug-in de sécurité du printemps,
  • configuration plug-in multi-locataires (via multi-locataire installer et multi-locataire-printemps-sécurité)
  • mise à jour config.groovy:

    locataire { mode = "mutualisée" resolver.type = "springSecurity" }

  • add: Entier userTenntId dans le domaine de l'utilisateur

  • ajouter une classe de domaine pour l'organisation des locataires
  • associé aux locataires Organisation
  • Modifier BootStrap.groovy.

Tout fonctionne correctement en mode multi-tenant, mais comment utiliser mode = "singleTenant"?
Ce son de configuration ne fonctionne pas:

locataire { mode = "singleTenant" resolver.type = "springSecurity" }


Edit:

J'essaie cette config:

tenant { 
    mode = "singleTenant" 
    resolver.type = "springSecurity" 
    datasourceResolver.type = "config" 

    dataSourceTenantMap { 
    t1 = "jdbc:hsqldb:file:custFoo" 
    t2 = "jdbc:hsqldb:file:custBar" 
    } 
} 

Mais je reçois:

ERROR errors.GrailsExceptionResolver - Executing action [list] of controller [org.example.TicketController] caused exception: java.lang.StackOverflowError 

et:

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) 

Répondre

0

Je suis toujours tester le plugin locataire à plusieurs (de base) en mode singleTenant mais il est déjà en cours d'exécution altho pas testé throughlly.

Voici les étapes:

1- installer plugin sécurité printemps, exécutez Grails s2-QuickStart pour configurer les rôles

2- Installez plusieurs -tenant-ehcache plugin et modifiez votre cache.provider_class dans Datasource.groovy à:

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


3-Installation locataire multiples (core) de plugin et mettre en place le résolveur de source de données ainsi que la résolution DNS je l'ai fait d'une manière statique. De plus altho dans le plugin doc dit que nous pouvons configurer le dataSoruceTenantMap comme ceci:


dataSourceTenantMap {

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

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

}
na pas travaillé pour moi, donc je l'ai utilisé l'option JNDI par grails.naming.entries dans la config:

/** Config.groovy **/

grails.naming.entries = [
"jdbc/lh_dev1": [
Type: "javax.sql.DataSource",
auth: "Container",
descripti sur: "Ma source de données",
driverClassName: "com.mysql.jdbc.Driver",
url: "jdbc: mysql: // localhost: 3306/lh_dev1",
nom d'utilisateur: "xxx",
mot de passe: "xxx",
maxActive: "100",
maxIdle: "30",
maxWait: "10000"
],
"jdbc/lh_dev2": [
Type: « javax.sql .DataSource ",
auth:" Conteneur ",
Description: "Ma source de données",
driverClassName: "com.mysql.jdbc.Driver "
url: "jdbc: mysql: // localhost: 3306/lh_dev2",
nom d'utilisateur: "xxx",
mot de passe: "xxx",
maxActive: "100",
maxIdle:" 30" ,
maxWait: "10000"
]
]

// configuration plug-in mutualisée

locataire {

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 

      } 
    } 

À ce stade, vous avez 2 domaines liés à 2 bases de données diférentes une fois u cliquez par exemple:

chaque locataire (client) a sa propre base de données.



4- Installer plug-in multi-locataires-printemps-sécurité et suivre les étapes suivantes (note i na pas mis en œuvre le plug-in de sécurité encore une fois que je fais je posterai les résultats):

Dans Config.groovy, votre résolveur locataires devrait ressembler à ceci:

tenant{ 
resolver.type = "springSecurity" 
} 



Vous aurez aussi besoin d'ajouter le champ suivant à votre classe utilisateur Printemps-sécurité du domaine

Entier userTenantId



Questions finales ->

Chaque fois que nous allumons des grails, il ne fera que créer/mettre à jour sur le defaul t base de données tous les autres resteront propres car je ne sais toujours pas comment résoudre ce problème si j'ai simplement exporté la structure de base de données par défaut à tous mes autres base de données des locataires.

Enfin, je n'ai pas fait l'annotation @MultiTenant sur les domaines parce que je travaille avec diferent base de données n'a pas vu le point d'injecter le tenantid puisque chaque db a ses propres dossiers personnels.