在项目中很多需要用到权限的地方,整理了些我常用到的权限控制。
1. ip限制及计数
描述:绑定指定的ip可访问,并对ip访问次数记录
流程如下:
1.1) 代码实现如下:
if($user = statistical::check_user($_server[remote_addr])) { $statistical = new statistical($user,$query_flg); //$query_flg为接口的标识 if(!$statistical -> check_visits()) { //验证访问次数是否达到限制 echo '访问次数超过限制!';exit; } //获取数据 $data = getdata(); return $data;} else { //无效用户 echo '无访问权限!';exit;}
1.2)表的关系:
1.3) 说明
check_user()方法即通过ip在ip_maping表中查找用户,若找到对应用户则在user_visit_config表中校验此用户是否还可以访问接口
校验步骤可分为:
1.3.1) 若用户第一次访问,插入记录,设置默认访问次数及有效期
1.3.2) 若不是第一次访问,若未过期:
a.访问次数没有超过当天上限,计数+1
b.访问次数超过当天上限,若为次天,则访问次数重新归1
(注:这里是每天都有固定的次数限制,超过则不可访问,要等到次天重新归1)
1.4)代码片段
/** * 用户检查,根据ip判断用户是否存在 */public static function check_user($ip) { $ipmappingq = new ipmappingquery(); $ipmappingq -> setip($ip); $ipmapping = $ipmappingq -> queryone(); if($ipmapping != null) { return $ipmapping -> user; } return null;}/** * 校验此用户是否可以访问接口 */public function check_visits() { try { $counterq = new counterquery(); $counterq -> setuser($this->user_flg); $counterq -> setinterface_flg($this->flg); if($counterq -> querycount() == 0) { //初次访问,插入记录 //(这是我根据业务实现的一种逻辑,有些时候最好先将用户可访问的接口在数据库中配置好, 若未查询到这个用户对应接口则返回false) $counterinfo = new counterinfo(); $counterinfo -> setuser($this->user_flg); $counterinfo -> setinterface_flg($this->flg); $counterinfo -> setvisits('1'); $counterinfo -> setvisits_limit(default_limit); $counterinfo -> setvalid_date(default_valid); $counterinfo -> setinsert_time(comfunction::getnowdatetime()); $counterinfo -> setupdate_time(comfunction::getnowdatetime()); $counterinfo -> save(); return true; }else { $counter = $counterq -> queryone(); if(comfunction::comparedatetimestr(comfunction::adddate($counter->getinsert_time(), $counter->getvalid_time()), $counter->getupdate_time(), '>=')) { //判断是否过期 if($counter -> getvisits() getvisits_limit()) { $counter -> setvisits($counter->getvisits()+1); $counter -> setupdate_time(comfunction::getnowdatetime()); $counter -> save(); return true; }else { $last_update_date = substr($counter -> getupdate_time(),0,10); if(comfunction::comparedatetimestr(comfunction::nowdate(), $last_update_date, ' setvisits('1'); $counter -> setupdate_time(comfunction::getnowdatetime()); $counter -> save(); return true; } } } } } catch (exception $e) { return false; } return false;}
2. 根据用户权限加载相应的模块
描述:即可指定不同的用户查看不同的功能模块。
需求:现在有一个树状的功能模块列表,每个模块都有一个对于的id,有3种角色:超级管理员,普通管理员,一般用户;可通过配置指定角色查看指定的功能,每种角色可有多个用户。
先说说思路:有一个用户表,用户登录成功后,根据其用户名查找出用户所在用户组,根据此用户组找到此用户组可查看的模块id列表,最后根据模块id加载模块。
表的设计:
同样,在做接口权限访问时也可以使用此思路,即指定某个用户组可访问指定的方法,
新建一个用户组user_group1, 将可访问的方法名(对应model_id)录入到数据库,再为这个用户组生成一个密钥(对应user_name,user_pwd), 用户可通过此密钥访问对应的方法。
原文地址:web服务端权限控制, 感谢原作者分享。
