001 /* 002 * $Id: JAASLoginService.java 3342 2009-05-22 19:47:38Z kschaefe $ 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.Subject; 027 import javax.security.auth.callback.Callback; 028 import javax.security.auth.callback.CallbackHandler; 029 import javax.security.auth.callback.NameCallback; 030 import javax.security.auth.callback.PasswordCallback; 031 import javax.security.auth.login.AccountExpiredException; 032 import javax.security.auth.login.CredentialExpiredException; 033 import javax.security.auth.login.FailedLoginException; 034 import javax.security.auth.login.LoginContext; 035 import javax.security.auth.login.LoginException; 036 037 /** 038 * <b>JAASLoginService</b> implements a <b>LoginService</b> 039 * that uses JAAS for authentication. <b>JAASLoginService</b> uses the 040 * server name as name of the configuration for JAAS. 041 * 042 * @author Bino George 043 */ 044 public class JAASLoginService extends LoginService { 045 private static final Logger LOG = Logger.getLogger(JAASLoginService.class 046 .getName()); 047 048 protected LoginContext loginContext; 049 050 /** 051 * Constructor for <b>JAASLoginService</b> 052 * @param server server name that is also used for the JAAS config name 053 */ 054 public JAASLoginService(String server) { 055 super(server); 056 } 057 058 /** 059 * Default JavaBeans constructor 060 */ 061 public JAASLoginService() { 062 super(); 063 } 064 065 066 /** 067 * @inheritDoc 068 * 069 */ 070 public boolean authenticate(String name, char[] password, String server) throws Exception { 071 // If user has selected a different server, update the login service 072 if (server != null) { 073 if (!server.equals(getServer())) { 074 setServer(server); 075 } 076 } 077 // Clear the login context before attempting authentication 078 loginContext = null; 079 // Create a login context for the appropriate server and attempt to 080 // authenticate the user. 081 try { 082 loginContext = new LoginContext(getServer(), 083 new JAASCallbackHandler(name, password)); 084 loginContext.login(); 085 return true; 086 } catch (AccountExpiredException e) { 087 // TODO add explanation? 088 LOG.log(Level.WARNING, "", e); 089 return false; 090 } catch (CredentialExpiredException e) { 091 // TODO add explanation? 092 LOG.log(Level.WARNING, "", e); 093 return false; 094 } catch (FailedLoginException e) { 095 // TODO add explanation? 096 LOG.log(Level.WARNING, "", e); 097 return false; 098 } catch (LoginException e) { 099 // TODO add explanation? 100 LOG.log(Level.WARNING, "", e); 101 return false; 102 } catch (Throwable e) { 103 // TODO add explanation? 104 LOG.log(Level.WARNING, "", e); 105 return false; 106 } 107 } 108 109 /** 110 * Returns the <code>LoginContext</code> used during the authentication 111 * process. 112 */ 113 public LoginContext getLoginContext() 114 { 115 return loginContext; 116 } 117 118 /** 119 * Returns the <code>Subject</code> representing the authenticated 120 * individual, or <code>null</code> if the user has not yet been 121 * successfully authenticated. 122 */ 123 public Subject getSubject() 124 { 125 if (loginContext == null) 126 return null; 127 return loginContext.getSubject(); 128 } 129 130 class JAASCallbackHandler implements CallbackHandler { 131 132 private String name; 133 134 private char[] password; 135 136 public JAASCallbackHandler(String name, char[] passwd) { 137 this.name = name; 138 this.password = passwd; 139 } 140 141 public void handle(Callback[] callbacks) throws java.io.IOException { 142 for (int i = 0; i < callbacks.length; i++) { 143 if (callbacks[i] instanceof NameCallback) { 144 NameCallback cb = (NameCallback) callbacks[i]; 145 cb.setName(name); 146 } else if (callbacks[i] instanceof PasswordCallback) { 147 PasswordCallback cb = (PasswordCallback) callbacks[i]; 148 cb.setPassword(password); 149 } 150 } 151 } 152 153 } 154 }