Grails Plugin - Multi Tenant

From Blue-IT.org Wiki

Revision as of 11:04, 5 September 2011 by Apos (talk | contribs) (Created page with "An introduction on the concept of multitenant can be found at: * [http://en.wikipedia.org/wiki/Multitenancy http://en.wikipedia.org/wiki/Multitenancy] * [http://www.itwissen.info...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

An introduction on the concept of multitenant can be found at:

Documentation

1. Declare mode in Config.groovy

// Multi Tenant
tenant {
	// multiTenant is the default 
	// do "grails create-dns-map" when changing tenantDomains
	// this stroes the dns/tenant mappings into the database
	resolver.request.dns.type = "db"
}

Later on you can use tenant[dot] to refer to the TenantMap domain class (see later on).

2. Declare Tenant Class

This class should be a top level class. E.g. "Organisation" hasMany "Users".

import grails.plugin.multitenant.core.groovy.compiler.MultiTenant;
@MultiTenant
class Organisation {

[...]

3. Create a TenantMap domain class

This is achieved by using the command

grails create-dns-map

This automatically creates a domain class with the name DomainTenantMap.groovy.

package tenant

/**
 * Maps domain name to tenantId
 */
class DomainTenantMap { 
	
  String domainName
  Integer mappedTenantId
  String name
 
  static constraints = {}
}

This class maps to a database table domain_tenant_map.

4. Build a MultiTenant environment in BootStrap.groovy

Tenants (e.g. organisations) are created by instantiating a new tenantDomain ConfigurationHolder.

import grails.plugin.multitenant.core.util.TenantUtils
import org.codehaus.groovy.grails.commons.ConfigurationHolder
import tenant.DomainTenantMap // was created with grails create-domain-map

class BootStrap {

   def init = { servletContext ->	
 
       def domainName = ConfigurationHolder.config.grails.tenantDomain
       if  { 
          DomainTenantMap.findByName('myweb1')
       } else {
          new DomainTenantMap(  
                     name:'myweb1',
                     domainName:'sub.' + domainName,
                     mappedTenantId:1).save(flush:true);
       }

The property domainName refers to the correspondent field in the database domain_name. The property mappedtenantId to the field name.

mysql> select * from domain_tenant_map;
+----+---------+-----------------+------------------+----------------+
| id | version | domain_name     | mapped_tenant_id | name           |
+----+---------+-----------------+------------------+----------------+
|  1 |       0 | domain.tld      |                1 | myweb1         |
[...]

You can use sub.domain.tld by concatenating the strings when setting domainName