以XForum来说明如何使用JAAS做用户验证

转载 2004年09月16日 21:40:00
Author charles @ chinaxp.org

以XForum来说明如何使用JAAS做用户验证

JAAS的简单流程:
初始化一个generic的LoginContext
Call LoginContext.login()验证用户
如果成功,获得一个经过代表当前用户的Subject object,Subject中含有用户数据
不成功得到一个LoginException


开发过程:

1.建立一个Implements java.secuirty.principal的User object,因为在Subject中的数据必须是
Pricipal,所以我们建议个User principal,这个principal中目前只保存用户名信息

2.建立一个客户化的LoginModule,这个Class 需要Implement javax.security.auth.spi.LoginModule;
由于XForum使用Mysql数据库作为用户数据的数据源,因此我们建立一个Database LoginModule.
LoginModule中的所有methods都是由一个generic 的LoginContext来调用的.

/*
 * A dependent Database login module for JAAS
 * and create the connection
 *
 * @author Charles Huang
 * @since JDK1.4
 * @version $Id: DataBaseLoginModule.java,v 1.1 2002/09/10 02:05:48 charles Exp $
 */
public class DataBaseLoginModule implements LoginModule{

   /**
    *
    */
    public void initialize(Subject subject, CallbackHandler callbackHandler,
                       Map sharedState, Map options) {
        this.subject = subject;
        //CallbackHandler是JAAS用来在用户的application
        //比如说jsp或swing application的用户界面和LoginModule之间传递数据的
        //Data Holder
        this.callbackHandler = callbackHandler;
   }



   public boolean login() throws LoginException {
    try{
         //利用CallBack objects
         final Callback[] calls= new Callback[2];
         calls[0]=new NameCallback("name");
         calls[1]=new PasswordCallback("Password",false);
          
         //从 CallbackHandler里获得用户
         //输入的用户名和密码,
         callbackHandler.handle(calls);

         // 查询数据库,比较密码
     }catch( AccountNotFoundException ){
         throw LoginExceptionm("No such User");
     }
     isAuthenticated = true;
     return isAuthenticated;
   }

    /**
    * 这里做验证后的处理,在XForum如果成功,在Subject中加入用户名.一个Subject代表一个
    *被验证 的
    *用户.Subject中可以包含较丰富的数据,如用户名,role等数据,会被web application引用
    */
    public boolean commit() throws LoginException {
        if ( isAuthenticated ){
            subject.getPrincipals().add( new User( username ) );
            //TODO: Put in role information later
        }else{
            throw new LoginException("Authentication fails");
        }
        return isAuthenticated;
}

    ......
}

3.建立一个客户化的CallbackHandler用来在用户的application和LoginModule之间传递数据.因为web
application不回直接调用LoginModul.这里使用了visitor pattern.XForum中的CallbackHandler只传
递两个数据:用户名和密码

public class SimpleCallbackHandler implements CallbackHandler{
    private String username;
    private String password;

    public SimpleCallbackHandler( final String username, final String password) {
        this.username = username;
        this.password = password;
    }
     
    //在LoginModule的login method中,LoginModule 调用这个handle()并pass in 两个
    // CallBack Objects,着两个callback objects被populated
    public void handle(Callback[] callbacks)
            throws IOException, UnsupportedCallbackException {
        for( int index = 0; index < callbacks.length; index++ ){
            if(callbacks[ index ] instanceof NameCallback){
                NameCallback ncb = (NameCallback)callbacks[ index ];
                ncb.setName(username);
            }
            if(callbacks[ index ] instanceof PasswordCallback){
                PasswordCallback pcb = (PasswordCallback)callbacks[ index ];
                pcb.setPassword(password.toCharArray());
            }
        }
    }
}

