淘宝店地址:http://jirigala.taobao.com QQ:2520 56973 MSN:Jirigala_bao@hotmail.com
Spiga

通用权限管理系统组件 (GPM - General Permissions Manager) 中后一个登录的把前一个登录的踢掉功能的实现

2012-01-18 18:23 by MVP-通用权限管理, 2041 visits, 收藏, 编辑

    最近客户有需要,同一个帐户可以重复登录系统,但是后登录的账户需要把前面已经登录的账户踢掉,例如客户把电脑打开在别的电脑上然后换一个房间,或者换个办公楼想登录时就会遇到很多麻烦,遇到郁闷的情况就是死活无法登录系统,因为那个帐户已经在线了,或者2个帐户都登录了,最新消息提醒会乱套。

    其实软件是否好用都是体现在能否经得起各种折磨上,有的软件把问题考虑得很充分,不管遇到什么麻烦事情都已经帮你处理好了,想得非常周到,下面我们看看通用权限管理系统里的处理方式。

 

    1:首先系统里有设置,是否允许重复登录的选项,一般情况下默认配置是不用修改的

吉日嘎拉,通用权限管理系统组件

   2:我们登录系统

吉日嘎拉,通用权限管理系统组件

    3:登录到系统后的效果如下

吉日嘎拉,通用权限管理系统组件

     4:每个用户登录系统后,都会产生一个新的OpenId,然后把这个OpenId保存到客户端。

吉日嘎拉,通用权限管理系统组件
 

  5:再登录系统后,会产生新的 OpenId。

吉日嘎拉,通用权限管理系统组件

   6:由于上一个登录的本地的OpenId与服务器上的OpenId不一样了,所以上一个登录系统的软件就被迫被下线了,什么烦恼都这么简单的解决了。

吉日嘎拉,通用权限管理系统组件
  

   有了这个功能,客户就可以在任何电脑上,任何办公室,任何办公楼里都可以随时登录,不用有上一个已经登录的系统的烦恼了,爽歪歪,软件也好用了更加人性化了。

系统管理员也有能力想让那个用户下线就可以让哪个用户下线了又简单又好用了。

 

   当前用户的信息如下:

View Code
//-----------------------------------------------------------------
// All Rights Reserved , Copyright (C) 2011 , Hairihan TECH, Ltd. 
//-----------------------------------------------------------------

using System;

namespace DotNet.Utilities
{
    /// <summary>
    
/// BaseUserInfo
    
/// 用户类
    
/// 
    
/// 修改纪录
    
/// 
    
///        2011.09.12 JiRiGaLa 版本:2.1 公司名称、部门名称、工作组名称进行重构。
    
///        2011.05.11 JiRiGaLa 版本:2.0 增加安全通讯用户名、密码。
    
///        2008.08.26 JiRiGaLa 版本:1.2 整理主键。
    
///        2006.05.03 JiRiGaLa 版本:1.1 添加到工程项目中。
    
///        2006.01.21 JiRiGaLa 版本:1.0 远程传递参数用属性才可以。
    
///        
    
/// 版本:2.1
    
///
    
/// <author>
    
///        <name>JiRiGaLa</name>
    
///        <date>2011.09.12</date>
    
/// </author> 
    
/// </summary>
    [Serializable]
    public class BaseUserInfo
    {
        public BaseUserInfo()
        {
            this.GetUserInfo();
        }

        /// <summary>
        
/// 远程调用Service用户名(为了提高软件的安全性)
        
/// </summary>
        private string serviceUserName = "Hairihan";
        public string ServiceUserName
        {
            get
            {
                return this.serviceUserName;
            }
            set
            {
                this.serviceUserName = value;
            }
        }

        /// <summary>
        
/// 远程调用Service密码(为了提高软件的安全性)
        
/// </summary>
        private string servicePassword = "Hairihan";
        public string ServicePassword
        {
            get
            {
                return this.servicePassword;
            }
            set
            {
                this.servicePassword = value;
            }
        }

        /// <summary>
        
/// 单点登录唯一识别标识
        
/// </summary>
        private string openId = string.Empty;
        public string OpenId
        {
            get
            {
                return this.openId;
            }
            set
            {
                this.openId = value;
            }
        }

