在一般的权限系统里面,可能经常会看到系统的黑名单或者白名单的拦截功能。在一般权限系统里面,常见的黑名单就是禁止用户在某些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 == )
{
MessageDxUtil.ShowTips("请输入显示名称");
this.txtName.Focus();
result = false;
}
else if (this.txtAuthorizeType.Text.Length == )
{
MessageDxUtil.ShowTips("请选择授权类型");
this.txtAuthorizeType.Focus();
result = false;
}
else if (this.txtIPStart.Text.Length == )
{
MessageDxUtil.ShowTips("请输入IP起始地址");
this.txtIPStart.Focus();
result = false;
}
else if (this.txtIPEnd.Text.Length == )
{
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) == )
{
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 = ; byte[] bytes = IP.GetAddressBytes();
result = (int)(bytes[] << | bytes[] << | bytes[] << | bytes[]); 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[];
inip = GetIp(ip);
begipint = GetIp(begip);
endipint = GetIp(endip);
for (int i = ; i < ; 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)-系统登录黑白名单的实现的更多相关文章

  1. Winform开发框架之权限管理系统改进的经验总结(2)-用户选择界面的设计

    在上篇总结随笔<Winform开发框架之权限管理系统改进的经验总结(1)-TreeListLookupEdit控件的使用>介绍了权限管理模块的用户管理部分,其中主要介绍了其中的用户所属公司 ...

  2. Winform开发框架之权限管理系统改进的经验总结(1)-TreeListLookupEdit控件的使用

    最近一直在做一些技术性的研究和框架改进工作,博客也落下好几天没有更新了,也该是时候静下心来,总结这段时间的一些技术改进的经验了.和上一阶段的CRM系统开发和技术研究一样,我都喜欢在一个项目或者模块完成 ...

  3. Winform开发框架之权限管理系统改进的经验总结(4)-一行代码实现表操作日志记录

    在前面介绍了几篇关于我的权限系统改进的一些经验总结,本篇继续这一系列主体,介绍如何一行代码实现重要表的操作日志记录.我们知道,在很多业务系统里面,数据是很敏感的,特别对于一些增加.修改.删除等关键的操 ...

  4. Winform开发框架之权限管理系统改进的经验总结(4)--用户分级管理

    在实际的系统应用环境中,用户的分级管理一般也是比较常见的功能,小的业务系统可以不需要,但是一般涉及到集团.分子公司.或者是事业单位里面的各个处室或者某某局的人员管理,这些分级管理就显得比较必要,否则单 ...

  5. Winform开发框架之权限管理系统的改进

    权限管理系统,一直是很多Mis系统和一些常见的管理系统所需要的,所以一般可以作为独立的模块进行开发,需要的时候进行整合即可,不需要每次从头开发,除非特殊的系统需求.我在Winform开发框架介绍中的随 ...

  6. Winform开发框架之权限管理系统

    本文章转载:http://www.cnblogs.com/wuhuacong/archive/2011/05/08/2040620.html 至此,权限管理模块介绍已经完毕,下面给出一个调用例子Dem ...

  7. Winform开发框架之权限管理系统功能介绍

    权限管理系统的重要特性总结: 1) 高度集成的权限系统.独立模块,能快速整合使用.2) 符合权限的国际通用标准,基于RBAC(基于角色的访问控制)的角色权限控制.3) 多数据库架构支持,内置支持Sql ...

  8. Web开发框架之权限管理系统

    Web开发框架之权限管理系统 记得我在很早之前,开始介绍我的Winform开发框架和我的WCF开发框架之初,我曾经给出下面的视图,介绍我整理的一个框架体系,其中包含有WInform开发框架以及我的We ...

  9. ASP.NET MVC4.0+ WebAPI+EasyUI+KnockOutJS快速开发框架 通用权限管理系统

    1.基于 ASP.NET MVC4.0 + WebAPI + EasyUI + Knockout 的架构设计开发 2.采用MVC的框架模式,具有耦合性低.重用性高.生命周期成本低.可维护性高.有利软件 ...

随机推荐

  1. Code First 中使用 ForeignKey指定外键时总是显示未引用

    Code First 中使用 ForeignKey指定外键时总是显示未引用 原因是:开发环境是在.NET 4.0 修改项目,改为.net 4.5

  2. 通过 SSH 隧道方式图形化连接 AIX 服务器

    跳转到主要内容 登录 (或注册) 中文 [userid] IBM ID: 密码: 保持登录. 单击提交则表示您同意developerWorks 的条款和条件. 查看条款和条件. 需要一个 IBM ID ...

  3. ECSHOP安装百度编辑UEditor教程

    ECSHOP系统自带的编辑器大家用过都知道,难用不说,还不能批量上传图片.很多朋友都喜欢百度编辑器,因为百度编辑器功能强大,使用方便,而且不会生成太多多余代码.网上有许多ECSHOP整合百度编辑器的教 ...

  4. CentOS 7.2 搭建 Ghost 博客

    因为平时记录一些文档或想法基本使用 markdown 的语法,Mac 下推荐一款 markdown 的编辑器 Haroopad:上周无意发现 Ghost 有支持 Mac 的桌面版本了,并且同样开源 h ...

  5. 云计算相关的一些概念Baas、Saas、Iaas、Paas

    BaaS(后端即服务:Backend as a Service)公司为移动应用开发者提供整合云后端的边界服务. SaaS(软件即服务:Software as a Service)提供了完整的可直接使用 ...

  6. 使用WebApi时Post和Put的区别

    简单的说Post是添加,Put是修改 吃不准的话,尝试用相同参数访问二次接口,结果不同的是Post(会产生多条记录),结果相同的是Put(仅为一条记录),例如:写博客就是Post:更新签名就是Put

  7. solr searcher

    solr searcher 前面我配置好了solr,并且数据库建立索引也完成了. 为php添加搜索 首先下载solrphp http://wiki.apache.org/solr/SolPHP 在so ...

  8. Objective-C学习备忘录:Clang编译器编译运行Objective-C代码

    我们都知道可以通过Apple公司的Xcode工具来学习Objective-C编程语言,但是能不能脱离XCode这个IDE进行Objective-C学习呢?当然是可以的.首先作为计算机科班出身的程序员都 ...

  9. uniGUI试用笔记(十五)通过URL控制参数

    通过URL代入参数,在代码中读取,如: http://localhost:8501/?ServerPort=212&&ServerIP=192.168.31.12 在代码中可以通过: ...

  10. 使用 Portable Class Library(可移植类库)开发 Universal Windows App

    今天在这里跟大家聊聊关于 Windows Universal 应用夸平台的问题,首先Universal Windows App的定义相信大家已经有所了解了(如果你是一个刚刚接触 Universal A ...