Winform开发框架之权限管理系统改进的经验总结(3)-系统登录黑白名单的实现

简介:

在一般的权限系统里面,可能经常会看到系统的黑名单或者白名单的拦截功能。在一般权限系统里面,常见的黑名单就是禁止用户在某些IP上登录系统,白名单就是允许用户只在某些IP上登录系统。本随笔主要介绍在我的权限系统里面,如何实现这个黑白名单的功能,以及介绍在其中应用到的IP对比操作,IP段判断等操作代码。

1、黑白名单的配置

要完成黑名单的拦截和白名单的放行,我们需要进行名单的配置操作,我们把相关的配置放到列表里面进行展示,可以添加多个黑名单或者白名单,如下界面所示。

可以单击新建按钮进行添加一条记录,或者在已有记录上双击黑白名单可以进行编辑,界面如下所示。

2、IP段的录入和对比

在上面的IP输入中,我们需要确认IP段的起始地址小于结束地址,否则我们对比的时候,就可能发生混乱,因此需要在用户输入的时候进行确认,也就是IP地址的大小对比关系。

输入内容的检查代码如下所示。


        /// <summary>
        /// 实现控件输入检查的函数
        /// </summary>
        /// <returns></returns>
        public override bool CheckInput()
        {
            bool result = true;//默认是可以通过

            #region MyRegion
            if (this.txtName.Text.Trim().Length == 0)
            {
                MessageDxUtil.ShowTips("请输入显示名称");
                this.txtName.Focus();
                result = false;
            }
            else if (this.txtAuthorizeType.Text.Length == 0)
            {
                MessageDxUtil.ShowTips("请选择授权类型");
                this.txtAuthorizeType.Focus();
                result = false;
            }
            else if (this.txtIPStart.Text.Length == 0)
            {
                MessageDxUtil.ShowTips("请输入IP起始地址");
                this.txtIPStart.Focus();
                result = false;
            }
            else if (this.txtIPEnd.Text.Length == 0)
            {
                MessageDxUtil.ShowTips("请输入IP结束地址");
                this.txtIPEnd.Focus();
                result = false;
            }

            IPAddress ip1 = IPAddress.Parse(this.txtIPStart.Text);
            IPAddress ip2 = IPAddress.Parse(this.txtIPEnd.Text);

            if (ip1.Compare(ip2) == 1)
            {
                MessageDxUtil.ShowTips("请IP开始地址不能大于结束地址, 请修改");
                this.txtIPEnd.Focus();
                result = false;
            }

            #endregion

            return result;
        }

上面代码的IP地址的Compare函数,其实是我的扩展方法,注释如下所示。

IP地址的对比操作,其实就是把IP文本转换整形数值及性能对比,Compare扩展方法的定义代码如下所示。


        /// <summary>
        /// IP地址转换为INT类型
        /// </summary>
        /// <param name="IP">IP地址</param>
        /// <returns></returns>
        public static int ToInteger(this IPAddress IP)
        {
            int result = 0;

            byte[] bytes = IP.GetAddressBytes();
            result = (int)(bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3]);

            return result;
        }

        /// <summary>
        /// 比较两个IP的大小。如果相等返回0,如果IP1大于IP2返回1,如果IP1小于IP2返回-1。
        /// </summary>
        /// <param name="IP1">IP地址1</param>
        /// <param name="IP2">IP地址2</param>
        /// <returns>如果相等返回0,如果IP1大于IP2返回1,如果IP1小于IP2返回-1。</returns>
        public static int Compare(this IPAddress IP1, IPAddress IP2)
        {
            int ip1 = IP1.ToInteger();
            int ip2 = IP2.ToInteger();
            return (((ip1 - ip2) >> 0x1F) | (int)((uint)(-(ip1 - ip2)) >> 0x1F));
        }

3、IP段的判断

无论是黑名单还是白名单,我们都要实现对IP段的判断,也就是给定一个IP起始地址和结束地址,构成的IP段,我们要判断用户登陆的IP是否在这个区间里面。


       bool ipAccess = BLLFactory<BlackIP>.Instance.ValidateIPAccess(ip, userInfo.ID);
       if (ipAccess)
        {
             ........................
            if (userPassword == userInfo.Password)
            {
               ......................

               //记录用户登录日志
               BLLFactory<LoginLog>.Instance.AddLoginLog(userInfo, systemType, ip, macAddr, "用户登录");
            }
        }
       else
       {
           BLLFactory<LoginLog>.Instance.AddLoginLog(userInfo, systemType, ip, macAddr, "用户登录操作被黑白名单禁止登陆!");
       }