        /// <summary>
        
/// 目标用户
        
/// </summary>
        private string targetUserId = string.Empty;
        public string TargetUserId
        {
            get
            {
                return this.targetUserId;
            }
            set
            {
                this.targetUserId = value;
            }
        }

        /// <summary>
        
/// 用户主键
        
/// </summary>
        private string id = string.Empty;
        public string Id
        {
            get
            {
                return this.id;
            }
            set
            {
                this.id = value;
            }
        }

        /// <summary>
        
/// 员工主键
        
/// </summary>
        private string staffId = string.Empty;
        public string StaffId
        {
            get
            {
                return this.staffId;
            }
            set
            {
                this.staffId = value;
            }
        }
        
        /// <summary>
        
/// 用户用户名
        
/// </summary>
        private string userName = string.Empty;
        public string UserName
        {
            get
            {
                return this.userName;
            }
            set
            {
                this.userName = value;
            }
        }
        
        /// <summary>
        
/// 用户姓名
        
/// </summary>
        private string realName = string.Empty;
        public string RealName
        {
            get
            {
                return this.realName;
            }
            set
            {
                this.realName = value;
            }
        }

        /// <summary>
        
/// 编号
        
/// </summary>
        private string code = string.Empty;
        public string Code
        {
            get
            {
                return this.code;
            }
            set
            {
                this.code = value;
            }
        }

        /// <summary>
        
/// 当前的组织结构公司主键
        
/// </summary>
        private int? companyId = null;
        public int? CompanyId
        {
            get
            {
                return this.companyId;
            }
            set
            {
                this.companyId = value;
            }
        }
        
        /// <summary>
        
/// 当前的组织结构公司编号
        
/// </summary>
        private string companyCode = string.Empty;
        public string CompanyCode
        {
            get
            {
                return this.companyCode;
            }
            set
            {
                this.companyCode = value;
            }
        }
        
        /// <summary>
        
/// 当前的组织结构公司名称
        
/// </summary>
        private string companyName = string.Empty;
        public string CompanyName
        {
            get
            {
                return this.companyName;
            }
            set
            {
                this.companyName = value;
            }
        }

        /// <summary>
        
/// 当前的组织结构部门主键
        
/// </summary>
        private int? departmentId = null;
        public int? DepartmentId
        {
            get
            {
                return this.departmentId;
            }
            set
            {
                this.departmentId = value;
            }
        }

        /// <summary>
        
/// 当前的组织结构部门编号
        
/// </summary>
        private string departmentCode = string.Empty;
        public string DepartmentCode
        {
            get
            {
                return this.departmentCode;
            }
            set
            {
                this.departmentCode = value;
            }
        }

        /// <summary>
        
/// 当前的组织结构部门名称
        
/// </summary>
        private string departmentName = string.Empty;
        public string DepartmentName
        {
            get
            {
                return this.departmentName;
            }
            set
            {
                this.departmentName = value;
            }
        }

        /// <summary>
        
/// 当前的组织结构工作组主键
        
/// </summary>
        private int? workgroupId = null;
        public int? WorkgroupId
        {
            get
            {
                return this.workgroupId;
            }
            set
            {
                this.workgroupId = value;
            }
        }

        /// <summary>
        
/// 当前的组织结构工作组编号
        
/// </summary>
        private string workgroupCode = string.Empty;
        public string WorkgroupCode
        {
            get
            {
                return this.workgroupCode;
            }
            set
            {
                this.workgroupCode = value;
            }
        }

        /// <summary>
        
/// 当前的组织结构工作组名称
        
/// </summary>
        private string workgroupName = string.Empty;
        public string WorkgroupName
        {
            get
            {
                return this.workgroupName;
            }
            set
            {
                this.workgroupName = value;
            }
        }       

        /// <summary>
        
/// 默认角色
        
/// </summary>
        private int? roleId = null;
        public int? RoleId
        {
            get
            {
                return this.roleId;
            }
            set
            {
                this.roleId = value;
            }
        }

