Difference between revisions of "Grails Plugin - Multi Tenant"

From Blue-IT.org Wiki

(4. Build a MultiTenant environment in BootStrap.groovy)
Line 63: Line 63:
 
    
 
    
 
         def domainName = ConfigurationHolder.config.grails.'''tenantDomain'''
 
         def domainName = ConfigurationHolder.config.grails.'''tenantDomain'''
         if {
+
         if ( '''DomainTenantMap.findByName('myweb1')''' ) {}
          '''DomainTenantMap.findByName('myweb1')'''
+
         else {
         } else {
 
 
           new DomainTenantMap(   
 
           new DomainTenantMap(   
 
                       '''name:'myweb1'''',
 
                       '''name:'myweb1'''',

Revision as of 11:35, 5 September 2011

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.

5. Include a login from spring security plugin

import grails.plugin.multitenant.core.util.TenantUtils

class LoginController {

[...]

/**
 * Show the login page.
 */
def auth = {





 
}