一个jaas的问题,一天了也没有搞定,找不到问题。
4个文件
1.ConsoleCallbackHandler.java
package test;
import javax.security.auth.login.*;
import javax.security.auth.callback.*;
import java.io.*;
public class ConsoleCallbackHandler implements CallbackHandler {
public void handle(Callback callbacks[]) throws java.io.IOException,
UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
if (callbacks[i] instanceof NameCallback) {
NameCallback nameCb = (NameCallback) callbacks[i];
System.out.print(nameCb.getPrompt());
String user = (new BufferedReader(new InputStreamReader(System.in))).
readLine();
nameCb.setName(user);
}
else if (callbacks[i] instanceof PasswordCallback) {
PasswordCallback passCb = (PasswordCallback) callbacks[i];
System.out.print(passCb.getPrompt());
String pass = (new BufferedReader(new InputStreamReader(System.in))).
readLine();
passCb.setPassword(pass.toCharArray());
}
else {
throw (new UnsupportedCallbackException(callbacks[i],
"Callback class not supported"));
}
}
}
}
2.RdbmsLoginModule.java
package test;
import javax.security.auth.spi.LoginModule;
import javax.security.auth.callback.*;
import java.util.*;
import javax.security.auth.*;
public class RdbmsLoginModule implements LoginModule {
private CallbackHandler callbackHandler;
public RdbmsLoginModule() {
}
public void initialize(Subject subject, CallbackHandler callbackHandler,
Map sharedState, Map options) {
this.callbackHandler=callbackHandler;
String s1 = (String) options.get("url");
System.out.println(s1);
}
public boolean login() {
NameCallback nameCb = new NameCallback("user: ");
PasswordCallback passCb = new PasswordCallback("password: ", true);
Callback[] callbacks = new Callback[] {
nameCb, passCb};
try{
callbackHandler.handle(callbacks);
}catch(Exception e){
e.printStackTrace();
}
String username = nameCb.getName();
String password = new String(passCb.getPassword());
if (username.equals("songlipeng2003") && password.equals("2010525")) {
return true;
}
else {
return false;
}
}
public boolean logout() {
return false;
}
public boolean abort() {
return false;
}
public boolean commit() {
return false;
}
}
3.Hello.java
package test;
import javax.security.auth.login.*;
public class Test {
public static void main(String[] args) {
System.setProperty("javax.security.auth.login.config","./test.config");
ConsoleCallbackHandler handler=new ConsoleCallbackHandler();
try{
LoginContext lc=new LoginContext("hello",handler);
lc.login();
}catch(LoginException e){
e.printStackTrace();
}
}
}
4.test.config
hello {
test.RdbmsLoginModule required debug=true;
};
出现异常:
--------------------Configuration: <Default>--------------------
Exception in thread "main" java.lang.SecurityException: 无法定位登录配置
at com.sun.security.auth.login.ConfigFile.<init>(ConfigFile.java:93)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
at java.lang.Class.newInstance(Class.java:308)
at javax.security.auth.login.Configuration$3.run(Configuration.java:246)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.login.Configuration.getConfiguration(Configuration.java:241)
at javax.security.auth.login.LoginContext$1.run(LoginContext.java:237)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.login.LoginContext.init(LoginContext.java:234)
at javax.security.auth.login.LoginContext.<init>(LoginContext.java:403)
at test.Test.main(Test.java:10)
Caused by: java.io.IOException: 无法定位登录配置
at com.sun.security.auth.login.ConfigFile.init(ConfigFile.java:250)
at com.sun.security.auth.login.ConfigFile.<init>(ConfigFile.java:91)
... 14 more
这些文件都放在同一个文件夹下啊,路径应该没有问题。登录config文件也应该没有问题,改了好多次了啊。都是这个错误,我从IBM下了一个和这个差不多的例子,就是可以运行,但是不知道我错到了那里啊。
ibm的相关例子的网址:http://publib.boulder.ibm.com/iseries/v5r2/ic2989/info/rzaha/jaashllo.htm