        /// <summary>
        
/// 安全级别
        
/// </summary>
        private int securityLevel = 0;
        public int SecurityLevel
        {
            get
            {
                return this.securityLevel;
            }
            set
            {
                this.securityLevel = value;
            }
        }

        /// <summary>
        
/// 默认角色名称
        
/// </summary>
        private string roleName = string.Empty;
        public string RoleName
        {
            get
            {
                return this.roleName;
            }
            set
            {
                this.roleName = value;
            }
        }

        /// <summary>
        
/// 是否超级管理员
        
/// </summary>
        private bool isAdministrator = false;
        public bool IsAdministrator
        {
            get
            {
                return this.isAdministrator;
            }
            set
            {
                this.isAdministrator = value;
            }
        }

        /// <summary>
        
/// 密码
        
/// </summary>
        private string password = string.Empty;
        public string Password
        {
            get
            {
                return this.password;
            }
            set
            {
                this.password = value;
            }
        }

        /// <summary>
        
/// IP地址
        
/// </summary>
        private string ipAddress = string.Empty;
        public string IPAddress
        {
            get
            {
                return this.ipAddress;
            }
            set
            {
                this.ipAddress = value;
            }
        }
        
        /// <summary>
        
/// MAC地址
        
/// </summary>
        private string macAddress = string.Empty;
        public string MACAddress
        {
            get
            {
                return this.macAddress;
            }
            set
            {
                this.macAddress = value;
            }
        }

        /// <summary>
        
/// 当前语言选择
        
/// </summary>
        private string currentLanguage = string.Empty;
        public string CurrentLanguage
        {
            get
            {
                return this.currentLanguage;
            }
            set
            {
                this.currentLanguage = value;
            }
        }

        /// <summary>
        
/// 当前布局风格选择
        
/// </summary>
        private string themes = string.Empty;
        public string Themes
        {
            get
            {
                return this.themes;
            }
            set
            {
                this.themes = value;
            }
        }
        
        /// <summary>
        
/// 描述
        
/// </summary>
        private string description = string.Empty;
        public string Description
        {
            get
            {
                return this.description;
            }
            set
            {
                this.description = value;
            }
        }

        #region public void GetUserInfo()
        /// <summary>
        
/// 获取信息
        
/// </summary>
        public void GetUserInfo()
        {
            this.ServiceUserName = BaseSystemInfo.ServiceUserName;
            this.ServicePassword = BaseSystemInfo.ServicePassword;
            this.CurrentLanguage = BaseSystemInfo.CurrentLanguage;
            this.Themes = BaseSystemInfo.Themes;
        }
        #endregion
    }
}

 

 

将权限管理、工作流管理做到我能力的极致,一个人只能做好那么很少的几件事情。
Add your comment

