本站首页    管理页面    写新日志    退出


«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告
 本博客在此声明所有文章均为转摘,只做资料收集使用。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:1304
评论数量:2242
留言数量:5
访问次数:7588968
建立时间:2006年5月29日




[J2SE][转]在Web application中集成JAAS
软件技术

lhwork 发表于 2006/8/17 22:05:07

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


阅读全文(2574) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.051 second(s), page refreshed 144755471 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号