子在川上曰

  逝者如斯夫不舍昼夜
随笔 - 71, 文章 - 0, 评论 - 915, 引用 - 0
数据加载中……

JAAS在Java Web Start中的设置

文/陈刚 from www.chengang.com.cn

一、前言

  我这个AdminConsole项目是用Java Web Start(简称JWS)来让用户访问的,后来在用户登录部份用到了JAAS,而JAAS有一个登录配置文件的设定。过去,我一直是在Eclipse的Run里做设置“-Djava.security.auth.login.config=D:\wxxr\login.config”,如下图:

  但这只是权宜之计,在将项目从本地以JWS发布到服务器就会碰到两个问题:(1)为了灵活,不能引用绝对地址的(2)在JWS中怎么设定对login.config的引用。

  JAAS中对配置文件login.config的引用,主要有两种方法:
(1)动态配置:“-Djava.security.auth.login.config=D:\wxxr\login.config”。它其实是java.exe的一个参数,你可以像我一样在Eclipse的run里设置,也可以在命令行运行程序的方式中指定:c:\jdk\bin\java -Djava.security.auth.login.config=D:\wxxr\login.config -jar.......。
(2)在程序里静态配置:System.setProperty("java.security.auth.login.config", "D:\wxxr\login.config");

二、JWS中对JAAS动态配置的方法

  在JWS中,如果你想动态配置的,则在JWS的jnlp文件里设置如下:
 <resources>
  <j2se version="1.4+" href="http://java.sun.com/products/autodl/j2se"  java-vm-args="-Djava.security.auth.login.config=D:\wxxr\login.config" />
 ........  
 </resources>

或者

 <resources>
  <j2se version="1.4+" href="http://java.sun.com/products/autodl/j2se" />
  <property name="java.security.auth.login.config" value="D:\wxxr\login.config"/>
 ........  
 </resources>

  上面的设置有一个关键问题:对login.config引用的是绝对地址,这个地址不是指向服务器端的地址,而是客户端的地址。这也就要求客户在D:\wxxr\目录含有login.config文件,显然我们不能对客户有这种麻烦要求(最好就是客户什么都不用做,这也是JWS的存在的价值和目的)。
  因此这里还有一个变通的方法:把“D:\wxxr\login.config”改成“http://your_website:8080/adminconsole/login.config”,这样就会去网上定位login.config,而不必再把login.config安装在客户端里了。


三、JWS中对JAAS静态配置的方法

  在上面的用web url的方法中还是有一点缺陷,login.config将是可以被其他客户轻易看到的,安全性不高。而且服务器的网站名变了以后,还得相应修改jnlp文件。所以我们不妨考虑一下静态配置的方法,用静态配置方法之后,就不用在jnlp文件里配置了,少了不了麻烦。

第一种:

System.setProperty("java.security.auth.login.config"new URL(BasicServiceImpl.getInstance().getCodeBase(),"login.config").toString());

说明:
(1)BasicServiceImpl是JDK's javaws.jar包中的类(jdk\jre\javaws\javaws.jar)。
(2)BasicServiceImpl.getInstance().getCodeBase()得到的值是“http://your_website:8080/adminconsole/”,这个还是和前面web url其实一样,只不过它是动态获得web url。至于如何获得服务器的路径的那种,对于普通的java application我没研究过,我只试过下面eclipse RCP的。
(3)你只需要保证http://your_website:8080/adminconsole/login.config 能访问到login.config文件即可。

第二种:在Eclipse RCP程序中设置的方法

String path = AdminConsolePlugin.getDefault().find(new Path("properties/login.config")).toString(); //AdminConsolePlugin就是项目的那***Plugin.java文件,不同的项目会不同。
logger.info("login.config path=" + path); //logger是log4j的一个对象,你可以把这一行删除
System.setProperty("java.security.auth.login.config", path);

  path的值有点怪,是“bundleentry://3/properties/login.config”。properties/login.config在服务器上的位置如下图:


  注:Eclipse RCP要装在JWS上,还得用一个开源软件WebRCP:http://sourceforge.net/projects/webrcp。此开源软件简单易用,连文档都不用看。它提供的webrcp-tutorial,本身就是一个RCP使用webrcp的例子,你只需要参照archives\tutorial.zip的目录结构将自己的RCP项目打包,然后用自己项目的zip替换掉archives\tutorial.zip即可。如果你想换一个zip名字,则需要修改tutorial.jsp文件(其实也是一个jnlp)中的“<property name=....>”相应的几项。


参考资料:
http://forum.java.sun.com/thread.jspa?threadID=612861&tstart=300
http://forum.java.sun.com/thread.jspa?threadID=621588&messageID=3523625

posted on 2006-03-07 14:53 陈刚 阅读(1349) 评论(0)  编辑  收藏 所属分类: Java


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


网站导航: