在之前版本的Rapid引擎中,是没有提供客户端登陆验证的机制的,如果要验证用户的帐号密码信息,我们只有自己手动通过自定义信息来实现。在2011.04.25发布的新版本中,客户端Rapid引擎,则内置了在初始化时验证用户的帐号密码的功能,这使得登录验证变得更加简单。

一. ESPlus.Application.Basic 空间的支持

为了实现验证用户账号密码的功能,ESPlus.Application.Basic 命名空间增加了几个基础设施。

(1)ESPlus.Application.Basic.Passive.IBasicOutter 增加了Logon方法:

        /// <summary>
        /// 客户端登陆验证。
        /// </summary>
        /// <param name="systemToken">系统标志。</param>
        /// <param name="password">登陆密码</param>      
        LogonResult Logon(string systemToken, string password);

该方法向服务端提交当前登录用户的账号、密码、系统标志等信息,然后返回服务端验证后的登录结果。系统标志systemToken,用于表示当前客户端来自哪个系统,服务端可以验证这个标志是否与服务端匹配,以判断客户端与服务端是否属于同一套系统。在普通的应用中,我们可以忽略它。

登录结果使用LogonResult 枚举表示:


    public enum LogonResult
    {
        /// <summary>
        /// 登陆成功
        /// </summary>
        Succeed = 0,
        /// <summary>
        /// 账号或密码错误
        /// </summary>
        ErrorUserOrPassword,
        /// <summary>
        /// 已在其它地方登陆
        /// </summary>
        HadLoggedOn
    }

如果我们的服务端的重登陆模式设置为RelogonMode.IgnoreNew,而本次登录所用的UserID已经在线上了,那么Logon方法将返回LogonResult.HadLoggedOn,以表明该用户已在其它地方登录。

(2)ESPlus.Application.Basic.Server空间增加IBasicBusinessHandler接口

当客户端提交了当前登录用户的账号、密码、系统标志等信息到服务端后,服务端通过调用IBasicBusinessHandler来验证帐户信息。


    public interface IBasicBusinessHandler
    {
        /// <summary>
        /// 客户端登陆验证。
        /// </summary>        
        /// <param name="userID">登陆用户账号</param>
        /// <param name="systemToken">系统标志。用于验证客户端是否与服务端属于同一系统。</param>
        /// <param name="password">登陆密码</param>
        /// <returns>如果密码和系统标志都正确则返回true;否则返回false。</returns>
        bool VerifyUser(string systemToken, string userID, string password);
    }

注意,我们在实现IBasicBusinessHandler时,并不需要判断重登陆模式和用户是否已经在线了,这些已经由框架帮我们做好了。所以,VerifyUser方法只是返回一个bool值,来表示帐号密码是否正确。在实现该接口,并将其注入到ESPlus,就可以通过调用IBasicOutter的Logon方法来验证用户了。

框架提供了null object模式的IBasicBusinessHandler实现EmptyBasicBusinessHandler,其在实现VerifyUser方法时,始终返回true。

二.Rapid引擎内置登录验证

本次版本变更中,客户端Rapid引擎和服务端Rapid引擎的Initialize方法都有所变化,以支持用户登录验证的机制。

(1)IRapidPassiveEngine 的Initialize方法:

   LogonResult Initialize(string userID, string logonPassword, string serverIP, int serverPort, IBasicBusinessHandler basicHandler, ICustomizeInfoBusinessHandler customizeHandler);

该方法新增加了登录密码logonPassword参数,并返回登录结果。

在内部实现中,Initialize方法首先与服务器建立TCP连接,然后通过IBasicOutter的Logon方法发送登录验证请求并获取登录结果,如果登录成功,则直接返回;否则,关闭TCP连接,再返回结果。要注意的是,如果与服务器建立TCP连接失败,Initialize会直接抛出对应的异常,而不是通过返回值来表达。

IBasicOutter的Logon方法所需的systemToken从哪里来了?IRapidPassiveEngine 新增了一个可读写的属性SystemToken,如果我们设定了它,Logon方法将会将其作为参数值传入。

在用户登录尝试的过程中,程序可以反复调用Initialize来进行验证,而不需要每次都new一个客户端Rapid引擎实例。只有Initialize方法返回登录成功后,Rapid引擎的相关属性才是可用的。比如,我们可以通过其新增的CurrentUserID属性,来知道当前成功登录的用户的UserID。

(2)IRapidServerEngine 的Initialize方法:

    void Initialize(int port, ICustomizeInfoBusinessHandler customizeInfoBusinessHandler, IBasicBusinessHandler basicBusinessHandler, IFileBusinessHandler fileBusinessHandler, IFriendsManager friendsManager, IGroupManager groupManager);        

服务端Rapid引擎的Initialize方法增加了IBasicBusinessHandler参数,正如前所述,服务端正是通过它来验证客户端提交的帐户信息的。如果我们不关心帐户验证,那么可以传入上面提到的EmptyBasicBusinessHandler实例,或直接传入null -- 此时,引擎内部将默认使用EmptyBasicBusinessHandler来处理用户的登陆验证。

(3)对于大多数系统,登录时使用账号密码就已经足够。有些特殊的系统,如果在登录时需要验证更多的信息(比如时间戳等),那么大家可以巧用IRapidPassiveEngine的SystemToken属性来传递这些额外的验证信息,因为SystemToken的值也会被提交给服务端的VerifyUser方法进行验证。

结合本次版本变更,我们已经发布了最新ESFramework、帮助文档、以及更新了所有Demo源码。大家可以从ESFramework 4.0 概述文末下载。