4.在web application中用JAAS严正用户,在XForum中,这是在LogonAction

    ......
    // let the LoginContext instantiate a new Subject,其中userName and password
    //从HttpRequest中获得,并利用SimpleCallbackHandler传递给LoginModule
    LoginContext lc = new LoginContext("XForumLogin",
                       new SimpleCallbackHandler( userName, password ) );
    // LoginContext 调用LoginModule的login()来验证用户
    lc.login();

  //获得一个经过验证的Subject object,这个Subject中包含一个User object
    subject = lc.getSubject();
    ......

5.建里一个LoginModule的Configuration file.JAAS中的LoginContext会看这个文件,并动态的Load这
个class和产生一个LoginModule的Instance用来验证用户,在XForum中的configuration file为
XForumLogin.config

XForumLogin{
   org.redsoft.forum.security.DataBaseLoginModule required debug=true;
};

6.修改{java_home}/jre/lib/security/java.security来告诉JAAS 配置文件XForumLogin.config在那


#
# Default login configuration file
#
login.config.url.1=file:E:/jakarta-tomcat-4.0.2/webapps/forum/WEB-INF/XForumLogin.config


重起Tomcat,done

xForum,论坛,xp论坛,论坛文档

  • 2010年05月13日 16:38
  • 5.45MB
  • 下载

JAAS基于用户身份的验证和授权

JAAS基于用户身份的验证和授权(1)本文的目录        JAAS介绍        登录模块LoginModular        回调处理        JAAS配置文件         使...
  • xfdeng
  • xfdeng
  • 2005年09月06日 12:57
  • 1724

PHP安全基础 - 验证与授权[整理]

导读:因为web应用基于HTTP[S]协议,所以,很多都使用了身份验证与授权机制。典型的有登录。身份验证,通常称作访问控制,不同于ACL。 详细: 1 暴力攻击 暴利攻击是一种不适用任何特殊手段...
  • jizhongchun
  • jizhongchun
  • 2013年02月28日 13:57
  • 1126

Jaas原理及实现

JAAS是对JCE安全框架的重要补充,通过提供认证用户和确定用户授权来增强JAVA解决方案的动态安全性,使得资源能够得到很好得到保护和控制(JAAS使用动态的安全策略来定义权限,而不是将其静态的嵌入到...
  • Jesse621
  • Jesse621
  • 2015年01月30日 11:54
  • 2642

jaas之登录实例

JAAS:Java Authentication and Authorization Service,提供了认证和授权框架。 本例是认证的实现,JAAS定义了可插拔的认证机制,使认证逻辑独立开来,可...
  • zkn_CS_DN_2013
  • zkn_CS_DN_2013
  • 2014年04月14日 17:31
  • 1459

介绍下这几天研究的JAAS

作者:千年精灵(MSN:j2ee AT hotmail.com,QQ:800736),转载请著名出处。(一)   JAAS技术简介JavaTM Authentication and Authoriza...
  • abigfrog
  • abigfrog
  • 2009年09月18日 16:51
  • 3089

Weblogic安全性编程在 Java 客户端中使用 JAAS 身份验证

原文地址:http://edocs.weblogicfans.net/wls/docs92/security/fat_client.html 本部分包含下列主题:  JAAS ...
  • boonya
  • boonya
  • 2015年01月06日 14:13
  • 1871

Tomcat JAAS 身份验证和授权

ava 认证和授权服务(JAAS)是一种用于验证用户身份以确定安全等级的 Tomcat Realm ( org.apache.catalina.Realm)的实现。 需求 Tomcat 7.0...
  • bigtree_3721
  • bigtree_3721
  • 2016年03月13日 13:55
  • 671

Kafka JAAS 安全认证流程

 1. mechanism不在enable列表时,返回enabled_mechanisms 2. 在PLAIN 方式时,client 发来的信息是“[authzid] UTF8NUL aut...
  • geting
  • geting
  • 2016年07月27日 12:58
  • 1162

Jetty配置jaas访问权限以及密码

jetty 权限控制 jaas login-config 服务器
  • u012653518
  • u012653518
  • 2016年04月21日 16:14
  • 1405
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:以XForum来说明如何使用JAAS做用户验证
举报原因:
原因补充:

(最多只允许输入30个字)