让你的JXTA应用更加安全.建立真正你自己的私有的组!
在JXTA应用中有对等组的概念,当你加入了对等组之后.你在这个对等组内发布的信息就只有这个组的成员才能收到,所谓的成员资格服务^_^.(差不多这个意思吧.不完全对.)
但是你不能建立你自己的应用中所私有的组的话.那么别人通过搜索 * 匹配来得到你的组通告就可以加入你建立的对等组.如果在你告诉了我你自己的应用中组的名字的话.我就可以自己写一个应用来加入你的组进行任意的破坏.^_^.
那么不就很不安全了吗?应用的维护管理也太不方便了.
虽然我之前写过哪个关于通过认证加入对等组的文章,但是哪个就是不安全.
其实可以通过建立ModuleImplAdvertisement 来为你的对等组增加帐号密码的认证
代码如下:
private ModuleImplAdvertisement createPasswdMembershipPeerGroupModuleImplAdv(PeerGroup rootPeerGroup) {
ModuleImplAdvertisement allPurposePeerGroupImplAdv=null;
try {
allPurposePeerGroupImplAdv=rootPeerGroup.getAllPurposePeerGroupImplAdvertisement();
} catch (java.lang.Exception e) {
System.exit(1);
}
ModuleImplAdvertisement passwdMembershipPeerGroupModuleImplAdv=allPurposePeerGroupImplAdv;
ModuleImplAdvertisement passwdMembershipServiceModuleImplAdv=null;
StdPeerGroupParamAdv passwdMembershipPeerGroupParamAdv=null;
try {
passwdMembershipPeerGroupParamAdv =
new StdPeerGroupParamAdv(allPurposePeerGroupImplAdv.getParam());
} catch (net.jxta.exception.PeerGroupException e) {
System.exit(1);
}
Hashtable allPurposePeerGroupServicesHashtable = passwdMembershipPeerGroupParamAdv.getServices();
Enumeration allPurposePeerGroupServicesEnumeration = allPurposePeerGroupServicesHashtable.keys();
boolean membershipServiceFound=false;
while ((!membershipServiceFound) && (allPurposePeerGroupServicesEnumeration.hasMoreElements())) {
Object allPurposePeerGroupServiceID = allPurposePeerGroupServicesEnumeration.nextElement();
if (allPurposePeerGroupServiceID.equals(PeerGroup.membershipClassID)) {
ModuleImplAdvertisement allPurposePeerGroupMemershipServiceModuleImplAdv= (ModuleImplAdvertisement) allPurposePeerGroupServicesHashtable.get(allPurposePeerGroupServiceID);
passwdMembershipServiceModuleImplAdv=this.createPasswdMembershipServiceModuleImplAdv(allPurposePeerGroupMemershipServiceModuleImplAdv);
allPurposePeerGroupServicesHashtable.remove(allPurposePeerGroupServiceID);
allPurposePeerGroupServicesHashtable.put(PeerGroup.membershipClassID,passwdMembershipServiceModuleImplAdv);
membershipServiceFound=true;
passwdMembershipPeerGroupModuleImplAdv.setParam((Element) passwdMembershipPeerGroupParamAdv.getDocument(new MimeMediaType("text/xml")));
if (!passwdMembershipPeerGroupModuleImplAdv.getModuleSpecID().equals(PeerGroup.allPurposePeerGroupSpecID)) {
passwdMembershipPeerGroupModuleImplAdv.setModuleSpecID(IDFactory.newModuleSpecID(passwdMembershipPeerGroupModuleImplAdv.getModuleSpecID().getBaseClass()));
} else {
ID passwdGrpModSpecID= ID.nullID;
try {
passwdGrpModSpecID = IDFactory.fromURL(new URL("urn","","jxta:uuid-"+"DeadBeefDeafBabaFeedBabe00000001" +"04" +"06" ) );
} catch (java.net.MalformedURLException e) {}
catch (java.net.UnknownServiceException ee) {}
passwdMembershipPeerGroupModuleImplAdv.setModuleSpecID((ModuleSpecID) passwdGrpModSpecID);
}
membershipServiceFound=true;
}
}
return passwdMembershipPeerGroupModuleImplAdv;
}
private ModuleImplAdvertisement createPasswdMembershipServiceModuleImplAdv( ModuleImplAdvertisement allPurposePeerGroupMemershipServiceModuleImplAdv) {
ModuleImplAdvertisement passwdMembershipServiceModuleImplAdv = (ModuleImplAdvertisement) AdvertisementFactory.newAdvertisement(ModuleImplAdvertisement.getAdvertisementType());
passwdMembershipServiceModuleImplAdv.setModuleSpecID(PasswdMembershipService.passwordMembershipSpecID);
passwdMembershipServiceModuleImplAdv.setCode(PasswdMembershipService.class.getName());
passwdMembershipServiceModuleImplAdv.setDescription(" Module Impl Advertisement for the PasswdMembership Service");
passwdMembershipServiceModuleImplAdv.setCompat(allPurposePeerGroupMemershipServiceModuleImplAdv.getCompat());
passwdMembershipServiceModuleImplAdv.setUri(allPurposePeerGroupMemershipServiceModuleImplAdv.getUri());
passwdMembershipServiceModuleImplAdv.setProvider(allPurposePeerGroupMemershipServiceModuleImplAdv.getProvider());
return passwdMembershipServiceModuleImplAdv;
}
ModuleImplAdvertisement allPurposePeerGroupImplAdv=null;
try {
allPurposePeerGroupImplAdv=rootPeerGroup.getAllPurposePeerGroupImplAdvertisement();
} catch (java.lang.Exception e) {
System.exit(1);
}
ModuleImplAdvertisement passwdMembershipPeerGroupModuleImplAdv=allPurposePeerGroupImplAdv;
ModuleImplAdvertisement passwdMembershipServiceModuleImplAdv=null;
StdPeerGroupParamAdv passwdMembershipPeerGroupParamAdv=null;
try {
passwdMembershipPeerGroupParamAdv =
new StdPeerGroupParamAdv(allPurposePeerGroupImplAdv.getParam());
} catch (net.jxta.exception.PeerGroupException e) {
System.exit(1);
}
Hashtable allPurposePeerGroupServicesHashtable = passwdMembershipPeerGroupParamAdv.getServices();
Enumeration allPurposePeerGroupServicesEnumeration = allPurposePeerGroupServicesHashtable.keys();
boolean membershipServiceFound=false;
while ((!membershipServiceFound) && (allPurposePeerGroupServicesEnumeration.hasMoreElements())) {
Object allPurposePeerGroupServiceID = allPurposePeerGroupServicesEnumeration.nextElement();
if (allPurposePeerGroupServiceID.equals(PeerGroup.membershipClassID)) {
ModuleImplAdvertisement allPurposePeerGroupMemershipServiceModuleImplAdv= (ModuleImplAdvertisement) allPurposePeerGroupServicesHashtable.get(allPurposePeerGroupServiceID);
passwdMembershipServiceModuleImplAdv=this.createPasswdMembershipServiceModuleImplAdv(allPurposePeerGroupMemershipServiceModuleImplAdv);
allPurposePeerGroupServicesHashtable.remove(allPurposePeerGroupServiceID);
allPurposePeerGroupServicesHashtable.put(PeerGroup.membershipClassID,passwdMembershipServiceModuleImplAdv);
membershipServiceFound=true;
passwdMembershipPeerGroupModuleImplAdv.setParam((Element) passwdMembershipPeerGroupParamAdv.getDocument(new MimeMediaType("text/xml")));
if (!passwdMembershipPeerGroupModuleImplAdv.getModuleSpecID().equals(PeerGroup.allPurposePeerGroupSpecID)) {
passwdMembershipPeerGroupModuleImplAdv.setModuleSpecID(IDFactory.newModuleSpecID(passwdMembershipPeerGroupModuleImplAdv.getModuleSpecID().getBaseClass()));
} else {
ID passwdGrpModSpecID= ID.nullID;
try {
passwdGrpModSpecID = IDFactory.fromURL(new URL("urn","","jxta:uuid-"+"DeadBeefDeafBabaFeedBabe00000001" +"04" +"06" ) );
} catch (java.net.MalformedURLException e) {}
catch (java.net.UnknownServiceException ee) {}
passwdMembershipPeerGroupModuleImplAdv.setModuleSpecID((ModuleSpecID) passwdGrpModSpecID);
}
membershipServiceFound=true;
}
}
return passwdMembershipPeerGroupModuleImplAdv;
}
private ModuleImplAdvertisement createPasswdMembershipServiceModuleImplAdv( ModuleImplAdvertisement allPurposePeerGroupMemershipServiceModuleImplAdv) {
ModuleImplAdvertisement passwdMembershipServiceModuleImplAdv = (ModuleImplAdvertisement) AdvertisementFactory.newAdvertisement(ModuleImplAdvertisement.getAdvertisementType());
passwdMembershipServiceModuleImplAdv.setModuleSpecID(PasswdMembershipService.passwordMembershipSpecID);
passwdMembershipServiceModuleImplAdv.setCode(PasswdMembershipService.class.getName());
passwdMembershipServiceModuleImplAdv.setDescription(" Module Impl Advertisement for the PasswdMembership Service");
passwdMembershipServiceModuleImplAdv.setCompat(allPurposePeerGroupMemershipServiceModuleImplAdv.getCompat());
passwdMembershipServiceModuleImplAdv.setUri(allPurposePeerGroupMemershipServiceModuleImplAdv.getUri());
passwdMembershipServiceModuleImplAdv.setProvider(allPurposePeerGroupMemershipServiceModuleImplAdv.getProvider());
return passwdMembershipServiceModuleImplAdv;
}
好了.之后你就可以利用这个ModuleImplAdvertisement 来建立你的应用中专用的对等组了.
PS:关于如何让JXTA在不同的网络中进行通讯的问题,虽然JXTA里面已经说明了自己有这样的能力可以做到.但是到底是如何实现呢? 下次再说 ^_^