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;
}
}
}