From d06e4a1d489f2071b44c1cd7c87b6a3374c98020 Mon Sep 17 00:00:00 2001 From: Dmitriy Simushev Date: Tue, 20 May 2014 11:04:47 +0000 Subject: [PATCH] Add access check based on permissions --- .../AccessControl/Check/PermissionsCheck.php | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 src/mibew/libs/classes/Mibew/AccessControl/Check/PermissionsCheck.php diff --git a/src/mibew/libs/classes/Mibew/AccessControl/Check/PermissionsCheck.php b/src/mibew/libs/classes/Mibew/AccessControl/Check/PermissionsCheck.php new file mode 100644 index 00000000..9e53f658 --- /dev/null +++ b/src/mibew/libs/classes/Mibew/AccessControl/Check/PermissionsCheck.php @@ -0,0 +1,95 @@ + + * test: + * path: /test + * defaults: + * _controller: Mibew\Controller\TestController::testAction + * # Set check for the route + * _access_check: Mibew\AccessControl\Check\PermissionsCheck + * # Define array of permissions. An operator should has all these + * # permissions to access the route + * _access_permissions: [CAN_ADMINISTRATE, CAN_MODIFYPROFILE] + * + */ +class PermissionsCheck extends LoggedInCheck +{ + /** + * Checks the access. + * + * @param Request $request Incoming request + * @return boolean Indicates if an operator has access or not. + */ + public function __invoke(Request $request) + { + // Check if the operator is logged in + if (!parent::__invoke($request)) { + return false; + } + + $operator = $request->attributes->get('_operator'); + $permissions = $request->attributes->get('_access_permissions', array()); + foreach ($permissions as $permission) { + if (!is_capable($this->resolvePermission($permission), $operator)) { + return false; + } + } + + return true; + } + + /** + * Resolves permission name and returns its code. + * + * @param string $permission_name Name of permission. Can be one of + * "CAN_ADMINISTRATE", "CAN_TAKEOVER", "CAN_VIEWTHREADS", + * "CAN_MODIFYPROFILE". + * @return int Permission code. + * @throws \InvalidArgumentException + */ + protected function resolvePermission($permission_name) + { + switch ($permission_name) { + case 'CAN_ADMINISTRATE': + $permission_code = CAN_ADMINISTRATE; + break; + case 'CAN_TAKEOVER': + $permission_code = CAN_TAKEOVER; + break; + case 'CAN_VIEWTHREADS': + $permission_code = CAN_VIEWTHREADS; + break; + case 'CAN_MODIFYPROFILE': + $permission_code = CAN_MODIFYPROFILE; + break; + default: + throw new \InvalidArgumentException(sprintf('Unknown permission "%s".', $permission_name)); + } + + return $permission_code; + } +}