权限管理

权限配置

理论上,菜单配置就是权限配置,权限我们采用的是自己开发的Auth权限,并且我们实现了私有权限公有权限的管理

其次你的菜单的地址例如:/system/Category/index 他的类型为菜单形式、用于展示的菜单,请勿设置类型错误

我们这里的权限分为Admin应用权限和Index应用权限,需要注意的是Index并未实现菜单权限;如果有需要可以利用扩展类自行实现

后端鉴权

swiftadmin 框架后端鉴权采用经典的auth权限鉴定方案,之所以选择这个方案是因为这个方案足以应付大多数情况下的基本鉴权操作!

在基类中我们有定义以下两个属性

protected $noNeedAuth = []; // 非鉴权的方法,也就不需要登录
// 请注意,这里的控制器并未转换成小写
// 因为在Linux下大小写敏感 所以在添加的时候,请严格按照文件名添加
// 例如我的控制为User,填写/user/index为首页。如果控制器为UserGroup 则菜单填写/userGroup/index为首页
$this->controller = request()->controller();
$this->action = request()->action(true);
$this->method = '/' . strtolower($this->controller) . '/' . $this->action;

// 获取权限列表
$class = new \ReflectionClass($request->controller);
$properties = $class->getDefaultProperties();
$this->noNeedLogin = $properties['noNeedLogin'] ?? $this->noNeedLogin;
// 开始校验菜单权限
$authService = AuthService::instance();
if (!in_array('*', $this->noNeedLogin)
	&& !in_array(strtolower($method), array_map('strtolower', $this->noNeedLogin))) {
	$superAdmin = $authService->superAdmin();
	if (!$superAdmin && !$authService->permissions($method, $AdminLogin['id'])) {
		return request()->isAjax() ? json(['code' => 101, 'msg' => '没有权限']) : $this->abortPage('没有权限!', 401);
	}
}

如果你需要更详细的鉴权操作,则需要自己进行代码的部分逻辑重构!后端鉴权默认会在基础控制器进行权限鉴定操作,如果没有权限则会返回 JSON格式信息或抛出一个403权限异常页面!

前端鉴权

swiftadmin 前端使用javascript判断路由节点进行鉴权,在用户登录后会从后端请求菜单项以及权限节点,我们可以使用lay-auth来进行js鉴权

如果没有这个元素的权限,比如按钮,click交互,则会将这个节点隐藏或者移除、但是在某些情况下,我们可能编辑和添加是一个按钮或者click元素,

那么在用户点击编辑或者执行ajax操作的时候,会首先在前端进行递归匹配权限,如果没有匹配到,则交由PHP后端去处理权限的校验

<!-- // 列表工具栏 -->
<script type="text/html" id="tableBar">
    <a class="layui-table-text" data-title="{:__('编辑会员')}" lay-auth data-url="#editforms" lay-event="edit">{:__('编辑')}</a>
    <div class="layui-divider layui-divider-vertical"></div>
    <a class="layui-table-text" data-url="{:url('/system/User/del')}?id={{d.id}}" lay-event="del">{:__('删除')}</a>
</script>

PHP鉴权函数

有些时候,我们可能需要将一个block作为鉴权的元素,这时候使用js去实现就有点麻烦,所以我们编写了has_admin_auth函数来实现

具体的使用方法参考下列HTML代码。 这样可以实现很多比较大的区块;

<!-- // 列表编辑框 -->
<script type="text/html" id="tableBar">
    <if (has_admin_auth(url("/system/admin/edit")))>
        <a class="layui-table-text" data-title="{:__('编辑')} {{d.name}}" callback="edits" data-url="#adminforms" data-area="690px,500px" lay-event="edit" >{:__('编辑')}</a>
        <div class="layui-divider layui-divider-vertical"></div>
    </if>
    <a class="layui-table-text" data-title="{:__('访问权限')}"
        callback="rulecates" data-url="#authForms" data-area="300px,80%" lay-event="rules" >{:__('权限')}</a>
    <div class="layui-divider layui-divider-vertical"></div>
    <a class="layui-table-text" data-title="{:__('栏目授权')}" 
        callback="rulecates" data-url="#authForms" data-area="300px,80%" lay-event="cates" >{:__('栏目')}</a>
    <div class="layui-divider layui-divider-vertical"></div>
    <a class="layui-table-text" data-url="{:url('/system/admin/del')}?id={{d.id}}" lay-event="del" >{:__('删除')}</a>
</script>
最后更新时间:2023-08-07 16:56:316994
https://doc.swiftadmin.net/help/9.html