`

JXTA中通过身份认证来加入“群”(二)

 
阅读更多

本文是接前篇而写,所以一些前面讲过的东西在这里不再重复。想了解的,直接看前篇。

在这里我们要讲的是如何创建一个带有密码认证的“群”。首先,我们要明白在JXTA中,其中最大的一个特点就是提供共享服务。而身份认证也是其中一种服务,因为在JXTA中已经实现一些基础的服务。而密码服务也已经实现,只是在利用NetGroup创建新的对等组时,其提供的默认的身份认证的服务,是没有认证,即NoneMembershipService,看到这里想来大家也有点明白了,想要实现密码服务,就是把对等组中提供中的默认NoneMembershipService服务,替换成PasswdMembershipService,即可。然后我们把其包含中对等组广告中,还有别忘记了把用户名和密码包含在对等组广告中。以加入者想加入该对等组时进行确认,通过密码认证则通过,不通过,那就不让你登堂入室了。

因为这篇是“JXTA中通过身份认证来加入“群””的后续,所以我只是把创建密码对等组的代码贴出来。只要添加到前篇代码中即可。

//创建带有用户名和密码的“群”
 private PeerGroup createPeerGroup(PeerGroup netpg, String groupName,
   String login, String passwd) {
  //创建该对等组必须要做到以下3点:
  //1、创建一个对等组模块实现广告并发布它
  //2、创建一个对等组广告并发布它
  //3、返回一个对等组对象,它是通过2中的对等组广告来创建的。
  PeerGroup tpg = null;
  PeerGroupAdvertisement spgAdv ;
  //创建对等组模块实现广告
  ModuleImplAdvertisement passwdMsMIAdv = createPasswdMembershipPeerGroupModuleImplAdv(netpg);
  //在当前对等组发布对等组模块实现广告
  DiscoveryService netpgSer = netpg.getDiscoveryService();
  
  try {
   netpgSer.publish(passwdMsMIAdv);
   netpgSer.remotePublish(passwdMsMIAdv);
  } catch (Exception e) {
   System.out.println("发布密码关系服务模块实现失败");
   System.exit(-1);//退出系统
  }
  //创建对等组广告
  spgAdv = createPeerGroupAdvertisement(passwdMsMIAdv,groupName,login,passwd);
  //在父对等组中发布
  try {
   netpgSer.publish(spgAdv);
   netpgSer.remotePublish(spgAdv);
  } catch (IOException e) {
   System.out.println("发布目标对等组广告失败");
   System.exit(-1);
  }
  //最后创建目标对等组
  if(null==spgAdv){
   System.err.println("目标对等组广告为空");
  }
  try {
   tpg = netpg.newGroup(spgAdv);
  } catch (PeerGroupException e) {
   System.out.println("通过对待组广告没有创建目标对等组");
   e.printStackTrace();
  }
  return tpg;
 }
 private PeerGroupAdvertisement createPeerGroupAdvertisement(
   ModuleImplAdvertisement passwdMsMIAdv, String groupName,
   String login, String passwd) {
  //使用广告工厂创建一个对等组广告
  PeerGroupAdvertisement spgAdv = (PeerGroupAdvertisement)AdvertisementFactory.newAdvertisement(PeerGroupAdvertisement.getAdvertisementType());
  //在这里使用的是每次都用新的PID代替,当然你也可以使用固定PID,这样每次开始PrivateGroup都产生同一个对等组。
  spgAdv.setPeerGroupID(satellaPID);
  spgAdv.setModuleSpecID(passwdMsMIAdv.getModuleSpecID());
  spgAdv.setName(groupName);
  spgAdv.setDescription("对等组使用密码认证");
  //现在创建一个结构文档包含用户名和密码信息。用户名和密码加到对等组"Parm"标签中
  if(null!=login){
   StructuredTextDocument loginAndPasswd = (StructuredTextDocument)StructuredDocumentFactory.newStructuredDocument(new MimeMediaType("text/xml"), "Parm");
   String loginAndPasswdString = login+":"+PasswdMembershipService.makePsswd(passwd)+":";
   TextElement loginElement = loginAndPasswd.createElement("login",loginAndPasswdString);
   loginAndPasswd.appendChild(loginElement);
   //创建好包含有用户名和密码的结构文档,现在我们就把它放到对等组广告中
   spgAdv.putServiceParam(PeerGroup.membershipClassID, loginAndPasswd);
  }
  return spgAdv;
 }
 private ModuleImplAdvertisement createPasswdMembershipPeerGroupModuleImplAdv(
   PeerGroup netpg) {
  //通过密码关系服务创建一个模块实现广告
  //复制一个默认对等组实现广告作为模块实现参数,这样比重新创建一个模块实现广告要容易的多
  //我们在这里需要做的就是把关系服务类型从默认类型改为密码关系服务类型
  //说白了就是更新对等组所有实现广告中包含的关系服务类型,代码中就是更新AllPurposePeerGroupImplAdvertisement中的membership
  //即替换换AllPurposePeerGroupImplAdvertisement中的NoneMembershipService,改变成PasswdMembershipService
  ModuleImplAdvertisement apAdv = null;
  try {
   apAdv = netpg.getAllPurposePeerGroupImplAdvertisement();//获得对等组提供的所有实现广告,即是说对等组所有的服务广告都包含在这里
  } catch (Exception e) {
   System.out.println("执行复制默认对等组实现广告失败");
   System.exit(-1);
  }
  ModuleImplAdvertisement passwdMembershipPeerGroupModuleImplAdv = apAdv;
  ModuleImplAdvertisement passwdMembershipServiceModuleImplAdv = null;
  StdPeerGroupParamAdv passwdMembershipPeerGroupParamAdv = null;
  
  try {
   passwdMembershipPeerGroupParamAdv = new StdPeerGroupParamAdv(apAdv.getParam());
  } catch (Exception e) {
   System.out.println("执行上面语句失败");
   System.exit(-1);
  }
  Map apMap =  passwdMembershipPeerGroupParamAdv.getServices();
  Set set = apMap.keySet();
  Iterator iter = set.iterator();
  boolean msFound = false;
  while(!msFound&&iter.hasNext()){
   Object apGSID = iter.next();
   if(apGSID.equals(PeerGroup.membershipClassID)){
    //默认对等组关系服务实现广告是所有关系服务实现广告的集合,我们在这里要找是的密码关系服务实现广告
    ModuleImplAdvertisement apgAdv = (ModuleImplAdvertisement)apMap.get(apGSID);
    //创建密码关系服务模块实现广告
    passwdMembershipServiceModuleImplAdv = createPasswdMembershipServiceModuleImplAdv(apgAdv);
    //删除所有目标关系服务实现
    apMap.remove(apGSID);
    //用密码关系服务实现来代替默认的关系服务实现,即把对等组关系服务类型改变了,改成密码关系服务类型
    apMap.put(PeerGroup.membershipClassID, passwdMembershipServiceModuleImplAdv);
    msFound = true;
    //现在密码关系服务广告已经完成。让我们通过参数更新,更新关系对等组模块实现广告
    passwdMembershipPeerGroupModuleImplAdv.setParam((Element)passwdMembershipPeerGroupParamAdv.getDocument(MimeMediaType.XMLUTF8));
    //更新模块实现广告SPID
    if(!passwdMembershipPeerGroupModuleImplAdv.getModuleSpecID().equals(PeerGroup.allPurposePeerGroupSpecID)){//如果SpecID=原本的SPID,即没有变,则IDFactory生成一个新的SPID
     passwdMembershipPeerGroupModuleImplAdv.setModuleSpecID(IDFactory.newModuleSpecID(passwdMembershipPeerGroupModuleImplAdv.getModuleSpecID().getBaseClass()));
    }else{
     ID passwdGrpModSpecID = ID.create(URI.create("urn:"+"jxta:uuid-"+"DeadBeefDeafBabaFeedBabe00000001"+"04"+"06"));
     passwdMembershipPeerGroupModuleImplAdv.setModuleSpecID((ModuleSpecID)passwdGrpModSpecID);
    }
    msFound = true;
   }
  }
  return passwdMembershipPeerGroupModuleImplAdv;
 }
 /**
  * 使用到默认模块实现广告中的一些值,而更新SpecID和class及描述,得到一个新的模块实现广告
  * @param apgAdv 默认模块实现广告,即getAllPurposePeerGroupImplAdvertisement
  * @return
  */
 private ModuleImplAdvertisement createPasswdMembershipServiceModuleImplAdv(
   ModuleImplAdvertisement apgAdv) {
  //为关系服务创建一个新的模块实现广告
  ModuleImplAdvertisement passwdMembershipServiceModuleImplAdv = (ModuleImplAdvertisement)AdvertisementFactory.newAdvertisement(ModuleImplAdvertisement.getAdvertisementType());
  passwdMembershipServiceModuleImplAdv.setModuleSpecID(PasswdMembershipService.passwordMembershipSpecID);//密码关系服务ID
  passwdMembershipServiceModuleImplAdv.setCode(PasswdMembershipService.class.getName());//得到密码关系服务类名称
  passwdMembershipServiceModuleImplAdv.setDescription("为关系服务而创建的模块实现广告");//更新模块实现广告描述
  passwdMembershipServiceModuleImplAdv.setCompat(apgAdv.getCompat());
  passwdMembershipServiceModuleImplAdv.setUri(apgAdv.getUri());
  passwdMembershipServiceModuleImplAdv.setProvider(apgAdv.getProvider());
  return passwdMembershipServiceModuleImplAdv;
 }

1
0
分享到:
评论
3 楼 fengky 2010-07-21  
您好
有个逻辑上的问题请教一下。
你自己创建的peergroup,为什么还要去discovery,然后进行验证?而且,最后的验证好像是在验证群组的广告是否合法,而不是验证其他想要加入的peer的广告是否合法。
为什么不在jxta平台启动之前就设置好群组的密码和用户名,然后再启动,这样岂不是可以省去后面从默认群组建立带身份验证的群组的过程?
小弟是新人,上面的问题可能违背基本的常识,请楼主不吝赐教。
2 楼 lyndon.lin 2010-05-25  
看看2.5的例子里也有相似的代码,做法肯定是没办法的。只是写法可能有所不同。
1 楼 hero1987116 2010-05-25  
请问下这个密码服务是不是只适合于JXTA2.4,能不能应用在基于jxta2.5的程序里,而且这个类StdPeerGroupParamAdv在jxta2.5中都过时了,谢谢!

相关推荐

    jxta messager

    5. **服务(Services)**: JXTA框架提供的功能模块,例如消息服务、身份验证服务等,可以通过广告机制发现和使用。 **JXTA Messenger 实现细节** 1. **对等组(Peer Group)**: JXTA Messenger运行在特定的对等组...

    JXTA--P2pSocket.rar

    1. **身份认证与安全性:** JXTA提供了基于证书的身份认证和加密机制,确保通信的安全性和完整性。 2. **网络路由:** P2pSocket能够处理复杂的网络拓扑,包括多跳路由,使得节点间的通信更为灵活。 3. **错误处理:...

    jxta.rar_jxta_jxta cms

    通过使用"jxta.jar",开发者可以轻松地在应用程序中集成P2P功能,如创建和加入网络、发布和查找资源、建立通信管道等。 其次,"cms.jar"可能指的是CMS(Cryptographic Message Syntax),这是一个用于加密和签名...

    JXTA技术手册源代码.

    - **NetPeer**:代表网络中的单个节点,处理网络连接和身份认证。 - **PipeService**:提供创建和管理管道的接口,用于设备间的通信。 - **AdvService**:用于发布、查询和接收广告,实现资源的发现和共享。 - *...

    JXTA-Java-P2P网络编程技术书后源码

    **Java P2P网络编程与JXTA技术详解** ...总之,"JXTA-Java-P2P网络编程技术书后源码"是一个宝贵的资源,它帮助开发者通过实践来学习和理解P2P网络编程和JXTA的精髓,从而能够设计和实现自己的P2P解决方案。

    一个基于P2P框架的Jxta开发的聊天器

    4. **身份认证与安全**:为了确保聊天内容的安全性,JXTA提供了加密和身份验证机制。聊天器可能利用这些功能来保护用户隐私,防止未经授权的访问。 5. **容错与网络动态性**:P2P网络中的节点可能会随时加入或离开...

    JXTA Java P2P 网络编程技术

    5. **身份管理(Identity Management)**:JXTA使用数字证书来验证节点的身份,确保网络通信的安全性和可靠性。 6. **协议栈(Protocol Stack)**:JXTA提供了基于TCP/IP的底层通信协议栈,但同时也支持其他传输...

    HelloJxta.rar_jxta_p2p jxta

    4. **服务接口(Service)**:JXTA支持多种服务,如身份验证、资源搜索、消息传递等。开发者可以通过定义服务接口来扩展JXTA的功能。 5. **协议栈**:JXTA协议栈包括了网络层、传输层、会话层、应用层等多个层次,...

    基于jxta的p2p即时通信系统设计

    2. **JXTA协议**:JXTA提供了P2P网络的基础框架,包括对等体的发现、连接、身份验证和安全通信等功能。通过JXTA,开发者可以轻松实现P2P应用的各个组件,如数据交换、服务发布和查找。 3. **对等组与管道**:在JXTA...

    jxta-java p2p网络编程技术

    4. **安全与身份验证**:了解JXTA的安全模型,包括证书、数字签名和加密,确保P2P网络中的通信安全。 5. **服务自定义**:学习如何根据需求扩展JXTA,创建自定义服务来满足特定业务场景。 6. **性能优化**:掌握...

    JXTA开发包2

    在提供的压缩包中,"jxme-2.1.3-bin.zip"包含了JXTA的二进制库,这些库文件是实际开发中所需的编译后的Java类,可以直接在项目中引用。开发人员可以将这些库导入到他们的IDE(如Eclipse或IntelliJ IDEA)中,以便...

    JXTA网络编程环境的实现

    - **认证**:节点在加入组群之前需要通过身份验证,确保只有合法的节点才能参与通信。 - **授权**:节点之间可以设置权限控制,指定哪些节点可以访问特定资源或执行特定操作。 - **完整性保护**:使用数字签名等技术...

    jxta-shell 2.4.1

    JXTA协议栈包含一系列基于XML的协议,用于实现P2P网络中的身份验证、服务发现、消息传递等功能。主要组件包括: - **广告(Advertisements)**:JXTA使用XML格式的广告来描述网络中的资源和服务,便于搜索和发现。 ...

    p2p平台jxta学习资料

    JXTA使用XML来交换信息,支持多种服务,如身份验证、广告发布、流媒体传输等。 2. **P2P网络模型**:了解P2P网络的基本结构和工作原理,包括对等节点的发现、连接建立、资源搜索和数据传输。在JXTA中,节点通过发布...

    基于JXTA的p2p文件共享

    7. **容错和可用性**: P2P网络中的节点可能会随时加入或离开,JXTA通过复制和分散数据来提高系统的可靠性和可用性。 在"录像截图"中,可能包含了JXTA实现P2P文件共享的演示或示例,帮助用户直观了解其工作流程。"可...

    JXTA-Java P2P网络编程技术

    10. **容错和可扩展性(Fault Tolerance and Scalability)**: JXTA设计时考虑了网络中的节点可能随时加入或离开,因此具有良好的容错性和可扩展性。 通过学习JXTA,开发者可以利用其提供的API和工具来创建分布式...

    JXTA——Java P2P网络编程技术

    5. **JXTA网络的加入与离开**:描述了节点如何加入和离开P2P网络,以及这个过程中的身份验证和安全考量。 **第四章:JXTA服务与管道** 这一章的重点在于JXTA的服务模型和通信机制: 1. **服务发现与提供**:讨论了...

    用JXTA实现的P2P画板程序

    4. **安全机制**:JXTA提供了加密和身份验证机制,确保数据的安全传输和防止恶意攻击。 在P2P画板程序中,JXTA的这些特性被充分利用。例如,通过发现服务,新加入的客户端可以快速找到其他在线用户;通过发布/订阅...

Global site tag (gtag.js) - Google Analytics