<div><font face="verdana,sans-serif">Hello Esteban,</font></div>
<div><font face="verdana,sans-serif"> </font></div>
<div><font face="verdana,sans-serif">Thanks for your invite to contribute. </font></div>
<div><font face="verdana,sans-serif">Actually I really like Drools and belive it has most of the things required for a successfull product.</font></div>
<div><font face="verdana,sans-serif"> </font></div>
<div><font face="verdana,sans-serif">Right now(for 1.5 months) I cannot do main stream contribution but I promise that whatever I do to integrate or enhance Guvnor for our custom requirements I will make it available to all..</font></div>
<div><font face="verdana,sans-serif"> </font></div>
<div><font face="verdana,sans-serif">I hope the stuff I have done might be useful for somebody. </font></div>
<div><font face="verdana,sans-serif">For drools-guvnor users, primary purpose is to integrate it into their custom app.(if they don't want to deploy guvnor separately)</font></div>
<div><font face="verdana,sans-serif"> </font></div>
<div><font face="verdana,sans-serif">1. Merging of Guvnor into a cutsom app is not a very difficult tasks. One needs to copy all the Guvnor resources into the respective folders of the cutsomApp. Also the web.xml has to be updated with the Guvnor stuff.</font></div>
<div><font face="verdana,sans-serif">Note: My custom app was based on spring MVC. No GWT but it fits decently.</font></div>
<div><font face="verdana,sans-serif"> </font></div>
<div><font face="verdana,sans-serif">2. Authentication & Authorization:</font></div>
<div><font face="verdana,sans-serif"> The general requirment would be to do authentication & authorization in the Guvnor based on the custom apps.</font><font face="verdana,sans-serif"> Update the components.xml with customAuthenticator & role based permission as true.</font></div>
<div><font face="verdana,sans-serif">(There are other better ways to solve the problem like SSO, SAML but since I was able to merge the apps so I depended on the HttpSession.)</font></div>
<div><font face="verdana,sans-serif"> </font></div>
<div><font face="verdana,sans-serif">From a link in my custom app I am logging into the guvnor by silent authentication. The session can be accessed in your customAuthenticator by </font></div>
<div><font face="courier new,monospace">AdminContext authenticatedAdminInfo = (AdminContext)Contexts.getSessionContext().get("adminSession");</font></div>
<div><font face="courier new,monospace"> </font></div>
<div><font face="verdana,sans-serif">I have written a CustomIntegrator class which does the implicit package creation, assign role to a user on a package.</font></div>
<div><font face="verdana,sans-serif"></font> </div>
<div><font face="verdana,sans-serif">RepositoryService instance can be created by </font></div>
<div><font face="courier new,monospace"><font size="2">(ServiceImplementation) Component.<i>getInstance</i>( </font><font color="#2a00ff" size="2"><font color="#2a00ff" size="2">"org.drools.guvnor.client.rpc.</font></font><u><font size="2">RepositoryService</font></u></font><font face="courier new,monospace"><font color="#2a00ff" size="2"><font color="#2a00ff" size="2">"</font></font><font size="2"> );</font></font></div>
<div><font size="2"><font face="courier new,monospace">
<div><font face="verdana,sans-serif"></font> </div>
<div><font face="verdana,sans-serif">RoleBasedPermissionStore instance can be created by </font></div>
<div>RoleBasedPermissionStore store = (RoleBasedPermissionStore) Component.<i>getInstance</i>(</div></font></font><font face="courier new,monospace"><font color="#2a00ff" size="2"><font color="#2a00ff" size="2">"org.drools.guvnor.server.security.RoleBasedPermissionStore"</font></font><font size="2">);</font></font></div>
<div><font face="courier new,monospace"></font> </div>
<div><font face="courier new,monospace">store.addRoleBasedPermissionForTesting(userName, new RoleBasedPermission(userName,<br> RoleTypes.PACKAGE_ADMIN, orgName, null));</font></div>
<div> </div>
<div> </div>
<div>------------------------------------------------------------------------code snippet---------------------------------------------------------------------------------</div>
<div>package org.drools.sample;</div>
<div>import javax.security.auth.Subject;<br>import javax.security.auth.login.LoginException;<br>import javax.servlet.http.HttpSession;</div>
<div>import <a href="http://org.jboss.seam.annotations.Name">org.jboss.seam.annotations.Name</a>;<br>import org.jboss.seam.contexts.Contexts;<br>import org.jboss.seam.security.Identity;<br>import org.slf4j.Logger;<br>import org.slf4j.LoggerFactory;</div>
<div>import com.sample.admin.framework.adminmgmt.PrincipalAdmin;<br>import com.sample.admin.framework.policy.AdminContext;<br>import com.sample.admin.framework.web.controller.AbstractCygnetController;</div>
<div> </div>
<div>@Name("sampleAuthenticator")<br>public class SampleAuthenticator {</div>
<div> private static final Logger log = LoggerFactory.getLogger( SampleAuthenticator.class );<br> <br> /**<br> * @param session<br> * @return<br> */<br> public boolean authenticate() {<br> <a href="http://log.info">log.info</a>( "User logged in via sample admin login module .");<br>
AdminContext authenticatedAdminInfo = (AdminContext)Contexts.getSessionContext().get(AbstractCygnetController.SESSION_ADMIN_CONTEXT);<br> if(authenticatedAdminInfo == null)<br> return false;//no session available for the user<br>
PrincipalAdmin principalAdmin = authenticatedAdminInfo.getPrincipal();<br> if("ACTIVE".equalsIgnoreCase(principalAdmin.getAuthStatus())) {<br> Identity.instance().getCredentials().setUsername( principalAdmin.getUserID() );<br>
//CallbackHandler callbak = Identity.instance().getCredentials().createCallbackHandler();<br> //callbak.handle(callbacks);<br> SamplePrincipal[] authPrincipals = new SamplePrincipal[3];<br> //Adding username to the subject<br>
authPrincipals[0] = new SamplePrincipal(principalAdmin.getUserID());<br> //Adding organization to the subject<br> authPrincipals[1] = new SamplePrincipal(principalAdmin.getOrgName());<br>
//Adding role to the subject<br> authPrincipals[2] = new SamplePrincipal(principalAdmin.getRole().getName());<br> Subject subject = Identity.instance().getSubject();<br> for (int i = 0; i < authPrincipals.length; i++) {<br>
if(!subject.getPrincipals().contains(authPrincipals[i]))<br> {<br> subject.getPrincipals().add(authPrincipals[i]);<br> }<br> }<br> return true;<br>
}<br> return false;<br> }<br> <br> /**<br> * @param session<br> * @return<br> */<br> public boolean sessionAuthenticate(HttpSession session) {<br> <a href="http://log.info">log.info</a>( "User logged in via sample admin login module .");<br>
//AdminContext authenticatedAdminInfo = (AdminContext)session.getAttribute("adminSession");<br> AdminContext authenticatedAdminInfo = (AdminContext) session.getAttribute(AbstractCygnetController.SESSION_ADMIN_CONTEXT);<br>
if(authenticatedAdminInfo == null)<br> return false;//no session available for the user<br> PrincipalAdmin principalAdmin = authenticatedAdminInfo.getPrincipal();<br> if("ACTIVE".equalsIgnoreCase(principalAdmin.getAuthStatus())) {<br>
Identity.instance().getCredentials().setUsername( principalAdmin.getUserID() );<br> //CallbackHandler callbak = Identity.instance().getCredentials().createCallbackHandler();<br> //callbak.handle(callbacks);<br>
SamplePrincipal[] authPrincipals = new SamplePrincipal[3];<br> //Adding username to the subject<br> authPrincipals[0] = new SamplePrincipal(principalAdmin.getUserID());<br> //Adding organization to the subject<br>
authPrincipals[1] = new SamplePrincipal(principalAdmin.getOrgName());<br> //Adding role to the subject<br> authPrincipals[2] = new SamplePrincipal(principalAdmin.getRole().getName());<br>
<br> Subject subject = Identity.instance().getSubject();<br> for (int i = 0; i < authPrincipals.length; i++) {<br> if(!subject.getPrincipals().contains(authPrincipals[i]))<br>
{<br> subject.getPrincipals().add(authPrincipals[i]);<br> }<br> }<br> }<br> <br> try {<br> Identity.instance().authenticate();<br>
} catch ( LoginException e ) {<br> log.error( "Unable to login.", e );<br> return false;<br> }<br> return Identity.instance().isLoggedIn();<br> }<br>}<br> </div>
<div class="gmail_quote">2010/12/23 Esteban Aliverti <span dir="ltr"><<a href="mailto:esteban.aliverti@gmail.com" target="_blank">esteban.aliverti@gmail.com</a>></span><br>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote">Andrew Waterman and Jervis Liu were working on a REST API for Guvnor: <a href="https://issues.jboss.org/browse/GUVNOR-1080" target="_blank">https://issues.jboss.org/browse/GUVNOR-1080</a> Maybe you can help them.
<div>In the other hand, I have implemented a way to embedd Guvnor's editors in external applications: <a href="http://ilesteban.wordpress.com/2010/11/23/guvnor-embed-assets-editor-in-your-application/" target="_blank">http://ilesteban.wordpress.com/2010/11/23/guvnor-embed-assets-editor-in-your-application/</a> </div>
<div><br></div>
<div>Best Regards,<br clear="all"><br>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX<br><br>Esteban Aliverti<br>- Developer @ <a href="http://www.plugtree.com/" target="_blank">http://www.plugtree.com </a><br>- Blog @ <a href="http://ilesteban.wordpress.com/" target="_blank">http://ilesteban.wordpress.com</a><br>
<br><br>
<div class="gmail_quote">2010/12/23 Harshit Bapna <span dir="ltr"><<a href="mailto:hrbapna@gmail.com" target="_blank">hrbapna@gmail.com</a>></span><br>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote">
<div>
<div></div>
<div>
<div><font face="tahoma,sans-serif">Hello All,</font></div>
<div><font face="tahoma,sans-serif"></font> </div>
<div><font face="tahoma,sans-serif">I am able to successfully integrate Guvnor into my custom app. (based on spring)</font></div>
<div>(<a href="http://drools-java-rules-engine.46999.n3.nabble.com/How-to-integrate-Guvnor-GUI-in-a-test-app-td1595617.html" target="_blank">http://drools-java-rules-engine.46999.n3.nabble.com/How-to-integrate-Guvnor-GUI-in-a-test-app-td1595617.html</a>)</div>
<div><font face="tahoma,sans-serif"></font> </div>
<div><font face="tahoma,sans-serif">I have written some code in the index.jsp which invokes the ServiceImplementation of Guvnor.</font></div>
<div><font face="tahoma,sans-serif">I am observing that RuleRepository object is coming as null.</font></div>
<div><font size="2"><font face="tahoma,sans-serif">Note: Through the integrated app If I hit the Guvnor URL than it is working as normal.</font></font></div>
<div><font size="2"><font face="courier new,monospace"></font></font> </div>
<div><font size="2"><font face="courier new,monospace">private ServiceImplementation getService() {<br> ServiceImplementation impl = new ServiceImplementation();<br> RulesRepository <font color="#990000">repository</font> = impl.getRulesRepository();<br>
return impl;<br>}</font></font></div>
<div><font face="Courier New"></font> </div>
<div><font face="tahoma,sans-serif">What is the suggested way of using the Guvnor services from the jsp/java ?</font></div>
<div><font face="Courier New"></font> </div>
<div><font face="Courier New"></font> </div><br></div></div>_______________________________________________<br>rules-users mailing list<br><a href="mailto:rules-users@lists.jboss.org" target="_blank">rules-users@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/rules-users" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-users</a><br><br></blockquote></div><br></div><br>_______________________________________________<br>
rules-users mailing list<br><a href="mailto:rules-users@lists.jboss.org" target="_blank">rules-users@lists.jboss.org</a><br><a href="https://lists.jboss.org/mailman/listinfo/rules-users" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-users</a><br>
<br></blockquote></div><br>