分享

Thinkphp auth 权限控制

发布于:2021-03-15    评论次数:0    阅读次数:131

一. 权限介绍

所谓权限控制,大部分是在管理后台上使用。比如超级管理员登录,会得到所有操作的控制权;认证专员,只能给会员做认证操作;审核专员,只能操作内容的审核、删除、加精等操作,以此类推。那么 ThinkPHP 提供了一个内置的 Auth.class.php 类来实现权限控制,这个类提供了三个表:think_auth_rule(认证规则表)、think_auth_group(用户组表)、think_auth_group_access(用户和组对应关系表)。当然还要结合自己创建的用户表进行对应即可

二. 简单登录

第一步:在 Admin 模块下创建一个  IndexController.class.php (默认就有了),创建 index 方法,输出一句话即可。

namespace Admin\Controller;
use Common\Controller\AuthController;
class IndexController extends AuthController {
    public function index(){
        echo '后台首页!';
    }
}

这是通过 URL 访问: http://localhost/demo39/Admin/Index/index ,即可访问。

第二步:在 Weibo 根目录下的 Common 公共模块下创建 Controller 文件夹,并在里面创建一个  AuthController.class.php  类,这个类用于权限控制。

namespace Common\Controller;
use Think\Controller;
use Think\Auth;
class AuthController  extends Controller {
   protected function _initialize() {
   $auth = new Auth();
   if(!$auth->check()) {
     $this->error('没有权限');
      }
    }
  }

这里使用的方法固定为: _initialize() 。由于  AuthController.class.php  继承了Controller  类,所以,第一步的 Index 类改为继承它。 check() 函数是调用了 ThinkPHP/Library/Think/Auth.class.php 内部的 check() 函数。

namespace Admin\Controller;
use Common\Controller\AuthController;
 class IndexController  extends AuthController {
 public  function index() {
 echo '后台首页!';
  }
}

此时,我们再访问后台首页的时候,已经没有权限了。主要是 $auth->check() 验证无法通过的原因。

第三步:创建一个 WeiBo/Admin/Controller/LoginController.class.php   ,模版为  index.html 。在 WeiBo/Admin/View/Login/index.html 中写入登录代码:

<p>三个用户:admin为超级管理员,所有权限;test测试用户,没有权限;guest游客,只有登录权限。</p>
<form method="post" action="{:U('index')}">
     <p>用户名:<input type="text" name="user" /></p>
     <p><input type="submit" value="登录" /></p>
</form>

在 WeiBo/Admin/Controller/LoginController.class.php 中写入代码:

<?php
namespace Admin\Controller;
use Think\Controller;
class LoginCOntroller extends Controller{
    public function index() {
        if(IS_POST) {
            $login = array();
            switch(I('user',null,false)) {
                case 'admin':
                  $login['uid']=1;
                  $login['user']='admin';
                  break;
                case 'test':
                  $login['uid']=2;
                  $login['user']='test';
                  break;
                case 'guest':
                  $login['uid']=3;
                  $login['user']='guest';
                  break;
                default:
                  $this->error('登陆用户不存在');
                }
                if(count($login)) {
                    session('auth',$login);
                    $this->success('登陆成功',U('Index/index'));
                }
            }else {
                $this->display();
            }
        }
        public function logout() {
            session('[destroy]');
            $this->success('退出成功',U('Login/index'));
        }
    }

这里登录的 LoginController.class.php 类只要继承 Controller 即可,否则无法运行。因为继承 AuthController 类的是需要权限控制的类。

这里加了个 logout() 函数,就是在后台主页要退出的函数:在 WeiBo/Admin/Controller/IndexController.class.php 中完善登出的功能:

<?php
namespace Admin\Controller;
use Common\Controller\AuthController;
class IndexController extends AuthController {
    public function index(){
        echo '后台首页!';
        echo '<a href="'.U('Login/logout').'">退出</a>';
    }
}