在ValidateIPAccess函数里面,除了白名单优先于黑名单的逻辑外,主要的逻辑判断就是判断指定的IP是否落在IP段里面,这个逻辑可以通过下面的方法进行判断实现。


        /// 检测指定的IP地址是否在两个IP段中
        /// </summary>
        /// <param name="ip">指定的IP地址</param>
        /// <param name="begip">起始ip</param>
        /// <param name="endip">结束ip</param>
        /// <returns></returns>
        public static bool IsInIp(string ip, string begip, string endip)
        {
            int[] inip, begipint, endipint = new int[4];
            inip = GetIp(ip);
            begipint = GetIp(begip);
            endipint = GetIp(endip);
            for (int i = 0; i < 4; i++)
            {
                if (inip[i] < begipint[i] || inip[i] > endipint[i])
                {
                    return false;
                }
                else if (inip[i] > begipint[i] || inip[i] < endipint[i])
                {
                    return true;
                }
            }
            return true;
        }

4、系统登录拦截效果

系统拦截IP登录后,会记录一条日志到登录日志里面,如下所示。

本文转自博客园伍华聪的博客,原文链接:Winform开发框架之权限管理系统改进的经验总结(3)-系统登录黑白名单的实现,如需转载请自行联系原博主。



 

目录
相关文章
|
2月前
|
SQL JSON 缓存
小说系统方案搭建开发,实现系统的用户登录验证说明
本文总结了小说系统源码中常见的身份认证方式,涉及JWT和Shiro。传统的认证流程包括用户提交凭证、服务器保存Session数据、发送Session_id给客户端,后续请求携带Session_id。但这种方式在多服务器或跨域场景下扩展性差。解决方案有Session数据共享或持久化。作者将服务端维护Session信息的认证方式归类为传统方式,反之为非传统方式,后者扩展性更优。文中还介绍了实例项目的SQL建表结构,用于演示认证流程。
|
2月前
|
监控 数据库 数据安全/隐私保护
编写VBScript实现办公室上网监控软件的用户管理功能:权限控制与身份验证
在开发办公室上网监控软件时,用户管理是一个至关重要的功能。通过VBScript,我们可以实现权限控制与身份验证,确保只有授权用户可以访问监控数据,并对其进行管理。
164 1
|
6月前
|
前端开发 项目管理
PMP知识系统(04)- 前端所有界面
PMP知识系统(04)- 前端所有界面
42 0
|
9月前
|
运维 监控 小程序
【运维知识进阶篇】一篇文章带你搞懂Jumperserver(保姆级教程:安装+用户与用户组+创建资产+授权资产+创建数据库+sudo提权+命令过滤+多因子认证+网域功能+审计台)(四)
【运维知识进阶篇】一篇文章带你搞懂Jumperserver(保姆级教程:安装+用户与用户组+创建资产+授权资产+创建数据库+sudo提权+命令过滤+多因子认证+网域功能+审计台)(四)
445 0
|
9月前
|
运维 网络安全 数据库
【运维知识进阶篇】一篇文章带你搞懂Jumperserver(保姆级教程:安装+用户与用户组+创建资产+授权资产+创建数据库+sudo提权+命令过滤+多因子认证+网域功能+审计台)(一)
【运维知识进阶篇】一篇文章带你搞懂Jumperserver(保姆级教程:安装+用户与用户组+创建资产+授权资产+创建数据库+sudo提权+命令过滤+多因子认证+网域功能+审计台)
496 0
|
9月前
|
运维 数据库
【运维知识进阶篇】一篇文章带你搞懂Jumperserver(保姆级教程:安装+用户与用户组+创建资产+授权资产+创建数据库+sudo提权+命令过滤+多因子认证+网域功能+审计台)(三)
【运维知识进阶篇】一篇文章带你搞懂Jumperserver(保姆级教程:安装+用户与用户组+创建资产+授权资产+创建数据库+sudo提权+命令过滤+多因子认证+网域功能+审计台)(三)
128 0
|
9月前
|
运维 数据库 数据安全/隐私保护
【运维知识进阶篇】一篇文章带你搞懂Jumperserver(保姆级教程:安装+用户与用户组+创建资产+授权资产+创建数据库+sudo提权+命令过滤+多因子认证+网域功能+审计台)(二)
【运维知识进阶篇】一篇文章带你搞懂Jumperserver(保姆级教程:安装+用户与用户组+创建资产+授权资产+创建数据库+sudo提权+命令过滤+多因子认证+网域功能+审计台)(二)
112 0
|
10月前
|
Kubernetes 数据安全/隐私保护 容器
【k8s 系列】k8s 学习二十八,k8s 认证和权限控制
说到 k8s 的认证机制,其实之前咋那么也有提到过 ServiceAccouont ,以及相应的 token ,证书 crt,和基于 HTTP 的认证等等
197 0
|
数据安全/隐私保护 开发者 微服务
总结项目功能点(后台系统2)| 学习笔记
快速学习 总结项目功能点(后台系统2)
146 0
|
Android开发
移动应用程序设计基础——用户登录实验
本实验通过实现用户登录界面,使得学员能进一步加深和掌握Android的常用基本控件使用,包括:TextView,EditView、CheckBox、Button、ImageView以及ProgressBar等。 3、 编写Activity代码LoginActivity.java,实现EditView的username、password和CheckBox的issaved控件发现取得; 4、 编写进度条ProgressBar的界面布局progress.xml,放置水平进度条,设置最大值属性为100;
244 0
移动应用程序设计基础——用户登录实验