客户端登录验证 -- ESFramework 4.0 快速上手(15)的更多相关文章

  1. 聊天系统Demo,增加Silverlight客户端(附源码)-- ESFramework 4.0 快速上手(09)

    在ESFramework 4.0 快速上手 -- 入门Demo,一个简单的IM系统(附源码)一文中,我们介绍了使用ESFramework的Rapid引擎开发的winform聊天程序,本文我们将在之前d ...

  2. ESFramework 4.0 快速上手(01) -- Rapid引擎

    (在阅读该文之前,请先阅读 ESFramework 4.0 概述 ,会对本文的理解更有帮助.) ESFramework/ESPlatform 4.0 的终极目标是为百万级的用户同时在线提供支持,因为强 ...

  3. 聊天系统Demo,增加文件传送功能(附源码)-- ESFramework 4.0 快速上手(14)

    本文我们将介绍在ESFramework 4.0 快速上手(08) -- 入门Demo,一个简单的IM系统(附源码)的基础上,增加文件传送的功能.如果不了解如何使用ESFramework提供的文件传送功 ...

  4. ESFramework 4.0 快速上手(06) -- Rapid引擎(续)

    <ESFramework 4.0 快速上手>系列介绍的都是如何使用Rapid引擎(快速引擎) -- RapidServerEngine 和 RapidPassiveEngine.其实,大家 ...

  5. 如何使用自定义消息?--ESFramework 4.0 快速上手(04)

    在ESFramework 4.0 快速上手一文中,我们讲述了如何使用Rapid引擎可以快速地上手ESFramework开发,文中介绍了使用ESPlus.Application.CustomizeInf ...

  6. 离线消息如何实现?-- ESFramework 4.0 快速上手(02)

    在ESFramework 4.0 快速上手一文中,主要介绍了如何使用ESPlus.Rapid命名空间中的引擎来快速地构建基于TCP的网络通信系统,即使是使用ESPlus.Rapid来进行ESFrame ...

  7. 文件传送,如此简单--ESFramework 4.0 快速上手(13)

    在所有的通信系统中,文件传送是最常见也是最重要的功能之一,ESFramework对文件传送的强大支持也是其亮点之一,使用ESFramework可以非常轻松地实现与文件传送相关的所有需求.ESPlus. ...

  8. 使用紧凑的序列化器,数倍提升性能 —— ESFramework 4.0 快速上手(11)

    在分布式通信系统中,网络传递的是二进制流,而内存中是我们基于对象模型构建的各种各样的对象,当我们需要将一个对象通过网络传递给另一个节点时,首先需要将其序列化为字节流,然后通过网络发送给目标节点,目标节 ...

  9. 监控自定义信息 —— ESFramework 4.0 快速上手(10)

    在ESFramework 4.0 进阶(02)-- 核心:消息处理的骨架流程一文中,我们介绍了通过挂接IMessageSpy到骨架流程,我们就可以监控到所有收发的消息.由于Rapid引擎已经为我们组装 ...

随机推荐

  1. Python基础知识学习_Day6

    一.time&datetime模块 常用选项如下: import time print(time.asctime()) #返回时间格式 print(time.localtime())#返回本地 ...

  2. 一个App从创意到最终上架到App Store里的整个过程是怎样的?

    一个App从创意到最终上架到App Store里的整个过程是怎样的? 制作App需要什么软件?应该看什么书?需要哪些设备?推到App Store里,需要注册什么网站?是否需要付费?需要什么证书之类的? ...

  3. COCOS2D-JS入门-官网template源码解析

    首先介绍几个概念: 导演: 导演 (Director)是Cocos2d-JS引擎抽象的一个对象,Director是整个Cocos2d-JS引擎的核心,是整个游戏的导航仪,游戏中的一些常用操作就是由Di ...

  4. Unity3d请求webservice

    我们在对接第三方sdk时,第三方sdk通常会以一个webservice接口的形式供我们来调用.而这些接口会以提供我们get,post,soap等协议来进行访问.get,post方法相信大家都比较熟悉了 ...

  5. js字符串操作

    javascript中字符串常用操作总结.JS字符串操作大全 String对象属性 (1) length属性 length算是字符串中非常常用的一个属性了,它的功能是获取字符串的长度.当然需要注意的是 ...

  6. Postman使用教程学习笔记

    刚加入网页测试行列,最近在学习POSTman的使用教程,记录下学习笔记. Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件.当开发人员需要调试一个网页是否运行正常,并不是 ...

  7. Ansible 变量

    1. 变量来源 inventoryfile中定义 playbook中定义 include文件和角色中定义变量 系统facts  ansible hostname -m setup local fact ...

  8. oracle数据库 参数open_cursors和session_cached_cursor详解!

    open_cursors 每个session(会话)最多能同时打开多少个cursor(游标) session_cached_cursor 每个session(会话)最多可以缓存多少个关闭掉的curso ...

  9. Yii2 基于RESTful api 坑 访问会把控制器名称变为复数

    'urlManager' => [ 'class' => 'yii\web\UrlManager', 'enablePrettyUrl' => true, 'enableStrict ...

  10. JAVA内容回顾(二)——面向对象(OOP)

    1.类与对象 类:类指的是同种对象的抽象,看不见摸不着的.包含有属性与方法. 对象:是类的具体实现,看的见摸得着的东西. 类是对象的抽象,对象是类的具体实现. 2.访问修饰符 public:在项目的任 ...