zoukankan      html  css  js  c++  java
  • [转载]ESFramework 4.0 快速上手(15) -- 客户端登录验证

    ESFramework 4.0 快速上手(15) -- 客户端登录验证

          在之前版本的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 logonPasswordstring 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 basicBusinessHandlerIFileBusinessHandler fileBusinessHandler, IFriendsManager friendsManager, IGroupManager groupManager);        

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

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

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

  • 相关阅读:
    Vim Taglist插件的安装与配置
    static变量和static函数
    Linux线程同步读写锁 rwlock
    Linux top命令 使用详解
    Python学习资料
    记录点滴
    自定义的动态buffer
    【数据存储】【Redis】第七章:Redis缓存Zset类型的使用
    RabbitMQ:第二章:Spring整合RabbitMQ(简单模式,广播模式,路由模式,通配符模式,消息可靠性投递,防止消息丢失,TTL,死信队列,延迟队列,消息积压,消息幂等性)
    RabbitMQ:第三章:Springboot集成RabbitMQ(直连模式,工作队列模式,发布订阅模式,路由模式,通配符模式)
  • 原文地址:https://www.cnblogs.com/fx2008/p/2263397.html
Copyright © 2011-2022 走看看