KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jboss > portal > core > security > jaas > HibernateLoginModule


1 /*****************************************
2  * *
3  * JBoss Portal: The OpenSource Portal *
4  * *
5  * Distributable under LGPL license. *
6  * See terms of license at gnu.org. *
7  * *
8  *****************************************/

9 package org.jboss.portal.core.security.jaas;
10
11 import java.security.Principal JavaDoc;
12 import java.security.acl.Group JavaDoc;
13 import java.util.HashMap JavaDoc;
14 import java.util.Iterator JavaDoc;
15 import java.util.Map JavaDoc;
16
17 import javax.naming.InitialContext JavaDoc;
18 import javax.naming.NamingException JavaDoc;
19 import javax.security.auth.Subject JavaDoc;
20 import javax.security.auth.callback.CallbackHandler JavaDoc;
21 import javax.security.auth.login.LoginException JavaDoc;
22 import javax.transaction.TransactionManager JavaDoc;
23
24 import org.jboss.portal.common.transaction.Transactions;
25 import org.jboss.security.SimpleGroup;
26 import org.jboss.security.auth.spi.UsernamePasswordLoginModule;
27 import org.hibernate.SessionFactory;
28 import org.hibernate.Session;
29 import org.hibernate.HibernateException;
30 import org.hibernate.Query;
31
32 /**
33  * A login module that use hibernate as underlying operational environment.
34  *
35  * @author <a HREF="mailto:julien@jboss.org">Julien Viet</a>
36  * @version $Revision: 1.6 $
37  */

38 public class HibernateLoginModule
39       extends UsernamePasswordLoginModule
40 {
41
42    protected String JavaDoc factoryJNDIName;
43    protected String JavaDoc principalsQuery;
44    protected String JavaDoc rolesQuery;
45    protected String JavaDoc additionalRole;
46
47    public void initialize(Subject JavaDoc subject, CallbackHandler JavaDoc callbackHandler, Map JavaDoc sharedState, Map JavaDoc options)
48    {
49       super.initialize(subject, callbackHandler, sharedState, options);
50       
51       // Get data
52
factoryJNDIName = (String JavaDoc)options.get("factoryJNDIName");
53       principalsQuery = (String JavaDoc)options.get("principalsQuery");
54       rolesQuery = (String JavaDoc)options.get("rolesQuery");
55       additionalRole = (String JavaDoc)options.get("additionalRole");
56       
57       // Some info
58
log.trace("factoryJNDIName = " + factoryJNDIName);
59       log.trace("principalsQuery = " + principalsQuery);
60       log.trace("rolesQuery = " + rolesQuery);
61       log.trace("additionalRole = " + additionalRole);
62    }
63
64    private SessionFactory factory;
65
66    private Session getSession() throws HibernateException, IllegalStateException JavaDoc, NamingException JavaDoc
67    {
68       if (factory == null)
69       {
70          factory = (SessionFactory)new InitialContext JavaDoc().lookup(factoryJNDIName);
71       }
72       return factory.getCurrentSession();
73    }
74
75    protected String JavaDoc getUsersPassword() throws LoginException JavaDoc
76    {
77       try
78       {
79          TransactionManager JavaDoc tm = (TransactionManager JavaDoc)new InitialContext JavaDoc().lookup("java:/TransactionManager");
80          return (String JavaDoc)Transactions.required(tm, new Transactions.Runnable()
81          {
82             public Object JavaDoc run() throws Exception JavaDoc
83             {
84                Session session = null;
85                String JavaDoc password = null;
86                try
87                {
88                   session = getSession();
89                   Query query = session.createQuery(principalsQuery);
90                   query.setString("username", getUsername());
91                   password = (String JavaDoc)query.uniqueResult();
92                }
93                catch (Exception JavaDoc e)
94                {
95                   throw new LoginException JavaDoc(e.toString());
96                }
97                return password;
98             }
99          });
100       }
101       catch (Exception JavaDoc e)
102       {
103          Throwable JavaDoc cause = e.getCause();
104          throw new LoginException JavaDoc(cause.toString());
105       }
106    }
107
108    protected Group JavaDoc[] getRoleSets() throws LoginException JavaDoc
109    {
110       try
111       {
112          TransactionManager JavaDoc tm = (TransactionManager JavaDoc)new InitialContext JavaDoc().lookup("java:/TransactionManager");
113          return (Group JavaDoc[])Transactions.required(tm, new Transactions.Runnable()
114          {
115             public Object JavaDoc run() throws Exception JavaDoc
116             {
117                Group JavaDoc[] roleSets = null;
118                Session session = null;
119                try
120                {
121                   session = getSession();
122                   Query query = session.createQuery(rolesQuery);
123                   query.setString("username", getUsername());
124
125                   Group JavaDoc rolesGroup = new SimpleGroup("Roles");
126                   rolesGroup.addMember(HibernateLoginModule.this.createIdentity(additionalRole));
127                   HashMap JavaDoc setsMap = new HashMap JavaDoc();
128                   setsMap.put("Roles", rolesGroup);
129
130                   for (Iterator JavaDoc iterator = query.iterate(); iterator.hasNext();)
131                   {
132                      String JavaDoc name = (String JavaDoc)iterator.next();
133                      String JavaDoc groupName = "Roles";
134
135                      Group JavaDoc group = (Group JavaDoc)setsMap.get(groupName);
136                      if (group == null)
137                      {
138                         group = new SimpleGroup(groupName);
139                         setsMap.put(groupName, group);
140                      }
141
142                      try
143                      {
144                         Principal JavaDoc p = HibernateLoginModule.this.createIdentity(name);
145                         group.addMember(p);
146                      }
147                      catch (Exception JavaDoc e)
148                      {
149                         log.debug("Failed to create principal " + name, e);
150                      }
151                   }
152
153                   roleSets = new Group JavaDoc[setsMap.size()];
154                   setsMap.values().toArray(roleSets);
155                }
156                catch (Exception JavaDoc e)
157                {
158                   throw new LoginException JavaDoc(e.toString());
159                }
160                return roleSets;
161             }
162          });
163       }
164       catch (Exception JavaDoc e)
165       {
166          Throwable JavaDoc cause = e.getCause();
167          throw new LoginException JavaDoc(cause.toString());
168       }
169
170    }
171
172 }
173
Popular Tags