在一般的权限系统里面,可能经常会看到系统的黑名单或者白名单的拦截功能。在一般权限系统里面,常见的黑名单就是禁止用户在某些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. HLS视频点播&直播初探

    前端可选的视频直播协议大致只有两种: RTMP(Real Time Messaging Protocol) HLS(HTTP Live Streaming) 其中RTMP是Adobe开发的协议,无法在 ...

  2. bash的循环中无法保存变量

    在bash中,如果循环在一个子shell中运行,那么在循环中对循环外面的变量的更改将在循环退出后不可见.像下面的例子: #!/bin/sh python run.py | while read lin ...

  3. ubuntu tomcat 部署java web

    1,安装jdk apt-get install openjdk-7-jdk 2,下载tomcat.解压到对应的文件夹 3,将xxx.war放入到 tomcat下的  webapp目录下(此目录下不要有 ...

  4. typeof instanceof 之间的区别总结

        typeof   它返回值是一个字符串,该字符串说明运算数的类型. a=1; b=true; c="c"; d=function(){ console.log(" ...

  5. 关于WPF的退出

    如果你在创建项目的时候细心的查看一下项目的结构,你会发现里面有一个App.xaml,一见到App我们知道是应用程序的关键了配置了,当然,WPF的启动窗体也在这里面设置的. 我们可以在App的中配置启动 ...

  6. 三种ViewController跳转的异同

    - (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag comple ...

  7. 提高Java代码质量:使用枚举定义常量(转)

    一.分析  常量的声明是每一个项目中不可或缺的,在Java1.5之前,我们只有两种方式的声明:类常量和接口常量.不过,在1.5版之后有了改进,即新增了一种常量声明方式,枚举常量.代码如下: enum ...

  8. MAC 入门

    1.安装java jdk eclipse 后发现运行不了,原因是JAVA_HOME 没有设置,真操蛋 export JAVA_HOME=`/usr/libexec/java_home` 2.安装bre ...

  9. adb permission denied

    1.没有得到root权限,可以用刷机精灵一键root. 2.root不彻底,手机安装超级adbd,即可.

  10. Java 停止一个 Thread

    boolean   flag=true;         public   void   run(){             while(flag){                     ... ...