📄 sampleloginmodule.java
字号:
/**
* SampleLoginModule.java
*
* 这个LoginModule使用用户名/密码认证用户
*
*/
package examples.security.jaas;
import java.util.Map;
import java.io.IOException;
import java.net.MalformedURLException;
import java.rmi.RemoteException;
import javax.security.auth.Subject;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.security.auth.login.LoginException;
import javax.security.auth.login.FailedLoginException;
import javax.security.auth.spi.LoginModule;
import weblogic.security.auth.Authenticate;
import weblogic.jndi.Environment;
/**
* 执行密码认证的注册模型示例。
*/
public class SampleLoginModule implements LoginModule
{
private Subject subject = null;
private CallbackHandler callbackHandler = null;
private Map sharedState = null;
private Map options = null;
private String url = null;
// 认证状态
private boolean succeeded = false;
private boolean commitSucceeded = false;
// 用户名和密码
private String username = null;
private String password = null;
/**
* 初始化
*/
public void initialize(Subject subject,
CallbackHandler callbackHandler,
Map sharedState,
Map options)
{
this.subject = subject;
this.callbackHandler = callbackHandler;
this.sharedState = sharedState;
this.options = options;
try
{
// 获取服务器 URL
url = System.getProperty("weblogic.security.jaas.ServerURL");
}
catch(NullPointerException npe)
{
System.err.println("Error: ServerURL Not Specified");
}
catch(IllegalArgumentException iae)
{
System.err.println("Error: ServerURL Not Specified");
}
catch(SecurityException se)
{
System.err.println("Error: Security Exception on accessing ServerURL Specification");
}
}
/**
* 使用用户名和密码进行用户认证
* @返回true,在任何情况下
*
* @异常 FailedLoginException 如果认证失败
*
* @异常 LoginException 如果这个LoginModule不能执行认证
*/
public boolean login() throws LoginException
{
// 确认客户端提供了一个回调句柄
if(callbackHandler == null)
throw new LoginException("没有指定 CallbackHandler ");
// 设置callback列表
Callback[] callbacks = new Callback[2];
callbacks[0] = new NameCallback("username: ");
callbacks[1] = new PasswordCallback("password: ", false);
try
{
// 弹出窗口,获取用户名和密码
callbackHandler.handle(callbacks);
// 获取用户名
username = ((NameCallback) callbacks[0]).getName();
// 获取密码,并从char[] 转化到String
char[] charPassword = ((PasswordCallback) callbacks[1]).getPassword();
if(charPassword == null)
{
// 把 NULL 密码当作空字符处理,
charPassword = new char[0];
}
password = new String(charPassword);
}
catch(IOException ioe)
{
throw new LoginException(ioe.toString());
}
catch(UnsupportedCallbackException uce)
{
throw new LoginException("Error: Callback " + uce.getCallback().toString() + " Not Available");
}
// 设置 weblogic 环境变量,并认证
Environment env = new Environment();
env.setProviderUrl(url);
env.setSecurityPrincipal(username);
env.setSecurityCredentials(password);
try
{
// 认证用户的身份
Authenticate.authenticate(env, subject);
}
catch(RemoteException re)
{
System.err.println("Error: Remote Exception on authenticate, " + re.getMessage());
throw new LoginException(re.toString());
}
catch(IOException ioe)
{
System.err.println("Error: IO Exception on authenticate, " + ioe.getMessage());
throw new LoginException(ioe.toString());
}
catch(LoginException le)
{
System.err.println("Error: Login Exception on authenticate, " + le.getMessage());
throw new LoginException(le.toString());
}
// 成功认证
succeeded = true;
return succeeded;
}
/**
* 如果LoginContext的所有认证成功(相关必须、足够、可选的LoginModules成功),则调用这个方法。
*
* 如果这个LoginModule自己的认证失败,则这个方法清除所有当初保存的状态。
*
* @异常 LoginException 如果commit错误
*
* @返回true如果这个LoginModule自己的login和commit成功,否则返回false。
*/
public boolean commit() throws LoginException
{
if(succeeded)
{
commitSucceeded = true;
return true;
}
else
{
username = null;
password = null;
return false;
}
}
/**
* 如果LoginContext的所有认证失败,则调用这个方法。
* 如果这个LoginModule自己的认证成功(通过检查重新获取login方法和commit方法保存的私有状态),
* 那么,这个方法清除所有当初保存的状态。
*
* @异常 LoginException 如果 abort 失败
*
* @返回 false 如果这个LoginModule自己的login 和/或commit 失败,否则返回true。
*/
public boolean abort() throws LoginException
{
if(succeeded == false)
{
return false;
}
else if((succeeded == true) && (commitSucceeded == false))
{
// Login 成功,但所有的认证失败
succeeded = false;
username = null;
password = null;
}
else
{
// 所有的认证成功并且commit成功,
// 但是认证链下一个commit失败。
logout();
}
return true;
}
/**
* 注销用户
*
* @异常 LoginException 如果注销失败
*
* @所有情况下返回true,因为这个this LoginModule不该被忽略
*/
public boolean logout() throws LoginException
{
succeeded = false;
commitSucceeded = false;
username = null;
password = null;
return true;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -