PHP中多IP段权限控制方案

  在某些项目中我们可能会用到根据IP段进行权限校验,比如不在我们配置的IP段内的用户访问某些页面或功能模块时,将提示其权限不够并禁止访问该页面的内容。鉴于项目中需求各异,下面只说下大致思路以及我个人的实现方式:

1. 在一个功能模块设计之初,我们应该让它尽可能易于配置,易于使用,易于应用到更多场景中,这里我们采用配置和校验函数分离的方式,将权限校验的代码都写在一个依赖配置数组能独立运行的函数中。

2. 我的思路是多IP段校验过程中,如果被校验的IP不在配置项的所有IP段中,则返回false, 禁止访问,如果被校验的IP在配置项的任意一项中,则终止校验,返回true,允许访问。

3. 我们在每一个IP段的校验中,依次对这一个IP段的四个部分进行校验,如果第一部分正确,则继续校验第二部分,如果遇到校验不通过的部分,则中止这个IP段的校验,进入下一个IP段的校验,如果这一个IP段的四部分校验都通过,则该IP段的校验通过,不再对接下来的其他IP段进行校验,返回true,允许访问。

有点绕?没事,话不重要,看代码:

 1 <?php 
 2 function IpAuth($ip, $config){
 3     $ipArr = explode(".", $ip);
 4     for ( $i=0; $i<count($config); $i++ ){
 5         $ips = explode(".", $config[$i]['start']);
 6         $ipe = explode(".", $config[$i]['end']);
 7         for( $j=0; $j<4; $j++ ){
 8             if( $ips[$j]==$ipArr[$j] || $ipArr[$j]==$ipe[$j] ){
 9                 if($j == 3){
10                     return true;
11                 }else{
12                     continue;
13                 }
14             }else if( $ips[$j]<$ipArr[$j] && $ipArr[$j]<$ipe[$j] ){
15                 return true;
16             }else{
17                 continue 2;
18             }
19         }
20     }
21     return false;
22 }
23  ?>

4. 配置文件示例如下:

1 <?php
2 $ip_config = array(
3     array("start" => '120.11.11.11', "end" => '120.255.255.255'),
4     array("start" => '127.0.0.1', "end" => '127.0.255.255')
5 );
6 
7 ?>

5. php获取访问者IP字段方法:

 1 $ip = $_SERVER['REMOTE_ADDR']; 

6. 调用方式:

 1 $result = IpAuth($ip, $ip_config);

返回true为校验通过,返回false为校验不通过

posted @ 2016-12-07 21:03  fullStack-yang  阅读(1079)  评论(0编辑  收藏  举报