JAAS:Java Authentication and Authorization Service Java认证和授权服务,从jdk1.4开始就集成JAAS。
目前流行的Acegi中也提供了JAAS
JAAS的几个核心类和接口:
1.Subject: 实际被认证的人或者服务
2.Principal (interface): Subject的唯一标识。一个Subject含有一个或多个Pricipal,比如一个人有身份证、护照等Pricipal
3.LoginContext
4.LoginModule (interface)
5.CallbackHandler (interface)
还有两个配置文件:×××.conf(或config) 和 ×××..policy
JAAS首先使用一个LoginContext类来查找配置文件中的内容,这些内容可以用来对LoginModules进行初始化。所有
LoginContext没有指定的初始化参数都会包含在配置文件中。LoginContext向LoginModule传递一个CallbackHandler对象和一个Subject,如果LoginModule还需要其他认证信息,它就会用CallbackHandler回调适当的应用程序,从而获得这些信息。
在应用程序中,一般这样使用LoginContext:
try {
LoginContext loginContext = new LoginContext("Sample", callbackHandler ); //"Sample"定义在相关的conf文件中; callbackHandler见下面
loginContext.login(); //如果认证失败,则抛出异常
} catch (LoginException e) {
//do sth.
}
我们要使用JAAS,就需要实现上述接口,以及配置好文件
上面的代码,只是在应用时,这样写就够了。当然,在这之前,还需要设置callbackHandler:
SampleCallbackHandler callbackHandler = new SampleCallbackHandler();
// 设置用户名、密码等需要验证的信息到callbackHandler里。具体怎么设,看自己的SampleCallbackHandler怎么设计了
......
举例:
public class SampleCallbackHandler implements CallbackHandler {
protected String username;
protected String password;
public void handle(Callback[] callbacks)
throws UnsupportedCallbackException { //这个方法是必须实现的,用来设置username和password到对应的Callback变量中
for (int index = 0; index < callbacks.length; index++) {
if (callbacks[index] instanceof NameCallback) {
NameCallback ncb = (NameCallback) callbacks[index];
ncb.setName(username);
} else if (callbacks[index] instanceof PasswordCallback) {
PasswordCallback pcb = (PasswordCallback) callbacks[index];
pcb.setPassword(password.toCharArray());
} else if() { //如果还有其他需要验证的信息
...
}
}
//其他方法,诸如设置username和password
}
然后来说前面的"Sample"。这里的"Sample"对应一个Sample.conf文件,这个文件的具体位置可以自己设置。conf文件中配置了对应的LoginModule类,可以是一个或多个,用来做不同的验证。
public class SampleLoginModule implements LoginModule {
....
}
LoginModule有5个方法需要实现,简单点写个方法名得了:
public void initialize(Subject subject, CallbackHandler callbackHandler, Map arg2, Map arg3);
public boolean login() throws LoginException;
public boolean commit() throws LoginException;
public boolean abort() throws LoginException;
public boolean logout() throws LoginException;
业务逻辑主要在login()中实现,步骤包括了从callbackHandler中读取用户名密码,然后该从数据库验证就从数据库验证,该从配置文件验证就从配置文件验证,该从其他系统中验证就从其他系统中验证...
Pricipal的实现就不写了,下面链接中的例子写得很详细。我的只是给自己理一个大概步骤,以后回顾起来也方便
不过Subject和Pricipal应该有更重要的用处,比如在Authorization中,把pricipal和要可以执行的相关操作对应起来。这个还没看下去,接触的代码中也没用到。放到以后补充
更多内容,可直接查看sun的JDK文档
http://java.sun.com/javase/6/docs/technotes/guides/security/jaas/JAASRefGuide.html
实例:
http://www.blogjava.net/fastunit/archive/2008/01/28/178204.html
posted on 2008-08-02 13:52
EvanLiu 阅读(788)
评论(0) 编辑 收藏 所属分类:
Java基础