查看: 2408|回复: 0

[PHP实例] thinkPHP5 ACL用户权限模块用法详解

发表于 2018-4-1 10:53:54

本文实例讲述了thinkPHP5 ACL用户权限模块用法。分享给大家供大家参考,具体如下:

最近学习thinkphp5,和以前3.X版本是完全不是一个概念。学习thinkphp5的朋友要注意命名空间思想。

最近做的一个项目,一个检测管理系统,由于为了以后做APP需要,才切换到thinkphp5作为以后的扩展API用的。今天完成的是用户权限控制模块。我把这个mark下来

数据库:

role数据库表:

  1. `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  2. `name` varchar(20) NOT NULL COMMENT '角色名称',
  3. `pid` smallint(6) DEFAULT NULL COMMENT '父角色ID',
  4. `rule_name` text COMMENT '规则唯一英文标识,全小写',
  5. `type` varchar(50) DEFAULT '' COMMENT '权限规则分类,请加应用前缀,如admin_',
  6. `status` tinyint(1) unsigned DEFAULT NULL COMMENT '状态',
  7. `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  8. `create_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
  9. `update_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
  10. `listorder` int(3) NOT NULL DEFAULT '0' COMMENT '排序字段',
复制代码

auth_rule数据库表:

  1. `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '规则id,自增主键',
  2. `module` varchar(20) NOT NULL COMMENT '规则所属module',
  3. `type` varchar(30) NOT NULL DEFAULT '1' COMMENT '权限规则分类,请加应用前缀,如admin_',
  4. `name` varchar(255) NOT NULL DEFAULT '' COMMENT '规则唯一英文标识,全小写',
  5. `param` varchar(255) DEFAULT NULL COMMENT '额外url参数',
  6. `title` varchar(20) NOT NULL DEFAULT '' COMMENT '规则中文描述',
  7. `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否有效(0:无效,1:有效)',
  8. `condition` varchar(300) NOT NULL DEFAULT '' COMMENT '规则附加条件',
复制代码

用户表里面增加:

  1. `pools` varchar(20) DEFAULT '' COMMENT '权限池',
  2. `roleId` smallint(5) NOT NULL DEFAULT '0' COMMENT '权限id',
复制代码

代码如下:

iAuth.php 权限认证的公共库文件

  1. class iAuth{
  2. public $user = null;
  3. //默认配置
  4. protected $_config = array(
  5. );
  6. public function __construct() {
  7. }
  8. /**
  9. * 检查权限
  10. * @param name string|array 需要验证的规则列表,支持逗号分隔的权限规则或索引数组
  11. * @param uid int 认证用户的id
  12. * @param relation string 如果为 'or' 表示满足任一条规则即通过验证;如果为 'and'则表示需满足所有规则才能通过验证
  13. * @return boolean 通过验证返回true;失败返回false
  14. */
  15. public function check($uid,$name,$relation='or') {
  16. if(empty($uid)){
  17. return false;
  18. }
  19. if($uid==1){
  20. return true;
  21. }
  22. if (is_string($name)) {
  23. $name = strtolower($name);
  24. if (strpos($name, ',') !== false) {
  25. $name = explode(',', $name);
  26. } else {
  27. $name = array($name);
  28. }
  29. }
  30. $list = array(); //保存验证通过的规则名
  31. //获取用户信息
  32. $this->getUserInfo($uid);//获取用户信息,一维数组
  33. $groups= $this->user['roleId'];
  34. if(in_array(1, $groups)){
  35. return true;
  36. }
  37. if(empty($groups)){
  38. return false;
  39. }
  40. $rules = self::get_rules($this->user['roleId']);
  41. if(in_array($name,$rules))
  42. {
  43. return true;
  44. }
  45. return false;
  46. }
  47. /**
  48. * 获得用户资料
  49. */
  50. private function getUserInfo(&$uid) {
  51. if(!isset($this->user)){
  52. $user = new Users($uid);
  53. $this->user = $user->fields;
  54. }
  55. return $this->user;
  56. }
  57. /**
  58. * 获取验证规则
  59. * @param int $id
  60. */
  61. public static function get_rules($id)
  62. {
  63. if(empty($id)) return false;
  64. $rules = Cache::get(self::$cache_prefix . $id);
  65. if(empty($rules))
  66. {
  67. $model = Db::name('role');
  68. $model->where('id',$id);
  69. $rules = $model->find();
  70. $rules['rule_name'] = explode(',',strtolower($rules['rule_name']));
  71. //设置缓存
  72. Cache::set(self::$cache_prefix,$rules);
  73. }
  74. return $rules;
  75. }
  76. }
复制代码

Common.php 通用函数类库

  1. /**
  2. * 检测用户id
  3. * @param name string|array 需要验证的规则列表,支持逗号分隔的权限规则或索引数组
  4. * @param uid int 认证用户的id
  5. */
  6. function sp_auth_check($uid, $name=null)
  7. {
  8. if(empty($uid)) return false;
  9. if(empty($name)){
  10. $name=strtolower(MODULE_NAME."/".CONTROLLER_NAME."/".ACTION_NAME);
  11. }
  12. $iAuth_obj = new \app\Common\Lib\iAuth();
  13. return $iAuth_obj->check($uid);
  14. }
复制代码

AdminbaseController.php 后台管理的父控制器类

  1. class AdminbaseController extends Controller
  2. {
  3. public $uid = 0;
  4. //用户实例
  5. public $userObj = null;
  6. /**
  7. * 构造函数
  8. * Adminbase constructor.
  9. */
  10. public function __construct()
  11. {
  12. parent::__construct();
  13. }
  14. public function _initialize()
  15. {
  16. $this->uid = Session::read('AdminId');
  17. if(!empty($this->uid ))
  18. {
  19. //检测过已经登录了
  20. $this->userObj = Db::name('users')->where('uid',$this->uid)->find();
  21. if(!$this->check_access($this->uid))
  22. {
  23. $this->error("您没有访问权限!",Url::build('admin/index/login'));
  24. exit();
  25. }
  26. $this->assign('admin',$this->userObj);
  27. }
  28. else
  29. {
  30. //没有登录的
  31. $this->error("您还没有登录!",Url::build('admin/index/login'));
  32. exit();
  33. }
  34. }
  35. /**
  36. * 检测权限
  37. * @param $uid
  38. */
  39. private function check_access(&$uid)
  40. {
  41. if($uid == 1)
  42. {
  43. //超级管理员
  44. return true;
  45. }
  46. $request = Request::instance();
  47. //如果不是这个应用池的账户也不通过
  48. $pools = explode(',',$this->userObj['pools']);
  49. if(!in_array(strtolower($request->module()), $pools)) return false;
  50. $rule = $request->module() . '_' . $request->controller() . '_' . $request->action() ;
  51. $no_need_check_rules = Config::get('inc_auth.no_need_check_rules');
  52. if(!in_array(strtolower($rule),$no_need_check_rules))
  53. {
  54. //验证权限
  55. return sp_auth_check($uid);
  56. }
  57. else
  58. {
  59. return true;
  60. }
  61. }
  62. }
复制代码

inc_auth.php 认证配置文件

  1. $config['no_need_check_rules'] = array('admin_index_index','admin_index_login');
复制代码

更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》及《PHP模板技术总结》。

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。



回复

使用道具 举报