随笔 - 37  文章 - 29  trackbacks - 0


常用链接

留言簿(3)

随笔分类

随笔档案

最新评论

阅读排行榜

评论排行榜

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 阅读(776) 评论(0)  编辑  收藏 所属分类: Java基础

只有注册用户登录后才能发表评论。


网站导航: