001 /*
002 * $Id: JAASLoginService.java,v 1.4 2005/11/11 23:05:15 rbair Exp $
003 *
004 * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
005 * Santa Clara, California 95054, U.S.A. All rights reserved.
006 *
007 * This library is free software; you can redistribute it and/or
008 * modify it under the terms of the GNU Lesser General Public
009 * License as published by the Free Software Foundation; either
010 * version 2.1 of the License, or (at your option) any later version.
011 *
012 * This library 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 library; if not, write to the Free Software
019 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
020 */
021 package org.jdesktop.swingx.auth;
022
023 import java.util.logging.Level;
024 import java.util.logging.Logger;
025
026 import javax.security.auth.callback.Callback;
027 import javax.security.auth.callback.CallbackHandler;
028 import javax.security.auth.callback.NameCallback;
029 import javax.security.auth.callback.PasswordCallback;
030 import javax.security.auth.login.AccountExpiredException;
031 import javax.security.auth.login.CredentialExpiredException;
032 import javax.security.auth.login.FailedLoginException;
033 import javax.security.auth.login.LoginContext;
034 import javax.security.auth.login.LoginException;
035
036 /**
037 * <b>JAASLoginService</b> implements a <b>LoginService</b>
038 * that uses JAAS for authentication. <b>JAASLoginService</b> uses the
039 * server name as name of the configuration for JAAS.
040 *
041 * @author Bino George
042 */
043 public class JAASLoginService extends LoginService {
044 private static final Logger LOG = Logger.getLogger(JAASLoginService.class
045 .getName());
046
047 /**
048 * Constructor for <b>JAASLoginService</b>
049 * @param server server name that is also used for the JAAS config name
050 */
051 public JAASLoginService(String server) {
052 super(server);
053 }
054
055
056 /**
057 * @inheritDoc
058 *
059 */
060 public boolean authenticate(String name, char[] password, String server) throws Exception {
061 try {
062 LoginContext loginContext = null;
063
064 loginContext = new LoginContext(getServer(),
065 new JAASCallbackHandler(name, password));
066 loginContext.login();
067 return true;
068 } catch (AccountExpiredException e) {
069 // TODO add explanation?
070 LOG.log(Level.WARNING, "", e);
071 return false;
072 } catch (CredentialExpiredException e) {
073 // TODO add explanation?
074 LOG.log(Level.WARNING, "", e);
075 return false;
076 } catch (FailedLoginException e) {
077 // TODO add explanation?
078 LOG.log(Level.WARNING, "", e);
079 return false;
080 } catch (LoginException e) {
081 // TODO add explanation?
082 LOG.log(Level.WARNING, "", e);
083 return false;
084 } catch (Throwable e) {
085 // TODO add explanation?
086 LOG.log(Level.WARNING, "", e);
087 return false;
088 }
089 }
090
091 class JAASCallbackHandler implements CallbackHandler {
092
093 private String name;
094
095 private char[] password;
096
097 public JAASCallbackHandler(String name, char[] passwd) {
098 this.name = name;
099 this.password = passwd;
100 }
101
102 public void handle(Callback[] callbacks) throws java.io.IOException {
103 for (int i = 0; i < callbacks.length; i++) {
104 if (callbacks[i] instanceof NameCallback) {
105 NameCallback cb = (NameCallback) callbacks[i];
106 cb.setName(name);
107 } else if (callbacks[i] instanceof PasswordCallback) {
108 PasswordCallback cb = (PasswordCallback) callbacks[i];
109 cb.setPassword(password);
110 }
111 }
112 }
113
114 }
115
116
117 }