第四步:完善 AuthController 类的权限验证过程。

<?php
namespace Common\Controller;
use Think\Controller;
use Think\Auth;
class AuthController extends Controller {
    protected function _initialize() {
        $sess_auth=session('auth');
        if(!$sess_auth) {
            $this->error('非法访问,正在跳转登录页面',U('Login/index'));
        }
        if($sess_auth['uid']==1) {
            return true;
        }
        $auth = new Auth();
        if(!$auth->check( MODULE_NAME.'/'.CONTROLLER_NAME.'/'.ACTION_NAME,$sess_auth['uid'])) {
            $this->error('没有权限',U('Login/logout'));
        }
    }
}

最后的check()判定函数中的 MODULE_NAME.'/'.CONTROLLER_NAME.'/'.ACTION_NAME 其实在本例子中是 Admin/Index/index ,但由于这个权限规则可能不是固定的,所以用 MODULE_NAME.'/'.CONTROLLER_NAME.'/'.ACTION_NAME 会通用一点。

check()这个函数是调用的 ThinkPHP/Library/Think/Auth.class.php 中的,括号里面的参数在check()函数前面的注释里有介绍

如果 $sess_auth['uid']==1 则判定为: true ,这时就不会执行下面的 !$auth->check() 函数了,这个check()函数是当不是admin用户时,则判定为没有权限

最后再写一些数据库中的操作是怎样的,在 ThinkPHP/Library/Think/Auth.class.php 中可以看到已经写好了sql语句,可以用来增加数据库,复制后在数据库中粘贴就行,效果如下图:

 think_auth_rule  

name是授权给用户访问的页面

视频中的权限是 Admin/Index/index 

title写的是后台首页

此时id默认是1,这里id是需要认证的规则


think_auth_group 

title上写的是默认管理组

status默认是1

给rules设置为1,但是以后还是会设置第2,第3,第4,第5个权限,所以可以设置为1,2,3,4,5...,这时默认管理组就有这些权限,


这些权限就是  think_auth_rule 中的id,因为这些id对应了后面的name,name就是可以访问的权限 这些权限就会分配给 think_auth_group_access ,


think_auth_group_access 中的uid就是程序登录是的  WeiBo/Admin/Controller/LoginController.class.php 中的  $login['uid'] 中的值,这里的 group_id 就是 think_auth_group 中的id.

如果你没修改auth_rule,auth_group,auth_group_access表名称的话,只要配置你的会员表即可。在配置项中增加以下配置项:

//Auth配置
    'AUTH_CONFIG' => array(
        // 用户组数据表名
        //'AUTH_GROUP' => 'tp_group',
        // 用户-用户组关系表
        //'AUTH_GROUP_ACCESS' => 'tp_group_access',
        // 权限规则表
        //'AUTH_RULE' => 'tp_rule',
        // 用户信息表
        'AUTH_USER' => 'tp_admin'
    ),

你可以写一个公共方法,把auth认证写到方法里面 方便调用!


推荐教程
查看更多

评论(0)

后面还有条评论,点击查看>>

相关教程

1

php+JAVASCRIPT 实现BLOB加密视频

2020-08-05   浏览:247

2

Thinkphp3.2.3多语言翻译以及使用百度翻译

2020-05-27   浏览:206

3

MySQL 连接的使用

2020-05-27   浏览:196

4

php - 二维数组转一维数组总结

2020-06-09   浏览:183

5

Thinkphp 3.2.3 addAll方法的坑

2020-06-30   浏览:178

6

DTCMS循环调用多级子栏目-如顶级栏目下二级、三级栏目

2020-06-04   浏览:169

7

DTCMS模板标签大全二

2020-06-04   浏览:165

8

根据经纬度 计算距离 (sql 附近商家 根据距离 筛选)

2020-06-22   浏览:159

9

DTCMS模板标签大全三

2020-06-04   浏览:155

嘿,我来帮您!