Thinkphp5后台未登入拦截和权限控制

    一个常规的后台管理系统,后台未登入拦截是最基本的也是最常见的功能之一,然后在稍微复杂一点的是根据用户的权限的不同,能访问的内容也是不一样的,其本质是在数据库中建立一张url表,给每个用户分配不同的权限字段,然后该字段可以填写是url表里面能访问的id值,具体的自己设置.

    那如果实现这个功能呢,其实也是非常简单的,我们可以利用面向对象的继承的特性,在控制器中先继承我们自己的定义的类,但是有人会问了,那系统的本身的基类呢,其实很简单,我们自己穿件的类继承系统的类就好了,下面是我实现的主要代码,

我自己创建了一个基类,命名为CheckLogin,然后用use导入,这个基类随便放到哪里,但是一定要跟你的use后面的导入对应起来,然后我在controller目录下面创建了一个名为CheckLogin.php的文件,文件的具体内容就是实现未登入拦截和权限控制的:



namespace app\admin\controller;

use think\Session;

use think\Controller;

use think\Db;

class CheckLogin extends Controller

{

    protected $module;

    protected $controller;

    protected $action;

    protected function _initialize() {

        $request=  \think\Request::instance();

        $this->controller = $request->controller();

        $this->module = $request->module();

        $this->action = $request->action();

         if (empty(Session('username'))) {

            $this->error('请先登录', 'Login/index', 1);

        }else{

            $username = Session::get('username');

            $this->assign('username',$username);

            $urls  =  Db::table('admin')->where(['username'=>$username])->value('urls');

            //权限检测

            $power = $this->check_power($urls);

            if($power != "OK"){

                $this->error('你没有权限访问');

            }

        }

    }

    //权限检查

    protected function check_power($urls)

    {

        $action = $this->action;  //方法名

        $module = $this->module;  //模块名

        $controller = $this->controller;  //控制器名

        $urls_one = strtolower($controller.'/'.$action);

        $data = explode(',', $urls);

        $urls_id = Db::table('urls')->where(['url'=>$urls_one])->value('id');

        if($urls_id){

            if(in_array($urls_id,$data)){

                return "OK";

            }else{

                return "NO";

            }

        }else{

            return "OK";

        }

    }

你可能感兴趣的:(Thinkphp5后台未登入拦截和权限控制)