|
@@ -5,34 +5,112 @@ namespace app\admin\middleware;
|
|
|
use app\admin\attr\Permission;
|
|
|
use app\common\exception\CatchException;
|
|
|
use app\common\model\Admin;
|
|
|
+use app\common\model\Role;
|
|
|
use think\Request;
|
|
|
|
|
|
class CheckPermissionAttr
|
|
|
{
|
|
|
public function handle(Request $request, \Closure $next)
|
|
|
{
|
|
|
- return $next($request);
|
|
|
|
|
|
$admin = app(Admin::class);
|
|
|
$role = $admin->role;
|
|
|
$codes = $role->codes;
|
|
|
|
|
|
+
|
|
|
+ if (in_array(Role::CODE_SUPER_ADMIN, $codes)) {
|
|
|
+ return $next($request);
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
- $controller = 'app\\admin\\controller\\'. $request->controller();
|
|
|
- $ref = new \ReflectionClass($controller);
|
|
|
+ $controller = $request->controller();
|
|
|
+ $controllerNameSpace = 'app\\admin\\controller\\' . $controller;
|
|
|
+ $ref = new \ReflectionClass($controllerNameSpace);
|
|
|
$attrs = $ref->getAttributes(Permission::class);
|
|
|
+ $methodName = $request->action();
|
|
|
+ $method = $ref->getMethod($methodName);
|
|
|
+ $methodAttrs = $method->getAttributes(Permission::class);
|
|
|
+
|
|
|
+
|
|
|
+ if ($methodAttrs) {
|
|
|
+ foreach ($methodAttrs as $attrRaw) {
|
|
|
+
|
|
|
+ * @var Permission
|
|
|
+ */
|
|
|
+ $attr = $attrRaw->newInstance();
|
|
|
+
|
|
|
+ if ($attr->ignore) {
|
|
|
+ return $next($request);
|
|
|
+ }
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+ * 权限值设置
|
|
|
+ */
|
|
|
+ $permission = $attr->value;
|
|
|
+
|
|
|
+ if ($attr->inherit) {
|
|
|
+ if (count($attrs) > 1) {
|
|
|
+ throw new \InvalidArgumentException('使用了继承权限值,但是controller的权限Attribute不止一个');
|
|
|
+ }
|
|
|
+ $controllerAttr = $attrs[0]->newInstance();
|
|
|
+ $controllerPermission = $controllerAttr->value;
|
|
|
+
|
|
|
+
|
|
|
+ if (!$permission) {
|
|
|
+ if ($controllerAttr->useMethodName) {
|
|
|
+ $permission = "$controllerPermission.$methodName";
|
|
|
+ } else {
|
|
|
+ $permission = $controllerPermission;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+
|
|
|
+ if (!$permission) {
|
|
|
+ if (count($attrs) > 1) {
|
|
|
+ throw new \InvalidArgumentException('没有使用继承,而且权限值为空,尝试使用controller权限值规则,但是controller的权限Attribute不止一个');
|
|
|
+ }
|
|
|
+ $controllerAttr = $attrs[0]->newInstance();
|
|
|
+ $controllerPermission = $controllerAttr->value;
|
|
|
+
|
|
|
+
|
|
|
+ if ($controllerAttr->useMethodName) {
|
|
|
+ $permission = $methodName;
|
|
|
+ } else {
|
|
|
+
|
|
|
+ $permission = strtolower($controller);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ * 检查权限
|
|
|
+ */
|
|
|
+ if (!in_array($permission, $codes)) {
|
|
|
+ throw new CatchException("未具有权限$permission, 禁止访问", 403);
|
|
|
+ }
|
|
|
+
|
|
|
+ return $next($request);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
|
|
|
* @var \ReflectionAttribute $attrRaw
|
|
|
*/
|
|
|
- foreach($attrs as $attrRaw) {
|
|
|
+ foreach ($attrs as $attrRaw) {
|
|
|
|
|
|
* @var Permission
|
|
|
*/
|
|
|
$attr = $attrRaw->newInstance();
|
|
|
$permission = $attr->value;
|
|
|
- if (false && !in_array($permission, $codes)) {
|
|
|
+
|
|
|
+ if ($attr->useMethodName) {
|
|
|
+ $permission = "$permission.$methodName";
|
|
|
+ } elseif (!$permission) {
|
|
|
+
|
|
|
+ $permission = strtolower($controller);
|
|
|
+ }
|
|
|
+ if (!in_array($permission, $codes)) {
|
|
|
throw new CatchException("未具有权限$permission, 禁止访问", 403);
|
|
|
}
|
|
|
}
|