一、前言
我这个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文件里配置了,少了不了麻烦。
第一种:
说明:
(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程序中设置的方法
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