一个常规的后台管理系统,后台未登入拦截是最基本的也是最常见的功能之一,然后在稍微复杂一点的是根据用户的权限的不同,能访问的内容也是不一样的,其本质是在数据库中建立一张url表,给每个用户分配不同的权限字段,然后该字段可以填写是url表里面能访问的id值,具体的自己设置.
那如果实现这个功能呢,其实也是非常简单的,我们可以利用面向对象的继承的特性,在控制器中先继承我们自己的定义的类,但是有人会问了,那系统的本身的基类呢,其实很简单,我们自己穿件的类继承系统的类就好了,下面是我实现的主要代码,
我自己创建了一个基类,命名为CheckLogin,然后用use导入,这个基类随便放到哪里,但是一定要跟你的use后面的导入对应起来,然后我在controller目录下面创建了一个名为CheckLogin.php的文件,文件的具体内容就是实现未登入拦截和权限控制的:
<?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";
}
}
网友评论