Hi folks,

I've been trying to add a custom login module for Jboss Portal so that we can 
authenticate our users against a datasource accessible via a web service. I'm 
having a few issues getting this to work and any pointers would be helpful

Firstly:

Portal 2.6
Jboss AS 4.05 GA

The approach I have taken is to extend the IdentityLoginModule and override the 
initialize(), getRoleSets() and validatePasswords() method.

The relevant code sections are included below:


public void initialize(Subject subject,CallbackHandler handler,Map 
sharedState,Map options)
        {
                super.initialize(subject,handler,sharedState,options);
                
                this.additionalRole = (String)options.get("additionalRole");
                this.hashAlgorithm = (String)options.get("hashAlgorithm");
                this.hashEncoding = (String)options.get("hashEncoding");
                this.hashCharset = (String)options.get("hashCharset");
                this.userModuleJNDIName = 
(String)options.get("userModuleJNDIName");
                this.roleModuleJNDIName = 
(String)options.get("roleModuleJNDIName");
                this.userProfileModuleJNDIName = 
(String)options.get("userProfileModuleJNDIName");
                this.membershipModuleJNDIName = 
(String)options.get("membershipModuleJNDIName");
                
                if(options.containsKey("ignorePasswordCase"))
                {
                        this.ignorePasswordCase = 
((String)options.get("ignorePasswordCase")).equalsIgnoreCase("true");
                }
                
                this.endpoint = (String)options.get("serviceEndPoint");
                this.wsdlLocation = (String)options.get("serviceWSDL");
                this.namespace = (String)options.get("serviceNamespace");
        }


The initialize method calls the super.initialize(), and then simply stores 
values of our jndi services for Portal User/Role/Membership creation and also 
the endpoints of of WS.


protected Group[] getRoleSets() throws LoginException
        {
                Group rolesGroup = new SimpleGroup("Roles");
                rolesGroup.addMember(createIdentity("Authenticated"));
                rolesGroup.addMember(createIdentity("Users"));
                
                return new Group[]{rolesGroup};
        }


public Principal createIdentity(String username)
        {
                return new UserPrincipal(username);
        }


The getRoleSets() method is hardcoded to return the roles of Users and 
Authenticated which is fine for our needs.

Finally I have the overridden validatePassword() method. At the minute the 
password verification simply returns true so that I can get this thing working 
(it will of course verify the given password against that returned by the WS 
call). The user is then added to the portal user database by making use of 
UserModule, RoleModule and MembershipModule respectively if they do not already 
have a portal db presence.


protected boolean validatePassword(String password,String expectedPassword)
        {
                
                if(!this.checkPassword(password, expectedPassword))
                        return false;
                
                // If the user is present in the portal DB, we simply return. 
                if(this.getUserStatus(password) == UserStatus.OK)
                {
                        return true;
                }
                
                try
                {
                     this.addUserToPortalDB(getIdentity().getName(),password);
                }
                catch(IdentityException e)
                {
                        logger.debug(cn + ".validatePassword() - Cannot add 
User to Portal Database: " + e.getMessage());
                        e.printStackTrace();
                        return false;
                }
                                
                return true;
        }


private boolean checkPassword(String password,String expectedPassword)  {
        return true;
}

private User addUserToPortalDB(final String username,final String userPass) 
throws IdentityException
        {
                try
                {
                        TransactionManager tm = this.getTransactionManager();
                        return (User)Transactions.required(tm,new 
Transactions.Runnable()
                        {
                                public Object run() throws Exception
                                {
                                        User user = 
getUserModule().createUser(username,userPass);
                                        Set roleSet = new HashSet();
                                
                                        
if(user.getUserName().equalsIgnoreCase("admin"))
                                        {
                                                
roleSet.add(getRoleModule().findRoleByName("Admin"));
                                        }
                                
                                        
                                        
roleSet.add(getRoleModule().findRoleByName("User"));
                                        
                                        
getMembershipModule().assignRoles(user,roleSet);
                                        
getUserProfileModule().setProperty(user,User.INFO_USER_ENABLED,new 
Boolean(true));
                                        
                                        return user;
                                }
                        });
                }
                catch(NamingException e)
                {
                        logger.info(cn + ".addUserToPortalDB() - 
NamingException Looking Up UserModule");
                        throw new IdentityException(e);
                }
                catch(Exception e)
                {
                        logger.info(cn + ".addUserToPortalDB() - Exception 
during Transaction");
                        throw new IdentityException(e);
                }
        }


I have altered my jboss-portal.sar/conf/login-config.xml to include the 
following


<login-module code="com.restfurl.portal.jaas.authentication.TraderLoginModule" 
flag="requisite">
                <module-option 
name="userModuleJNDIName">java:/portal/UserModule</module-option>
                <module-option 
name="roleModuleJNDIName">java:/portal/RoleModule</module-option>
                <module-option 
name="userProfileModuleJNDIName">java:/portal/UserProfileModule</module-option>
                <module-option 
name="membershipModuleJNDIName">java:/portal/MembershipModule</module-option>
                <module-option 
name="additionalRole">Authenticated</module-option>
                <module-option 
name="serviceEndPoint">http://localhost:8080/analystServices/analyst</module-option>
                <module-option 
name="serviceWSDL">http://localhost:8080/analystServices/analyst?wsdl</module-option>
                <module-option 
name="serviceNamespace">com.restfurl.portal.services.namespaces</module-option>
                <module-option name="ignorePasswordCase">true</module-option>
                <module-option 
name="password-stacking">useFirstPass</module-option>
           </login-module>
           <login-module 
code="org.jboss.portal.identity.auth.IdentityLoginModule" flag="required">
            <module-option name="unauthenticatedIdentity">guest</module-option>
            <module-option 
name="userModuleJNDIName">java:/portal/UserModule</module-option>
            <module-option 
name="roleModuleJNDIName">java:/portal/RoleModule</module-option>
            <module-option 
name="userProfileModuleJNDIName">java:/portal/UserProfileModule</module-option>
            <module-option 
name="membershipModuleJNDIName">java:/portal/MembershipModule</module-option>
            <module-option name="additionalRole">Authenticated</module-option>
            <module-option name="password-stacking">useFirstPass</module-option>
         </login-module>


The code for my LoginModule is packaged as a .jar file and I have this included 
in jboss-portal.sar/lib. Is this the correct place for the .jar?

When attempting to use my LoginModule, the only output I receive on the 
login.jsp is "null". I do not seem to get any errors on system output or any 
exceptions.

If anyone can offer any suggestions, it would be mighty appreciated.

cheers

Rob

View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4052473#4052473

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4052473
_______________________________________________
jboss-user mailing list
jboss-user@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to