001: /*
002: * JBoss, Home of Professional Open Source
003: * Copyright 2005, JBoss Inc., and individual contributors as indicated
004: * by the @authors tag. See the copyright.txt in the distribution for a
005: * full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jbpm.identity.security;
023:
024: import java.util.*;
025: import javax.security.auth.*;
026: import javax.security.auth.callback.*;
027: import javax.security.auth.login.*;
028: import javax.security.auth.spi.*;
029: import org.jbpm.identity.*;
030:
031: /**
032: * jaas login module that, in case of successfull verification, adds the
033: * {@link org.jbpm.identity.User} as a principal to the subject. In case
034: * of successfull verification, the {@link Username} and {@link Password}
035: * will be associated as public and private credentials respectively.
036: */
037: public class IdentityLoginModule implements LoginModule {
038:
039: Subject subject = null;
040: CallbackHandler callbackHandler = null;
041: Map sharedState = null;
042: Map options = null;
043:
044: /**
045: * @inject
046: */
047: IdentityService identityService = null;
048:
049: Object validatedUserId = null;
050: String validatedPwd = null;
051:
052: public void initialize(Subject subject,
053: CallbackHandler callbackHandler, Map sharedState,
054: Map options) {
055: this .subject = subject;
056: this .callbackHandler = callbackHandler;
057: this .sharedState = sharedState;
058: this .options = options;
059: }
060:
061: public boolean login() throws LoginException {
062:
063: // get userName and password
064: NameCallback nameCallback = new NameCallback(null);
065: PasswordCallback passwordCallback = new PasswordCallback(null,
066: false);
067: try {
068: callbackHandler.handle(new Callback[] { nameCallback,
069: passwordCallback });
070: } catch (Exception e) {
071: e.printStackTrace();
072: throw new LoginException("callback failed");
073: }
074: String userName = nameCallback.getName();
075: String pwd = new String(passwordCallback.getPassword());
076:
077: // validate the userName and password with the injected identity session
078: Object userId = identityService.verify(userName, pwd);
079:
080: boolean success = (userId != null);
081: // if userName matched the given password
082: if (success) {
083: // save the user id and the password in the
084: // private state of this loginmodule
085: validatedUserId = userId;
086: validatedPwd = pwd;
087: } else {
088: validatedUserId = null;
089: validatedPwd = null;
090: }
091:
092: return success;
093: }
094:
095: public boolean commit() throws LoginException {
096:
097: User user = identityService.getUserById(validatedUserId);
098: if (user == null) {
099: throw new LoginException("no user for validated user id '"
100: + validatedUserId);
101: }
102:
103: // update the subject
104: subject.getPrincipals().add(user);
105: subject.getPrivateCredentials().add(
106: new Username(user.getName()));
107: subject.getPrivateCredentials().add(new Password(validatedPwd));
108:
109: // and update the authenticated user
110: AuthenticatedUser.setAuthenticatedUser(user);
111:
112: return true;
113: }
114:
115: public boolean abort() throws LoginException {
116: return logout();
117: }
118:
119: public boolean logout() throws LoginException {
120: if (subject != null) {
121: // TODO can we clear all or should this login module only clear the user it
122: // has added to the set of principals in the commit ?
123: subject.getPrincipals().clear();
124: subject.getPublicCredentials().clear();
125: subject.getPrivateCredentials().clear();
126: }
127:
128: // and update the authenticated user
129: AuthenticatedUser.setAuthenticatedUser(null);
130:
131: callbackHandler = null;
132: sharedState = null;
133: options = null;
134: validatedUserId = null;
135: validatedPwd = null;
136: return true;
137: }
138: }
|