apeblog/app/admin/controller/AuthController.php

170 lines
4.1 KiB
PHP

<?php
namespace app\admin\controller;
use app\admin\model\AdminAuth;
use app\admin\model\AdminRole;
use think\facade\App;
use think\facade\Lang;
use think\facade\Session;
/**
* 控制器基础类
*/
abstract class AuthController extends SystemBasic
{
/**
* model
* @var
*/
protected $model = null;
/**
* 当前登陆管理员信息
* @var
*/
protected $adminInfo;
/**
* 当前登陆管理员ID
* @var int
*/
protected $adminId;
/**
* 当前管理员权限
* @var array
*/
protected $auth = [];
/**
* 当前权限id
* @var int
*/
protected $nowAuthId = 0;
/**
* 无需登录的方法,同时也就不需要鉴权了
* @var array
*/
protected $noNeedLogin = [];
/**
* 无需鉴权的方法,但需要登录
* @var array
*/
protected $noNeedRight = [];
/**
* 无需记录日志
* @var array
*/
protected $noNeedLog = [];
/**
* 当前模块
* @var string
*/
private $module = "";
/**
* 当前控制器
* @var string
*/
private $controller = "";
/**
* 当前方法名
* @var string
*/
private $action = "";
/**
* Trait
*/
use TemplateTrait;
/**
* 初始化
*/
protected function initialize()
{
parent::initialize(); // TODO: Change the autogenerated stub
$this->adminInfo = Session::get("adminInfo");
$this->adminId = Session::get("adminId");
$this->module = App::getInstance()->http->getName();
$this->controller = un_camelize($this->request->controller());
$this->action = $this->request->action();
$this->auth = explode(",", AdminRole::getAuth($this->adminInfo['role_id'] ?? 0));
$this->nowAuthId = AdminAuth::getAuthId($this->module,$this->controller,$this->action);
$this->model = $this->buildModel($this->module,$this->request->controller());
// 鉴权
$this->checkAuth();
// 多语言
$this->loadLang();
// 日志
$this->createLog();
}
/**
* 检验权限
*/
protected function checkAuth()
{
// 不需要登录
if (in_array($this->action,$this->noNeedLogin) || $this->noNeedLogin == ['*'] || $this->noNeedLogin == "*") return true;
// 验证登录
if (!self::isActive()) exit($this->failedNotice(lang("未登录"),"/admin/login/login"));
// 权限验证
if ($this->nowAuthId == -1 || in_array($this->nowAuthId,$this->auth)) return true;
exit($this->failed(lang('没有权限!')));
}
/**
* 加载语言文件
*/
protected function loadLang()
{
Lang::load(App::getRootPath() . 'app/' . $this->module . '/lang/' . Lang::getLangSet() . '/' . $this->controller . '.php');
}
/**
* 验证登录
* @return bool
*/
protected static function isActive()
{
return Session::has('adminId') && Session::has('adminInfo');
}
/**
* 记录日志
* @return bool
*/
protected function createLog()
{
// 不需要登录不能记录日志
if (in_array($this->action,$this->noNeedLogin) || $this->noNeedLogin == ['*'] || $this->noNeedLogin == "*") return true;
// 无需记录日志
if (in_array($this->action,$this->noNeedLog) || $this->noNeedLog == ['*'] || $this->noNeedLog == "*") return true;
// 有操作权限,记录日志
if (in_array($this->nowAuthId,$this->auth)) event("AdminLog",[$this->adminInfo,$this->module,$this->controller,$this->action]);
return false;
}
/**
* 生成model路径
* @param string $module
* @param string $controller
* @return object|\think\App|null
*/
protected function buildModel(string $module, string $controller)
{
$path = explode(".", $this->request->controller());
$modelPath = "app\\{$this->module}\\model";
foreach ($path as $v) $modelPath .= "\\".$v;
if (class_exists($modelPath)) return app($modelPath);
return null;
}
}