19 条回复

  1. #1楼 礼物[未注册用户]2012-01-18 18:53
    是由客户端定时检查openid吗
     回复 引用   
  2. #2楼[楼主] General Permissions Manager      2012-01-18 19:06
    不用这个,还能有什么神奇的方法不?若服务器能直接踢掉客户端了,那不是有很多病毒都可以控制客户端软件了?
    引用礼物:是由客户端定时检查openid吗
     回复 引用 查看   
  3. #3楼 侯唯      2012-01-18 19:28
    通过客户端在发送心跳包的时候,判断一下当前帐号的在服务器端保存登录信息就行了,没什么难度的吧。
     回复 引用 查看   
  4. #4楼[楼主] General Permissions Manager      2012-01-18 19:53
    是的,不是很难的。

    引用侯唯:通过客户端在发送心跳包的时候,判断一下当前帐号的在服务器端保存登录信息就行了,没什么难度的吧。
     回复 引用 查看   
  5. #5楼 SmartSoft[未注册用户]2012-01-18 21:26
    引用General Permissions Manager:
    不用这个,还能有什么神奇的方法不?若服务器能直接踢掉客户端了,那不是有很多病毒都可以控制客户端软件了?
    引用礼物:是由客户端定时检查openid吗


    那你是定时访问服务器的用户表,读取OpenID比对实现的吗?
    这样如果客户端很多,岂不是对服务器造成很大压力?
     回复 引用   
  6. #6楼[楼主] 通用权限管理系统组件      2012-01-18 22:01
    服务器访问客户端难道就压力不大了?你怎么访问客户端?

    引用SmartSoft:
    引用General Permissions Manager:
    不用这个,还能有什么神奇的方法不?若服务器能直接踢掉客户端了,那不是有很多病毒都可以控制客户端软件了?
    引用礼物:是由客户端定时检查openid吗


    那你是定时访问服务器的用户表,读取OpenID比对实现的吗?
    这样如果客户端很多,岂不是对服务器造成很大压力?
     回复 引用 查看   
  7. #7楼 伍华聪      2012-01-18 22:07
    细微之处见功夫,非常不错!
     回复 引用 查看   
  8. #8楼 祭天      2012-01-18 23:31
    其实通篇最重要的就是何时比对OpenID与如何实现,反而是没说...
     回复 引用 查看   
  9. #9楼 南京.王清培      2012-01-19 08:41
    其实楼主的核心要点已经说明了,能不能理解就像华聪哥说的。生成类似客户端的回话ID保存在客户端,在适当的时间、适当的访问点进行单点验证,对于所说的什么“心跳验证包”啥东西,只是需求罢了。学习了,楼主辛苦。
     回复 引用 查看   
  10. #10楼 海南.胡勇      2012-01-19 08:43
    突然断电,死机等类型情况,这种情况DB中还是为在线状态,下次登录时,岂不登录不了了!
    这种情况也要解决~!
     回复 引用 查看   
  11. #11楼 么有爱情的色鬼      2012-01-19 08:46
    可以理解为,通过登陆日志实时比对帐号的登陆情况在客户端异步执行登出操作!
    内部系统还行!有点像提示消息那种!!!
     回复 引用 查看   
  12. #12楼 翁玉礼      2012-01-19 08:50
    下线基本有两种方式,一种是服务端回调客户端句柄,执行一些操作,另外就是客户端通过心跳包来获取服务器的指令。

    //话说OpenId这名字起的... 容易跟统一验证那个OpenId混淆
     回复 引用 查看   
  13. #13楼 火星大能猫      2012-01-19 09:41
    这个想法还是不错的。
     回复 引用 查看   
  14. #14楼 cdmin207078      2012-01-19 09:55
    "软件是否好用都是体现在能否经得起各种折磨上"
    深有体会~. 顶~.
     回复 引用 查看   
  15. #15楼 阿祖      2012-01-19 15:51
    这是CS的吧?BS的可以理解为:每次登录服务器端生成GUID给客户端作为唯一凭证,客户端根据这个GUID向服务器请求数据,若这个GUID和服务器上GUID不等,则在其它地方登录。。。
    还有其它方法吗
     回复 引用 查看   
  16. #16楼 杨盛超      2012-01-19 17:11
    客户端非正常关机或退出,服务端还是记录用户在线状态的,这个问题咋处理的啊?
     回复 引用 查看   
  17. #17楼[楼主] 通用权限管理系统组件      2012-01-20 01:21
    3分钟还不报道的,就认为是不在线了。

    引用杨盛超:客户端非正常关机或退出,服务端还是记录用户在线状态的,这个问题咋处理的啊?
     回复 引用 查看   
  18. #18楼[楼主] 通用权限管理系统组件      2012-01-20 01:22
    上班了都30分钟了还没到的,就是迟到了。
    一天都没来上班的,就是矿工了。
    3分钟内还没报道的,就算是死机了。

    引用海南.胡勇:
    突然断电,死机等类型情况,这种情况DB中还是为在线状态,下次登录时,岂不登录不了了!
    这种情况也要解决~!
     回复 引用 查看   
  19. #19楼 羽之      2012-01-20 11:17
    一般是否重复登陆,都在会话层解决,很少使用数据库的,因为存在意外掉线。

    使用会话层来解决这个问题比较好一些。
     回复 引用 查看   
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 2325890 yg1G4pwvReM=


C# ASP.NET 通用权限设计、通用权限管理、通用权限组件、单点登录、集中式权限管理、统一授权体系、分级管理分级授权