Hi i haven't showed the de.danet.an.staffmgmt.jbossx.StaffMemberLoginModule, here it
is:
import java.security.acl.Group;
| import java.util.Map;
| import java.util.List;
| import java.util.ArrayList;
| import java.sql.Connection;
| import java.sql.Statement;
| import java.sql.PreparedStatement;
| import java.sql.ResultSet;
| import java.sql.SQLException;
| import javax.sql.DataSource;
| import javax.naming.InitialContext;
| import javax.naming.NamingException;
| import javax.security.auth.Subject;
| import javax.security.auth.callback.CallbackHandler;
| import javax.security.auth.login.LoginException;
| import org.jboss.security.SimpleGroup;
| import org.jboss.security.SimplePrincipal;
| import org.jboss.security.auth.spi.UsernamePasswordLoginModule;
|
| /**
| * A login module that uses methods from the staff management package
| * to authenticate the users.<P>
| *
| * The resulting LoginContext has as CallerPrincipal
| * "<code>StaffManagementMember_<i>DBId</i></code>" where
| * <code><i>DBId</i></code> is the primary key of the
| * <code>StaffManagementMember</code>.<P>
| *
| * Every authenticated user has a default role
| * "<code>StaffManagementUser</code>" assigned. Additional
| * roles are derived from the group memberships of the authenticated
| * member. Groups with primary keys less than 100 have role names
| * "<code>StaffManagementRole_<i>DBId</i></code>" where
| * <code><i>DBId</i></code> is the primary key of the
| * <code>StaffManagementGroup</code>. For other groups the group
| * name is used directly as role name.<P>
| *
| * Groups with primary keys below 100 are handled specially to simplify
| * internationalization. Those group ids are never assigned when a group
| * is created. Rather, those are predefined groups such as "administrators"
| * with permissions properly configured in the deployment descriptors.
| * By using "<code>StaffManagementRole_<i>DBId</i></code>" as role,
| * it is not necessary to modify the deployment descriptors when the
| * group name of those administrative groups is changed.
| */
| public class StaffMemberLoginModule extends UsernamePasswordLoginModule {
|
| private String dsJndiName;
| private String daemonUsername = null;
| private String daemonPassword = null;
|
| /**
| * Initialize this LoginModule.
| */
| public void initialize(Subject subject, CallbackHandler callbackHandler,
| Map sharedState, Map options) {
| super.initialize(subject, callbackHandler, sharedState, options);
|
| dsJndiName = (String) options.get("dsJndiName");
| if( dsJndiName == null ) {
| dsJndiName = "java:/DefaultDS";
| }
|
| daemonUsername = (String) options.get("daemonUsername");
| daemonPassword = (String) options.get("daemonPassword");
| }
|
| /**
| * Return <code>null</code> as the cleartext password is not available.
| * This is not a problem as we override <code>validatePassword</code>
| * as well.
| * @return null
| * @throws LoginException as defined by the interface, not really thrown.
| */
| protected String getUsersPassword() throws LoginException {
| return null;
| }
|
| /**
| * The validation of the input password against the expected password.
| * This version ignores the value of the expected password and uses
| * methods from staff management to verify the password.
| * @param inputPassword the password as given by the user.
| * @param expectedPassword the expected password, ignored.
| * @return true if the inputPassword is valid, false otherwise.
| */
| protected boolean validatePassword
| (String inputPassword, String expectedPassword) {
| if(getUsername() == null || inputPassword == null) {
| return false;
| }
| if (daemonUsername != null && getUsername().equals (daemonUsername)
| && daemonPassword != null
| && inputPassword.equals (daemonPassword)) {
| return true;
| }
| Connection con = null;
| PreparedStatement ps = null;
| ResultSet rs = null;
| try {
| InitialContext ctx = new InitialContext();
| DataSource ds = (DataSource) ctx.lookup(dsJndiName);
| con = ds.getConnection();
| // Get the password
| ps = con.prepareStatement
| ("SELECT PASSWORD FROM STAFFMEMBER WHERE MEMBERID = ?");
| ps.setString(1, getUsername());
| rs = ps.executeQuery();
| if(rs.next()) {
| return rs.getString(1).equals (inputPassword);
| }
| } catch(NamingException ex) {
| ex.printStackTrace();
| } catch(SQLException ex) {
| ex.printStackTrace();
| } finally {
| try {
| closeAll (rs, ps, con);
| } catch (SQLException ex) {
| ex.printStackTrace();
| }
| }
| return false;
| }
|
| /**
| * Overriden to return the Groups that correspond to the role sets
| * assigned to the user. Creates a Group named "Roles" that
| * contains the Role "StaffManagementUser". A second group is
| * "CallerPrincipal" that provides the
| * [EMAIL PROTECTED] de.danet.an.staffmgmt.domain.StaffMember#key
| * application identity} rather than the security domain identity.
| * @return Group[] containing the sets of roles
| * @throws LoginException as defined by the interface, not really thrown.
| */
| protected Group[] getRoleSets() throws LoginException {
| if (getUnauthenticatedIdentity() != null
| && getIdentity().equals (getUnauthenticatedIdentity())) {
| Group[] grps = new Group[0];
| return grps;
| }
| if (daemonUsername != null && getUsername().equals (daemonUsername)) {
| // Create Caller Principal
| SimpleGroup princip = new SimpleGroup("CallerPrincipal");
| princip.addMember
| (new SimplePrincipal ("StaffManagementMember_Daemon"));
| // create roles, start with default role
| Group roles = new SimpleGroup("Roles");
| SimplePrincipal p = new SimplePrincipal("StaffManagementUser");
| roles.addMember(p);
| p = new SimplePrincipal("StaffManagementRole_Daemon");
| roles.addMember(p);
| Group[] grps = new Group[] { princip, roles };
| return grps;
| }
| List groups = new ArrayList();
| // gather information
| Connection con = null;
| try {
| // prepare db connection
| InitialContext ctx = new InitialContext();
| DataSource ds = (DataSource) ctx.lookup(dsJndiName);
| con = ds.getConnection();
| // Create Caller Principal
| long memberDBId = addCallerPrincipal (con, groups);
| // create roles, start with default role
| SimpleGroup rolesGroup = new SimpleGroup("Roles");
| groups.add (rolesGroup);
| SimplePrincipal p = new SimplePrincipal("StaffManagementUser");
| rolesGroup.addMember(p);
| // add roles from db
| addGroupsAsRoles (con, rolesGroup, memberDBId, true);
| } catch(NamingException ex) {
| throw new LoginException(ex.toString(true));
| } catch(SQLException ex) {
| ex.printStackTrace();
| throw new LoginException(ex.toString());
| } finally {
| try {
| closeAll (null, null, con);
| } catch (SQLException ex) {
| ex.printStackTrace();
| throw new LoginException(ex.toString());
| }
| }
|
| Group[] roleSets = new Group[groups.size()];
| groups.toArray(roleSets);
| return roleSets;
| }
|
| /**
| * Adds the "CallerPrincipal" group with the autheticated user as
| * principal to the groups.
| *
| * @param con the connection to the database.
| * @param groups the groups.
| * @return the DBId of the authenticated user.
| */
| private long addCallerPrincipal (Connection con, List groups)
| throws SQLException, LoginException {
| PreparedStatement ps = null;
| ResultSet rs = null;
| long dbid = 0;
| try {
| ps = con.prepareStatement
| ("SELECT DBID FROM STAFFMEMBER WHERE MEMBERID = ?");
| ps.setString(1, getUsername());
| rs = ps.executeQuery();
| if(! rs.next()) {
| throw new LoginException
| ("Authenticated user vanished from table");
| }
| dbid = rs.getLong(1);
| SimpleGroup rolesGroup = new SimpleGroup("CallerPrincipal");
| groups.add(rolesGroup);
| rolesGroup.addMember
| (new SimplePrincipal
| ("StaffManagementMember_" + dbid));
| } finally {
| closeAll (rs, ps, null);
| }
| return dbid;
| }
|
| /**
| * Adds the roles derived from the groups in the database.
| *
| * @param con the connection to the database.
| * @param roles the groups.
| * @param id the dbid for which to add the groups.
| * @param isMember <code>true</code> if <code>id</code> is a
| * staff member id (not a staff group id).
| * @return the DBId of the authenticated user.
| */
| private void addGroupsAsRoles (Connection con, SimpleGroup roles,
| long id, boolean isMember)
| throws SQLException, LoginException {
| PreparedStatement ps = null;
| ResultSet rs = null;
| try {
| String type = "M";
| if (!isMember) {
| type = "G";
| }
| ps = con.prepareStatement
| ("SELECT GROUPID FROM STAFFMAP "
| + "WHERE CONTAINED = ? AND TYPE = ?");
| ps.setLong(1, id);
| ps.setString(2, type);
| rs = ps.executeQuery();
| while(rs.next()) {
| long grpId = rs.getLong(1);
| if (grpId < 100) {
| roles.addMember (new SimplePrincipal
| ("StaffManagementRole_" + grpId));
| } else {
| roles.addMember
| (new SimplePrincipal (lookupGroup (con, grpId)));
| }
| addGroupsAsRoles (con, roles, grpId, false);
| }
| } finally {
| closeAll (rs, ps, null);
| }
| }
|
| /**
| * Looks up the group name for a given group id.
| *
| * @param con the connection to the database.
| * @param id the group id
| * @return the group name.
| */
| private String lookupGroup (Connection con, long grpId)
| throws SQLException, LoginException {
| PreparedStatement ps = null;
| ResultSet rs = null;
| try {
| ps = con.prepareStatement
| ("SELECT NAME FROM STAFFGROUP WHERE DBID = ?");
| ps.setLong(1, grpId);
| rs = ps.executeQuery();
| if (!rs.next()) {
| throw new LoginException
| ("Group vanished from table");
| }
| return rs.getString(1);
| } finally {
| closeAll (rs, ps, null);
| }
| }
|
| /**
| * Close a connection, a prepared statement or a statement and a
| * result set, if allocated, i.e. if != null.
| * @param rs a result set or null.
| * @param st a prepared statement, statement or null
| * @param con a connection or null.
| * @throws SQLException if a sql error occurs.
| */
| private void closeAll (ResultSet rs, Statement st,
| Connection con) throws SQLException {
| if (rs != null) {
| rs.close ();
| }
| if (st != null) {
| st.close ();
| }
| if (con != null) {
| con.close ();
| }
| }
| }
View the original post :
http://www.jboss.org/index.html?module=bb&op=viewtopic&p=3852930#3852930
Reply to the post :
http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=3852930
-------------------------------------------------------
This SF.Net email is sponsored by:
Sybase ASE Linux Express Edition - download now for FREE
LinuxWorld Reader's Choice Award Winner for best database on Linux.
http://ads.osdn.com/?ad_id=5588&alloc_id=12065&op=click
_______________________________________________
JBoss-user mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-user