php-ip 做ip免登录 兼容ipv4&ipv6

FIRST STEP

最近项目遇到IP免登录的需求,在这里记录一下。
基本流程是:用户请求接口>>接口会统一进行登录和ip校验>>是否存在预先存储在数据库里的ip。

创建一个类,这个类_initialize中编写校验token的方法,校验失败则执行ip校验.

class Base
{
	 public function _initialize()
	 {
	        parent::_initialize();
	        //身份验证
	        $result = Auth::check_user('users');
	        if(empty($result['status'])){
	              return $result;
	         }else{
	         	// 进行ip校验
	         }
	  }
 }

SECOND STEP

接下来就是安装需要的环境啦,因为是我们需要php-ip来进行ip的校验等工作,所以我们需要安装到一个PHP扩展:GMP。

GMP 扩展安装

windows

# 在php.int 文件把前面的分号去掉
old  ;extension=php_gmp.dll
new extension=php_gmp.dll

Linux

# 进入您的liunx
wget https://gitee.com/lonely/php-src-zh_cn-doc/repository/archive/master.zip
unzip master.zip
cd php-src-zh_cn-doc/etc/gmp/

# 编译
phpize
find / -name "php-config" # 找到你的php-config文件
/usr/local/php/bin/php-config # 下面要用的
./configure --with-php-conifg=上面的复制到这里
make && make install

composer 安装php-ip

进入你的php项目根目录,然后输入一下命令:

composer require rlanvin/php-ip

我这里使用yaf给大家演示

<?php
/**
 * @name IndexController
 * @author XXX
 * @desc 默认控制器
 * @see http://www.php.net/manual/en/class.yaf-controller-abstract.php
 */
class IndexController extends Yaf_Controller_Abstract {

	public function indexAction() {
        $tmp = new IpModel();
        $block = $tmp->index();
		echo $block->getMask(); // ffff:ffff::
		echo "<br/>";
		echo $block->getDelta(); // ::ffff:ffff:ffff:ffff:ffff:ffff
		echo "<br/>";
		echo $block->getFirstIp(); // 2001:db8::
		echo "<br/>";
		echo $block->getLastIp(); // 2001:db8:ffff:ffff:ffff:ffff:ffff:ffff
		echo "<br/>";
		echo $block->getNbAddresses(); // '79228162514264337593543950336'
	}
}
<?php
/**
 * @name IpModel
 * @author XXX
 * @desc Model
 * @see http://www.php.net/manual/en/class.yaf-controller-abstract.php
 */
require __DIR__ . '/../../vendor/autoload.php';
use PhpIP\IPv6Block;
use PhpIP\IPv6;

class IpModel {
	public function index()
	{
		return new PhpIP\IPv6Block('2001:0:0000:0000:0000:0000:0000:0000/32');
	}
	/**
     * 验证IP地址
     * @param  string  $value [ipv6]
     * @return boolean        [string]
     */
    public static function isIP($value = '')
    {
        try {
            if (strpos($value, "/")) {
                $res =  IPv6Block::create($value)->getVersion();
            } else {
                $res =  IPv6::create($value)->getVersion();
            }
            // 返回结果
            return $res;
        } catch (\InvalidArgumentException $e) {
            // 如果捕获到这不是一个合法的ip段就给ip
            return false;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值