思路:用户登录验证的时候将用户权限路由存储session,定义方法执行前行为,行为验证当前访问的方法路由是否属于用户所拥有的权限路由。
一、在制作站点权限之前我们需要准备好所需的数据表,数据表如下:(各表字段可酌情加减,视各自站点逻辑而定)
1.admin -- 管理员账户表
image.png
2.role -- 角色表
image.png
3.admin_role -- 管理员角色关系表
image.png
4.role_action -- 角色方法表
image.png
5.admin_action -- 管理员特殊方法表(酌情添加)
image.png
6.action -- 方法表(方法数据通过站点采集而来。ps 采集方法,附上链接:https://www.jianshu.com/p/5e013fcb19aa)
image.png
二、数据表大致准备如上,接下来进行我们的权限验证流程:
1.应用目录下 tags.php(应用行为扩展定义文件) 定义应用操作执行前行为。ps:关于行为,笔者之前讲过:https://www.jianshu.com/p/5bb4ec8189f7
// 应用行为扩展定义文件
return [
// 应用初始化
'app_init' => [],
// 应用开始
'app_begin' => [],
// 模块初始化
'module_init' => [],
// 操作开始执行 注:笔者在 OperateBehavior 中进行权限验证
'action_begin' => ['app\\behavior\\OperateBehavior','app\\behavior\\AccessBehavior'],
// 视图内容过滤
'view_filter' => [],
// 日志写入
'log_write' => [],
//日志写入完成
'log_write_done' => [],
// 应用结束
'app_end' => ['app\\behavior\\LogBehavior'],
];
2.定义OperateBehavior.php行为文件,进行权限验证
image.png
OperateBehavior.php中代码如下:
namespace app\behavior;
use think\Db;
use think\facade\Log;
use think\facade\Session;
use think\Request;
use think\Exception;
use app\facade\ActionModel;
use think\Controller;
class OperateBehavior extends Controller
{
// 定义需要排除的权限路由
protected $exclude = [
'index/index/index',
'admin/login/index',
'admin/login/loginverify',
'admin/login/outlogin',
'admin/login/iebrowsernocompat',
'admin/index/index',
'admin/index/welcome',
'mobile/login/ajaxpswlogin',
'mobile/login/ajaxsmslogin',
'mobile/login/sendsms',
'mobile/login/ajaxupdatepsw',
'mobile/login/ajaxisregister',
'mobile/login/ajaxregister'
];
// 定义未登陆需要排除的权限路由
protected $login = [
'admin/login/index',
'admin/login/loginverify',
'admin/login/iebrowsernocompat',
'admin/index/welcome',
'mobile/login/ajaxpswlogin',
'mobile/login/ajaxsmslogin',
'mobile/login/sendsms',
'mobile/login/ajaxupdatepsw',
'mobile/login/ajaxisregister',
'mobile/login/ajaxregister'
];
// 定义不需要检测权限的模块
protected $moudel = ['union','mobile'];
/**
* 权限验证
* @param Request $Request
*/
public function run(Request $Request)
{
// 行为逻辑
try {
// 获取当前访问路由
$url = $this->getActionUrl($Request);
if(empty(Session::get()) && !in_array($url,$this->login) && !in_array(strtolower($Request->module()), $this->moudel)){
$this->error('请先登录1','/login/index');
}
// 用户所拥有的权限路由
$auth = Session::get('auth.url')?Session::get('auth.url'):[];
if(!$auth && !in_array($url,$this->login) && !in_array($url, $this->exclude) && !in_array(strtolower($Request->module()), $this->moudel)){