123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- <?php
- namespace catchAdmin\permissions\middleware;
- use app\Request;
- use catchAdmin\permissions\model\Permissions;
- use catcher\CatchCacheKeys;
- use catcher\Code;
- use catcher\exceptions\PermissionForbiddenException;
- use think\facade\Cache;
- use catcher\Utils;
- class PermissionsMiddleware
- {
-
- public function handle(Request $request, \Closure $next)
- {
- $rule = $request->rule()->getName();
- if (!$rule) {
- return $next($request);
- }
-
- [$module, $controller, $action] = Utils::parseRule($rule);
-
- if (in_array($module, $this->ignoreModule())) {
- return $next($request);
- }
-
- $user = $request->user();
- if (!$user) {
- throw new PermissionForbiddenException('Login is invalid', Code::LOST_LOGIN);
- }
-
- if (Utils::isSuperAdmin()) {
- return $next($request);
- }
-
- if ($this->allowGet($request)) {
- return $next($request);
- }
-
- $permission = property_exists($request, 'permission') ? $request->permission :
- $this->getPermission($module, $controller, $action);
-
- if (!$permission || !in_array($permission->id, Cache::get(CatchCacheKeys::USER_PERMISSIONS . $user->id))) {
- throw new PermissionForbiddenException();
- }
- return $next($request);
- }
-
- protected function getPermission($module, $controllerName, $action)
- {
- $permissionMark = sprintf('%s@%s', $controllerName, $action);
- return Permissions::where('module', $module)->where('permission_mark', $permissionMark)->find();
- }
-
- protected function ignoreModule()
- {
- return ['login'];
- }
-
- protected function operateEvent($creatorId, $permission)
- {
-
- $permission && event('operateLog', [
- 'creator_id' => $creatorId,
- 'permission' => $permission,
- ]);
- }
-
- protected function allowGet($request)
- {
- if (Utils::isMethodNeedAuth($request->rule()->getName())) {
- return false;
- }
- return $request->isGet() && config('catch.permissions.is_allow_get');
- }
- }
|