You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ofbiz.apache.org by "Jacques Le Roux (JIRA)" <ji...@apache.org> on 2008/11/06 23:11:45 UTC

[jira] Updated: (OFBIZ-2020) Using one Ofbiz instance with multiple databases

     [ https://issues.apache.org/jira/browse/OFBIZ-2020?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Jacques Le Roux updated OFBIZ-2020:
-----------------------------------

    Description: 
I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
I will be open to discuss any suggestion for improving this issue.
Following is a patch for current ofbiz trunk version:

  was:
I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
I will be open to discuss any suggestion for improving this issue.
Following is a patch for current ofbiz trunk version:
Index: /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml

===================================================================

--- /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml	(revision 705872)

+++ /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml	(working copy)

@@ -2611,6 +2611,9 @@

     </extend-entity>

     <extend-entity entity-name="UserLogin">

         <field name="partyId" type="id"></field>

+        <!--Begin specific : field used to store the delegator name along  theuse session -->

+        <field name="delegator" type="id"></field>

+        <!-- End Specific  -->

         <relation type="one" fk-name="USER_PARTY" rel-entity-name="Party">

             <key-map field-name="partyId"/>

         </relation>

Index: /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml

===================================================================

--- /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml	(revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml	(working copy)

@@ -1617,6 +1617,23 @@

         <value xml:lang="zh_CN">十二月</value>

         <value xml:lang="zh">十二月</value>

     </property>

+    <property key="CommonCompany">

+        <value xml:lang="ar">المؤسسة</value>

+        <value xml:lang="en">Company</value>

+        <value xml:lang="fr">Entreprise</value>

+    </property>

     <property key="CommonDelete">

         <value xml:lang="ar">حذف</value>

         <value xml:lang="cs">Smazat</value>

Index: /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java	(revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java	(working copy)

@@ -90,7 +90,7 @@

         if (username == null) username = (String) context.get("username");

         String password = (String) context.get("login.password");

         if (password == null) password = (String) context.get("password");

-

+        String userDelegatorName = (String) context.get("userDelegatorName");

         // get the visitId for the history entity

         String visitId = (String) context.get("visitId");

 

@@ -193,7 +193,9 @@

                                 // successful login & no loggout flag, no need to change anything, so don't do the store

                                 doStore = false;

                             }

-

+                            if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+                                userLogin.set("delegator", userDelegatorName);

+                            }

                             successfulLogin = "Y";

 

                             if (!isServiceAuth) {

Index: /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl

===================================================================

--- /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl	(revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl	(working copy)

@@ -96,6 +96,7 @@

   </div>

   <div id="masthead">

     <ul>

+      <li> Delegator : ${delegator.getDelegatorName()}</li>

       <#if (userPreferences.COMPACT_HEADER)?default("N") == "Y">

         <li class="logo-area">

           <#if shortcutIcon?has_content>

Index: /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl

===================================================================

--- /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl	(revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl	(working copy)

@@ -18,7 +18,7 @@

 -->

 

 <#if requestAttributes.uiLabelMap?exists><#assign uiLabelMap = requestAttributes.uiLabelMap></#if>

-

+<#assign multidelegator = Static["org.ofbiz.base.util.UtilProperties"].getPropertyValue("security.properties", "multi.delegator")>

 <#assign previousParams = sessionAttributes._PREVIOUS_PARAMS_?if_exists>

 <#if previousParams?has_content>

   <#assign previousParams = "?" + previousParams>

@@ -46,6 +46,12 @@

             <td class="label">${uiLabelMap.CommonPassword}</td>

             <td><input type="password" name="PASSWORD" value="" size="20"/></td>

           </tr>

+          <#if multidelegator=="true">

+          <tr>

+           <td class="label">${uiLabelMap.CommonCompany}</td>

+           <td><input type="text" class="inputBox" name="DELEGATOR" value="" size="20"/></td>

+          </tr>

+          </#if>

           <tr>

             <td colspan="2" align="center">

               <input type="submit" value="${uiLabelMap.CommonLogin}"/>

Index: /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml

===================================================================

--- /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml	(revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml	(working copy)

@@ -53,6 +53,9 @@

         <group-map group-name="org.ofbiz" datasource-name="localderby"/>

         <group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>

     </delegator>

+    <delegator name="entreprise1" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main">

+        <group-map group-name="org.ofbiz" datasource-name="localpostgres1"/>        

+    </delegator>

     <delegator name="default-no-eca" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main" entity-eca-enabled="false" distributed-cache-clear-enabled="false">

         <group-map group-name="org.ofbiz" datasource-name="localderby"/>

         <group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>

@@ -327,6 +330,33 @@

                 pool-maxsize="250"/>

         <!-- <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/MySqlDataSource" isolation-level="Serializable"/> -->

     </datasource>

+    <datasource name="localpostgres1"

+            helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"

+            schema-name="public"

+            field-type-name="postgres"

+            check-on-start="true"

+            add-missing-on-start="true"

+            use-fk-initially-deferred="false"

+            alias-view-columns="false"

+            join-style="ansi"

+            use-binary-type-for-blob="true">

+            <!-- use this attribute to make the EntityListIterator more effective for pgjdbc 7.5devel and later: 

+                result-fetch-size="50"

+            -->

+        <read-data reader-name="seed"/>

+        <read-data reader-name="seed-initial"/>

+        <read-data reader-name="demo"/>

+        <read-data reader-name="ext"/>

+        <inline-jdbc

+                jdbc-driver="org.postgresql.Driver"

+                jdbc-uri="jdbc:postgresql://127.0.0.1/entreprise1"

+                jdbc-username="ofbiz"

+                jdbc-password="ofbiz"

+                isolation-level="ReadCommitted"

+                pool-minsize="2"

+                pool-maxsize="250"/>

+        <!-- <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/MySqlDataSource" isolation-level="Serializable"/> -->

+    </datasource>

 

     <datasource name="localpostgres"

             helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"

Index: /home/youssef/workspace/ofbiz/framework/security/config/security.properties

===================================================================

--- /home/youssef/workspace/ofbiz/framework/security/config/security.properties	(revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/security/config/security.properties	(working copy)

@@ -77,3 +77,6 @@

 

 # -- Hours after which EmailAdressVerification should expire

 email_verification.expire.hours=48

+

+# -- are we using multi delegator

+multi.delegator=false

Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java	(revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java	(working copy)

@@ -182,7 +182,14 @@

     public GenericDelegator getDelegator() {

         return dispatcher.getDelegator();

     }

-  

+        

+    /**

+     * @see org.ofbiz.service.LocalDispatcher#setDelegator()

+     */

+    public void setDelegator(GenericDelegator delegator) {

+            dispatcher.setDelegator(delegator);

+    }

+

     /**

      * @see org.ofbiz.service.LocalDispatcher#getSecurity()

      */

Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java	(revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java	(working copy)

@@ -100,7 +100,9 @@

     public GenericDelegator getDelegator() {

         return this.delegator;

     }

-

+    public void setDelegator(GenericDelegator delegator) {

+        this.delegator=delegator;

+    }

     public synchronized List<Job> poll() {

         List<Job> poll = FastList.newInstance();

 

Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java	(revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java	(working copy)

@@ -317,7 +317,7 @@

      * @return GenericEntityDelegator associated with this dispatcher

      */

     public GenericDelegator getDelegator();

-

+    public void setDelegator(GenericDelegator delegator);

     /**

      * Gets the Security object associated with this dispatcher

      * @return Security object associated with this dispatcher

Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java	(revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java	(working copy)

@@ -789,7 +789,14 @@

     public GenericDelegator getDelegator() {

         return this.delegator;

     }

-

+    

+    /**

+     * Gets the GenericDelegator associated with this dispatcher

+     * @return GenericDelegator associated with this dispatcher

+     */

+    public void setDelegator(GenericDelegator delegator) {

+        this.delegator = delegator;

+    }

     /**

      * Gets the Security object associated with this dispatcher

      * @return Security object associated with this dispatcher

Index: /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml

===================================================================

--- /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml	(revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml	(working copy)

@@ -271,6 +271,15 @@

         <value xml:lang="th">รหัสผ่านเป็นค่าว่าง กรุณากรอกอีกครั้ง</value>

         <value xml:lang="zh">密码是空的,请重新输入。</value>

     </property>

+    <property key="loginevents.delegator_not_found_reenter">

+        <value xml:lang="de">Company not found, please re-enter.</value>

+        <value xml:lang="en">Company not found, please re-enter.</value>

+        <value xml:lang="fr">Merci de v\u00E9rifiez l'entrepripse</value>

+        <value xml:lang="it">Company not found, please re-enter.</value>

+        <value xml:lang="ru">Company not found, please re-enter.</value>

+        <value xml:lang="th">Company not found, please re-enter.</value>

+        <value xml:lang="zh">Company not found, please re-enter.</value>

+    </property>

     <property key="loginevents.unable_to_login_this_application">

         <value xml:lang="de">Sie können sich nicht bei dieser Anwendung anmelden (benötigte Berechtigungen fehlen).</value>

         <value xml:lang="en">Login for this application couldn't be completed (required permissions missing).</value>

Index: /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java	(revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java	(working copy)

@@ -18,6 +18,8 @@

  *******************************************************************************/

 package org.ofbiz.webapp.control;

 

+import static org.ofbiz.base.util.UtilGenerics.checkMap;

+

 import java.io.UnsupportedEncodingException;

 import java.math.BigInteger;

 import java.net.URLEncoder;

@@ -23,7 +25,6 @@

 import java.net.URLEncoder;

 import java.security.cert.X509Certificate;

 import java.util.Enumeration;

-import java.util.HashMap;

 import java.util.List;

 import java.util.Map;

 import java.util.regex.Matcher;

@@ -47,7 +48,6 @@

 import org.ofbiz.base.util.GeneralException;

 import org.ofbiz.base.util.KeyStoreUtil;

 import org.ofbiz.base.util.UtilFormatOut;

-import static org.ofbiz.base.util.UtilGenerics.checkMap;

 import org.ofbiz.base.util.UtilHttp;

 import org.ofbiz.base.util.UtilMisc;

 import org.ofbiz.base.util.UtilProperties;

@@ -58,7 +58,6 @@

 import org.ofbiz.entity.GenericValue;

 import org.ofbiz.entity.condition.EntityCondition;

 import org.ofbiz.entity.condition.EntityConditionList;

-import org.ofbiz.entity.condition.EntityExpr;

 import org.ofbiz.entity.condition.EntityOperator;

 import org.ofbiz.entity.model.ModelEntity;

 import org.ofbiz.entity.transaction.GenericTransactionException;

@@ -68,6 +67,7 @@

 import org.ofbiz.service.LocalDispatcher;

 import org.ofbiz.service.ModelService;

 import org.ofbiz.service.ServiceUtil;

+import org.ofbiz.webapp.event.CoreEvents;

 import org.ofbiz.webapp.stats.VisitHandler;

 

 /**

@@ -192,6 +192,9 @@

                     Debug.logError("Could not find UserLogin record for setLoggedOut with userLoginId [" + userLoginId + "]", module);

                 } else {

                     userLogin.set("hasLoggedOut", "Y");

+                    if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+                        userLogin.set("delegator", null);

+                    }

                     userLogin.store();

                 }

             } catch (GenericEntityException e) {

@@ -308,9 +311,11 @@

 

         String username = request.getParameter("USERNAME");

         String password = request.getParameter("PASSWORD");

-

+        String userDelegatorName = request.getParameter("DELEGATOR");

+        

         if (username == null) username = (String) session.getAttribute("USERNAME");

         if (password == null) password = (String) session.getAttribute("PASSWORD");

+        if (userDelegatorName == null) userDelegatorName = (String) session.getAttribute("DELEGATOR");

         

         // allow a username and/or password in a request attribute to override the request parameter or the session attribute; this way a preprocessor can play with these a bit...

         if (UtilValidate.isNotEmpty((String) request.getAttribute("USERNAME"))) {

@@ -319,6 +324,11 @@

         if (UtilValidate.isNotEmpty((String) request.getAttribute("PASSWORD"))) {

             password = (String) request.getAttribute("PASSWORD");

         }

+        if("true".equals(UtilProperties.getPropertyValue("securiy.properties", "multi.delegator"))){

+            if (UtilValidate.isNotEmpty((String) request.getAttribute("DELEGATOR"))) {

+                userDelegatorName = (String) request.getAttribute("DELEGATOR");

+            }

+        }

 

         List<String> unpwErrMsgList = FastList.newInstance();

         if (UtilValidate.isEmpty(username)) {

@@ -339,7 +349,21 @@

         if ((password != null) && ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "password.lowercase")))) {

             password = password.toLowerCase();

         }

-

+        if ((userDelegatorName == null) && ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator")))) {

+            String errMsg = UtilProperties.getMessage(resourceWebapp, "loginevents.delegator_not_found_reenter",  UtilHttp.getLocale(request));

+            request.setAttribute("_ERROR_MESSAGE_", errMsg);

+            return "error";

+        }

+        GenericDelegator userDelegator=null;

+        if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {

+            userDelegator=GenericDelegator.getGenericDelegator(userDelegatorName);

+            if (userDelegator==null){

+                String errMsg = UtilProperties.getMessage(resourceWebapp, "loginevents.delegator_not_found_reenter",  UtilHttp.getLocale(request));

+                request.setAttribute("_ERROR_MESSAGE_", errMsg);

+                return "error";

+            }

+        }

+        

         String requirePasswordChange = request.getParameter("requirePasswordChange");

 

         // get the visit id to pass to the userLogin for history

@@ -373,6 +397,10 @@

         }

 

         try {

+            if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {

+                dispatcher.setDelegator(userDelegator);

+                request.getSession().setAttribute("delegatorName", userDelegatorName);

+            }

             result = dispatcher.runSync("userLogin", UtilMisc.toMap("login.username", username, "login.password", password, "visitId", visitId, "locale", UtilHttp.getLocale(request)));

         } catch (GenericServiceException e) {

             Debug.logError(e, "Error calling userLogin service", module);

@@ -385,6 +413,18 @@

         if (ModelService.RESPOND_SUCCESS.equals(result.get(ModelService.RESPONSE_MESSAGE))) {

             GenericValue userLogin = (GenericValue) result.get("userLogin");

             Map<String, Object> userLoginSession = checkMap(result.get("userLoginSession"), String.class, Object.class);

+           

+            try{

+                if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+                    userLogin.set("delegator", userDelegatorName); 

+                }

+                userLogin.store();

+            }

+            catch(GenericEntityException e){

+                request.setAttribute("_ERROR_MESSAGE_", "Unable to store userLogin");

+                return "error";

+            }

+

             if (userLogin != null && "Y".equals(userLogin.getString("requirePasswordChange"))) {

                 return "requirePasswordChange";

             }

@@ -419,7 +459,15 @@

         if (userLoginSession != null) {

             session.setAttribute("userLoginSession", userLoginSession);

         }

-

+        

+            

+        

+        //Begin specific

+        if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {

+        request.getSession().setAttribute("delegatorName", userLogin.getString("delegator"));

+        CoreEvents.changeDelegator(request, response);

+        }

+        //End specific        

         request.setAttribute("_LOGIN_PASSED_", "TRUE");

 

         // run the after-login events

@@ -499,6 +547,16 @@

         // set the logged out flag

         LoginWorker.setLoggedOut(userLogin.getString("userLoginId"), delegator);

 

+        //Begin specific :come back to default delegator for next login

+        if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+            GenericDelegator defaultdelegator=GenericDelegator.getGenericDelegator("default");

+            request.getSession().setAttribute("delegatorName", defaultdelegator.getDelegatorName());  

+            HttpServletResponse response=null;

+            CoreEvents.changeDelegator(request, response);

+        }

+        //End specific   

+

+

         // this is a setting we don't want to lose, although it would be good to have a more general solution here...

         String currCatalog = (String) session.getAttribute("CURRENT_CATALOG_ID");

         // also make sure the delegatorName is preserved, especially so that a new Visit can be created

@@ -778,8 +836,14 @@

             GenericValue currentUserLogin = (GenericValue) session.getAttribute("userLogin");

             if (currentUserLogin != null) {

                 if (currentUserLogin.getString("userLoginId").equals(userLogin.getString("userLoginId"))) {

-                    // is the same user, just carry on...

-                    return "success";

+                    GenericDelegator currentDelegator=(GenericDelegator) session.getAttribute("delegator");

+                    if(("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator")))&&(currentDelegator.getDelegatorName().equals(userLogin.getString("delegator")))){

+                        // is the same user, just carry on...

+                        return "success";

+                    }

+                    else{

+                        return "success";

+                    }

                 }

 

                 // logout the current user and login the new user...

@@ -786,8 +850,19 @@

                 logout(request, response);

                 // ignore the return value; even if the operation failed we want to set the new UserLogin

             }

-

+            

             doBasicLogin(userLogin, request);

+            

+            //Begin specific

+            if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+                String userDelegatorName = userLogin.getString("delegator");

+                request.getSession().setAttribute("delegatorName", userDelegatorName);

+                request.setAttribute("delegatorName", userDelegatorName);

+                CoreEvents.changeDelegator(request, response);

+            }

+            //End specific

+

+            

         } else {

             Debug.logWarning("Could not find userLogin for external login key: " + externalKey, module);


         }

Index: /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java	(revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java	(working copy)

@@ -18,6 +18,9 @@

  *******************************************************************************/

 package org.ofbiz.webapp.event;

 

+import static org.ofbiz.base.util.UtilGenerics.checkCollection;

+import static org.ofbiz.base.util.UtilGenerics.checkMap;

+

 import java.io.File;

 import java.io.FileInputStream;

 import java.io.FileNotFoundException;

@@ -28,7 +31,6 @@

 import java.util.Iterator;

 import java.util.Locale;

 import java.util.Map;

-import java.util.Set;

 import java.util.TimeZone;

 

 import javax.servlet.http.HttpServletRequest;

@@ -38,8 +40,6 @@

 import javolution.util.FastMap;

 

 import org.ofbiz.base.util.Debug;

-import static org.ofbiz.base.util.UtilGenerics.checkCollection;

-import static org.ofbiz.base.util.UtilGenerics.checkMap;

 import org.ofbiz.base.util.UtilHttp;

 import org.ofbiz.base.util.UtilProperties;

 import org.ofbiz.base.util.UtilValidate;

@@ -54,6 +54,7 @@

 import org.ofbiz.service.ModelService;

 import org.ofbiz.service.ServiceDispatcher;

 import org.ofbiz.service.calendar.RecurrenceRule;

+import org.ofbiz.webapp.control.LoginWorker;

 import org.ofbiz.webapp.control.RequestHandler;

 

 /**

@@ -104,12 +105,54 @@

         String delegatorName = request.getParameter("delegator");

         Security security = (Security) request.getAttribute("security");

         Locale locale = UtilHttp.getLocale(request);

+        GenericDelegator delegator=null;

+        //Begin multi-delegator Specific : search for delegatorName into session information

+        if("".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+            String externalKey = request.getParameter(LoginWorker.EXTERNAL_LOGIN_KEY_ATTR);

+            if (externalKey != null) {

+                GenericValue userLogin = (GenericValue) LoginWorker.externalLoginKeys.get(externalKey);

+                if (userLogin != null && delegatorName==null) {

+                    delegatorName = userLogin.getString("delegator");

+                }

+            }

+

+            if(delegatorName==null){

+                delegatorName = (String) request.getSession().getAttribute("delegatorName");

+            }

+            if (delegatorName == null) {

+                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.delegator_not_passed", locale);

+                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

+                return "error";

+            }

 

-        if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {

-            String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);

-            request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

-            return "error";

+            delegator = GenericDelegator.getGenericDelegator(delegatorName);

+

+            if (delegator == null) {

+                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.no_delegator_name_defined", locale);

+                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

+                return "error";

+            }

+        //set the secruity delegator to precise the database against wich the user permissions are checked

+            security.setDelegator(delegator);

+            if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {

+                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);

+                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

+                return "error";

+            }

+        }

+        //End multi-delegator specific

+        else{

+

+            if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {

+                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);

+                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

+                return "error";

+            }

+

+

+           delegator = GenericDelegator.getGenericDelegator(delegatorName);

         }

+

         if (delegatorName == null) {

             String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.delegator_not_passed", locale);

             request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

@@ -115,15 +158,6 @@

             request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

             return "error";

         }

-

-        GenericDelegator delegator = GenericDelegator.getGenericDelegator(delegatorName);

-

-        if (delegator == null) {

-            String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.no_delegator_name_defined", locale);

-            request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

-            return "error";

-        }

-

         // now change the dispatcher to use this delegator

         LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");

         DispatchContext dctx = dispatcher.getDispatchContext();

@@ -144,7 +178,14 @@

 

         request.getSession().setAttribute("delegator", delegator);

         request.getSession().setAttribute("dispatcher", dispatcher);

-

+        dispatcher.getJobManager().setDelegator(delegator);

+        dispatcher.setDelegator(delegator);

+        request.getSession().setAttribute("delegatorName", delegator.getDelegatorName());

+        request.setAttribute("delegator", delegator);

+        request.setAttribute("delegatorName", delegator.getDelegatorName());

+        request.setAttribute("dispatcher", dispatcher);

+        request.setAttribute("security", security);

+        

         return "success";

     }

 


> Using one Ofbiz instance with multiple databases
> ------------------------------------------------
>
>                 Key: OFBIZ-2020
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-2020
>             Project: OFBiz
>          Issue Type: New Feature
>    Affects Versions: SVN trunk
>            Reporter: youssef khaye
>             Fix For: SVN trunk
>
>         Attachments: ofbiz-multi.patch
>
>
> I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
> This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
> Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
> I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
> I will be open to discuss any suggestion for improving this issue.
> Following is a patch for current ofbiz trunk version:

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.