Issue #2109035 by tim.plunkett, damiankloip, dawehner, chx: Make access checkers (much) easier to find.

8.0.x
webchick 2013-12-31 16:06:09 -08:00
parent a06d7830eb
commit d9f2ba2c84
63 changed files with 231 additions and 435 deletions

View File

@ -447,29 +447,29 @@ services:
access_check.default:
class: Drupal\Core\Access\DefaultAccessCheck
tags:
- { name: access_check }
- { name: access_check, applies_to: _access }
access_check.entity:
class: Drupal\Core\Entity\EntityAccessCheck
tags:
- { name: access_check }
- { name: access_check, applies_to: _entity_access }
access_check.entity_create:
class: Drupal\Core\Entity\EntityCreateAccessCheck
arguments: ['@entity.manager']
tags:
- { name: access_check }
- { name: access_check, applies_to: _entity_create_access }
access_check.theme:
class: Drupal\Core\Theme\ThemeAccessCheck
tags:
- { name: access_check }
- { name: access_check, applies_to: _access_theme }
access_check.custom:
class: Drupal\Core\Access\CustomAccessCheck
arguments: ['@controller_resolver']
tags:
- { name: access_check }
- { name: access_check, applies_to: _custom_access }
access_check.csrf:
class: Drupal\Core\Access\CsrfAccessCheck
tags:
- { name: access_check }
- { name: access_check, applies_to: _csrf_token }
arguments: ['@csrf_token']
maintenance_mode_subscriber:
class: Drupal\Core\EventSubscriber\MaintenanceModeSubscriber

View File

@ -8,7 +8,10 @@
namespace Drupal\Core\Access;
/**
* An exception thrown for invalid access callback return values.
* An exception thrown for access errors.
*
* Examples could be invalid access callback return values, or invalid access
* objects being used.
*/
class AccessException extends \RuntimeException {
}

View File

@ -8,6 +8,7 @@
namespace Drupal\Core\Access;
use Drupal\Core\ParamConverter\ParamConverterManager;
use Drupal\Core\Routing\Access\AccessInterface as RoutingAccessInterface;
use Drupal\Core\Routing\RequestHelper;
use Drupal\Core\Routing\RouteProviderInterface;
use Drupal\Core\Session\AccountInterface;
@ -16,7 +17,6 @@ use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
use Symfony\Component\DependencyInjection\ContainerAware;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Exception\RouteNotFoundException;
use Symfony\Cmf\Component\Routing\RouteObjectInterface;
@ -118,9 +118,15 @@ class AccessManager extends ContainerAware {
*
* @param string $service_id
* The ID of the service in the Container that provides a check.
* @param array $applies_checks
* (optional) An array of route requirement keys the checker service applies
* to.
*/
public function addCheckService($service_id) {
public function addCheckService($service_id, array $applies_checks = array()) {
$this->checkIds[] = $service_id;
foreach ($applies_checks as $applies_check) {
$this->staticRequirementMap[$applies_check][] = $service_id;
}
}
/**
@ -130,7 +136,7 @@ class AccessManager extends ContainerAware {
* A collection of routes to apply checks to.
*/
public function setChecks(RouteCollection $routes) {
$this->loadAccessRequirementMap();
$this->loadDynamicRequirementMap();
foreach ($routes as $route) {
if ($checks = $this->applies($route)) {
$route->setOption('_access_checks', $checks);
@ -329,19 +335,24 @@ class AccessManager extends ContainerAware {
throw new \InvalidArgumentException(sprintf('No check has been registered for %s', $service_id));
}
$this->checks[$service_id] = $this->container->get($service_id);
$check = $this->container->get($service_id);
if (!($check instanceof RoutingAccessInterface)) {
throw new AccessException('All access checks must implement AccessInterface.');
}
$this->checks[$service_id] = $check;
}
/**
* Compiles a mapping of requirement keys to access checker service IDs.
*/
public function loadAccessRequirementMap() {
if (isset($this->staticRequirementMap, $this->dynamicRequirementMap)) {
public function loadDynamicRequirementMap() {
if (isset($this->dynamicRequirementMap)) {
return;
}
// Set them here, so we can use the isset() check above.
$this->staticRequirementMap = array();
$this->dynamicRequirementMap = array();
foreach ($this->checkIds as $service_id) {
@ -349,14 +360,8 @@ class AccessManager extends ContainerAware {
$this->loadCheck($service_id);
}
// Empty arrays will not register anything.
if (is_subclass_of($this->checks[$service_id], 'Drupal\Core\Access\StaticAccessCheckInterface')) {
foreach ((array) $this->checks[$service_id]->appliesTo() as $key) {
$this->staticRequirementMap[$key][] = $service_id;
}
}
// Add the service ID to a the regular that will be iterated over.
else {
// Add the service ID to an array that will be iterated over.
if ($this->checks[$service_id] instanceof AccessCheckInterface) {
$this->dynamicRequirementMap[] = $service_id;
}
}

View File

@ -7,8 +7,8 @@
namespace Drupal\Core\Access;
use Drupal\Core\Access\CsrfTokenGenerator;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Routing\Access\AccessInterface as RoutingAccessInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
@ -19,7 +19,7 @@ use Symfony\Component\HttpFoundation\Request;
* a token generated by \Drupal::csrfToken()->get() using the same value as the
* "_csrf_token" parameter in the route.
*/
class CsrfAccessCheck implements StaticAccessCheckInterface {
class CsrfAccessCheck implements RoutingAccessInterface {
/**
* The CSRF token generator.
@ -38,13 +38,6 @@ class CsrfAccessCheck implements StaticAccessCheckInterface {
$this->csrfToken = $csrf_token;
}
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_csrf_token');
}
/**
* {@inheritdoc}
*/

View File

@ -8,6 +8,7 @@
namespace Drupal\Core\Access;
use Drupal\Core\Controller\ControllerResolverInterface;
use Drupal\Core\Routing\Access\AccessInterface as RoutingAccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Route;
@ -22,7 +23,7 @@ use Symfony\Component\Routing\Route;
* cannot reuse any stored property of your actual controller instance used
* to generate the output.
*/
class CustomAccessCheck implements StaticAccessCheckInterface {
class CustomAccessCheck implements RoutingAccessInterface {
/**
* The controller resolver.
@ -41,13 +42,6 @@ class CustomAccessCheck implements StaticAccessCheckInterface {
$this->controllerResolver = $controller_resolver;
}
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_custom_access');
}
/**
* {@inheritdoc}
*/

View File

@ -8,20 +8,14 @@
namespace Drupal\Core\Access;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Routing\Access\AccessInterface as RoutingAccessInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
/**
* Allows access to routes to be controlled by an '_access' boolean parameter.
*/
class DefaultAccessCheck implements StaticAccessCheckInterface {
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_access');
}
class DefaultAccessCheck implements RoutingAccessInterface {
/**
* {@inheritdoc}

View File

@ -1,34 +0,0 @@
<?php
/**
* @file
* Contains \Drupal\Core\Access\StaticAccessCheckInterface.
*/
namespace Drupal\Core\Access;
use Drupal\Core\Routing\Access\AccessInterface as RoutingAccessInterface;
/**
* An access check service determines access rules for particular routes.
*
* This interface is specifically for routes that know exactly which requirement
* keys they should react to for a route.
*/
interface StaticAccessCheckInterface extends RoutingAccessInterface {
/**
* Declares the route requirement keys this access checker applies to.
*
* This should be used when the requirement matching for a route is static,
* and does not require any further information. For example, '_access' will
* provide TRUE, or FALSE. We do not need any more information other than the
* route provides this requirement key.
*
* @return array
* An array of route requirement keys this access checker applies to. An
* empty array will check all routes using the apply method.
*/
public function appliesTo();
}

View File

@ -26,7 +26,13 @@ class RegisterAccessChecksPass implements CompilerPassInterface {
}
$access_manager = $container->getDefinition('access_manager');
foreach ($container->findTaggedServiceIds('access_check') as $id => $attributes) {
$access_manager->addMethodCall('addCheckService', array($id));
$applies = array();
foreach ($attributes as $attribute) {
if (isset($attribute['applies_to'])) {
$applies[] = $attribute['applies_to'];
}
}
$access_manager->addMethodCall('addCheckService', array($id, $applies));
}
}
}

View File

@ -7,23 +7,15 @@
namespace Drupal\Core\Entity;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
use Drupal\Core\Access\StaticAccessCheckInterface;
/**
* Provides a generic access checker for entities.
*/
class EntityAccessCheck implements StaticAccessCheckInterface {
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_entity_access');
}
class EntityAccessCheck implements AccessInterface {
/**
* Implements \Drupal\Core\Access\AccessCheckInterface::access().

View File

@ -7,7 +7,7 @@
namespace Drupal\Core\Entity;
use Drupal\Core\Access\StaticAccessCheckInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Route;
@ -15,7 +15,7 @@ use Symfony\Component\Routing\Route;
/**
* Defines an access checker for entity creation.
*/
class EntityCreateAccessCheck implements StaticAccessCheckInterface {
class EntityCreateAccessCheck implements AccessInterface {
/**
* The entity manager.
@ -41,13 +41,6 @@ class EntityCreateAccessCheck implements StaticAccessCheckInterface {
$this->entityManager = $entity_manager;
}
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array($this->requirementsKey);
}
/**
* {@inheritdoc}
*/

View File

@ -7,7 +7,7 @@
namespace Drupal\Core\Theme;
use Drupal\Core\Access\StaticAccessCheckInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Route;
@ -15,14 +15,7 @@ use Symfony\Component\Routing\Route;
/**
* Access check for a theme.
*/
class ThemeAccessCheck implements StaticAccessCheckInterface {
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_access_theme');
}
class ThemeAccessCheck implements AccessInterface {
/**
* {@inheritdoc}

View File

@ -8,3 +8,11 @@ services:
plugin.manager.aggregator.processor:
class: Drupal\aggregator\Plugin\AggregatorPluginManager
arguments: [processor, '@container.namespaces', '@cache.cache', '@language_manager']
access_check.aggregator.categories:
class: Drupal\aggregator\Access\CategoriesAccessCheck
arguments: ['@database']
tags:
- { name: access_check, applies_to: _access_aggregator_categories }
aggregator.category.storage:
class: Drupal\aggregator\CategoryStorageController
arguments: ['@database']

View File

@ -0,0 +1,45 @@
<?php
/**
* @file
* Contains \Drupal\aggregator\Access\CategoriesAccess.
*/
namespace Drupal\aggregator\Access;
use Drupal\Core\Database\Connection;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Route;
/**
* Provides an access check for aggregator categories routes.
*/
class CategoriesAccessCheck implements AccessInterface {
/**
* The database connection.
*
* @var \Drupal\Core\Database\Connection
*/
protected $database;
/**
* Constructs a CategoriesAccessCheck object.
*
* @param \Drupal\Core\Database\Connection
* The database connection.
*/
public function __construct(Connection $database) {
$this->database = $database;
}
/**
* {@inheritdoc}
*/
public function access(Route $route, Request $request, AccountInterface $account) {
return $account->hasPermission('access news feeds') && (bool) $this->database->queryRange('SELECT 1 FROM {aggregator_category}', 0, 1)->fetchField() ? static::ALLOW : static::DENY;
}
}

View File

@ -15,4 +15,4 @@ services:
class: Drupal\book\Access\BookNodeIsRemovableAccessCheck
arguments: ['@book.manager']
tags:
- { name: access_check }
- { name: access_check, applies_to: _access_book_removable }

View File

@ -8,7 +8,7 @@
namespace Drupal\book\Access;
use Drupal\book\BookManager;
use Drupal\Core\Access\StaticAccessCheckInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
@ -16,7 +16,7 @@ use Symfony\Component\HttpFoundation\Request;
/**
* Determines whether the requested node can be removed from its book.
*/
class BookNodeIsRemovableAccessCheck implements StaticAccessCheckInterface {
class BookNodeIsRemovableAccessCheck implements AccessInterface {
/**
* Book Manager Service.
@ -35,13 +35,6 @@ class BookNodeIsRemovableAccessCheck implements StaticAccessCheckInterface {
$this->bookManager = $book_manager;
}
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_access_book_removable');
}
/**
* {@inheritdoc}
*/

View File

@ -9,13 +9,13 @@ services:
class: Drupal\config_translation\Access\ConfigTranslationOverviewAccess
arguments: ['@plugin.manager.config_translation.mapper']
tags:
- { name: access_check }
- { name: access_check, applies_to: _config_translation_overview_access }
config_translation.access.form:
class: Drupal\config_translation\Access\ConfigTranslationFormAccess
arguments: ['@plugin.manager.config_translation.mapper']
tags:
- { name: access_check }
- { name: access_check, applies_to: _config_translation_form_access }
plugin.manager.config_translation.mapper:
class: Drupal\config_translation\ConfigMapperManager

View File

@ -16,13 +16,6 @@ use Symfony\Component\Routing\Route;
*/
class ConfigTranslationFormAccess extends ConfigTranslationOverviewAccess {
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_config_translation_form_access');
}
/**
* {@inheritdoc}
*/

View File

@ -8,7 +8,7 @@
namespace Drupal\config_translation\Access;
use Drupal\config_translation\ConfigMapperManagerInterface;
use Drupal\Core\Access\StaticAccessCheckInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Route;
@ -16,7 +16,7 @@ use Symfony\Component\Routing\Route;
/**
* Checks access for displaying the configuration translation overview.
*/
class ConfigTranslationOverviewAccess implements StaticAccessCheckInterface {
class ConfigTranslationOverviewAccess implements AccessInterface {
/**
* The mapper plugin discovery service.
@ -42,13 +42,6 @@ class ConfigTranslationOverviewAccess implements StaticAccessCheckInterface {
$this->configMapperManager = $config_mapper_manager;
}
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_config_translation_overview_access');
}
/**
* {@inheritdoc}
*/

View File

@ -2,5 +2,5 @@ services:
access_check.contact_personal:
class: Drupal\contact\Access\ContactPageAccess
tags:
- { name: access_check }
- { name: access_check, applies_to: _access_contact_personal_tab }
arguments: ['@config.factory', '@user.data']

View File

@ -7,8 +7,8 @@
namespace Drupal\contact\Access;
use Drupal\Core\Access\StaticAccessCheckInterface;
use Drupal\Core\Config\ConfigFactory;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\user\UserDataInterface;
use Symfony\Component\Routing\Route;
@ -17,7 +17,7 @@ use Symfony\Component\HttpFoundation\Request;
/**
* Access check for contact_personal_page route.
*/
class ContactPageAccess implements StaticAccessCheckInterface {
class ContactPageAccess implements AccessInterface {
/**
* The contact settings config object.
@ -46,13 +46,6 @@ class ContactPageAccess implements StaticAccessCheckInterface {
$this->userData = $user_data;
}
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_access_contact_personal_tab');
}
/**
* {@inheritdoc}
*/

View File

@ -13,13 +13,13 @@ services:
class: Drupal\content_translation\Access\ContentTranslationOverviewAccess
arguments: ['@entity.manager']
tags:
- { name: access_check }
- { name: access_check, applies_to: _access_content_translation_overview }
content_translation.manage_access:
class: Drupal\content_translation\Access\ContentTranslationManageAccessCheck
arguments: ['@entity.manager']
tags:
- { name: access_check }
- { name: access_check, applies_to: _access_content_translation_manage }
content_translation.manager:
class: Drupal\content_translation\ContentTranslationManager

View File

@ -7,9 +7,9 @@
namespace Drupal\content_translation\Access;
use Drupal\Core\Access\StaticAccessCheckInterface;
use Drupal\Core\Entity\EntityManagerInterface;
use Drupal\Core\Language\Language;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
@ -17,7 +17,7 @@ use Symfony\Component\HttpFoundation\Request;
/**
* Access check for entity translation CRUD operation.
*/
class ContentTranslationManageAccessCheck implements StaticAccessCheckInterface {
class ContentTranslationManageAccessCheck implements AccessInterface {
/**
* The entity type manager.
@ -36,13 +36,6 @@ class ContentTranslationManageAccessCheck implements StaticAccessCheckInterface
$this->entityManager = $manager;
}
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_access_content_translation_manage');
}
/**
* {@inheritdoc}
*/

View File

@ -7,8 +7,8 @@
namespace Drupal\content_translation\Access;
use Drupal\Core\Access\StaticAccessCheckInterface;
use Drupal\Core\Entity\EntityManagerInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
@ -16,7 +16,7 @@ use Symfony\Component\HttpFoundation\Request;
/**
* Access check for entity translation overview.
*/
class ContentTranslationOverviewAccess implements StaticAccessCheckInterface {
class ContentTranslationOverviewAccess implements AccessInterface {
/**
* The entity type manager.
@ -35,13 +35,6 @@ class ContentTranslationOverviewAccess implements StaticAccessCheckInterface {
$this->entityManager = $manager;
}
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_access_content_translation_overview');
}
/**
* {@inheritdoc}
*/

View File

@ -6,12 +6,12 @@ services:
class: Drupal\edit\Access\EditEntityFieldAccessCheck
arguments: ['@entity.manager']
tags:
- { name: access_check }
- { name: access_check, applies_to: _access_edit_entity_field }
access_check.edit.entity:
class: Drupal\edit\Access\EditEntityAccessCheck
arguments: ['@entity.manager']
tags:
- { name: access_check }
- { name: access_check, applies_to: _access_edit_entity }
edit.editor.selector:
class: Drupal\edit\EditorSelector
arguments: ['@plugin.manager.edit.editor', '@plugin.manager.field.formatter']

View File

@ -7,8 +7,8 @@
namespace Drupal\edit\Access;
use Drupal\Core\Access\StaticAccessCheckInterface;
use Drupal\Core\Entity\EntityManagerInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
@ -18,7 +18,7 @@ use Drupal\Core\Entity\EntityInterface;
/**
* Access check for editing entities.
*/
class EditEntityAccessCheck implements StaticAccessCheckInterface {
class EditEntityAccessCheck implements AccessInterface {
/**
* The entity manager.
@ -37,14 +37,6 @@ class EditEntityAccessCheck implements StaticAccessCheckInterface {
$this->entityManager = $entity_manager;
}
/**
* {@inheritdoc}
*/
public function appliesTo() {
// @see edit.routing.yml
return array('_access_edit_entity');
}
/**
* {@inheritdoc}
*/

View File

@ -7,9 +7,8 @@
namespace Drupal\edit\Access;
use Drupal\Core\Access\StaticAccessCheckInterface;
use Drupal\edit\Access\EditEntityFieldAccessCheckInterface;
use Drupal\Core\Entity\EntityManagerInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
@ -19,7 +18,7 @@ use Drupal\Core\Entity\EntityInterface;
/**
* Access check for editing entity fields.
*/
class EditEntityFieldAccessCheck implements StaticAccessCheckInterface, EditEntityFieldAccessCheckInterface {
class EditEntityFieldAccessCheck implements AccessInterface, EditEntityFieldAccessCheckInterface {
/**
* The entity manager.
@ -38,13 +37,6 @@ class EditEntityFieldAccessCheck implements StaticAccessCheckInterface, EditEnti
$this->entityManager = $entity_manager;
}
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_access_edit_entity_field');
}
/**
* {@inheritdoc}
*/

View File

@ -65,13 +65,6 @@ class EditEntityAccessCheckTest extends UnitTestCase {
$this->editAccessCheck = new EditEntityAccessCheck($this->entityManager);
}
/**
* Tests the appliesTo method for the access checker.
*/
public function testAppliesTo() {
$this->assertEquals($this->editAccessCheck->appliesTo(), array('_access_edit_entity'), 'Access checker returned the expected appliesTo() array.');
}
/**
* Provides test data for testAccess().
*

View File

@ -67,13 +67,6 @@ class EditEntityFieldAccessCheckTest extends UnitTestCase {
$this->editAccessCheck = new EditEntityFieldAccessCheck($this->entityManager);
}
/**
* Tests the appliesTo method for the access checker.
*/
public function testAppliesTo() {
$this->assertEquals($this->editAccessCheck->appliesTo(), array('_access_edit_entity_field'), 'Access checker returned the expected appliesTo() array.');
}
/**
* Provides test data for testAccess().
*

View File

@ -8,9 +8,9 @@ services:
class: Drupal\field_ui\Access\ViewModeAccessCheck
arguments: ['@entity.manager']
tags:
- { name: access_check }
- { name: access_check, applies_to: _field_ui_view_mode_access }
access_check.field_ui.form_mode:
class: Drupal\field_ui\Access\FormModeAccessCheck
arguments: ['@entity.manager']
tags:
- { name: access_check }
- { name: access_check, applies_to: _field_ui_form_mode_access }

View File

@ -7,8 +7,8 @@
namespace Drupal\field_ui\Access;
use Drupal\Core\Access\StaticAccessCheckInterface;
use Drupal\Core\Entity\EntityManagerInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
@ -16,7 +16,7 @@ use Symfony\Component\HttpFoundation\Request;
/**
* Allows access to routes to be controlled by an '_access' boolean parameter.
*/
class FormModeAccessCheck implements StaticAccessCheckInterface {
class FormModeAccessCheck implements AccessInterface {
/**
* The entity manager.
@ -35,13 +35,6 @@ class FormModeAccessCheck implements StaticAccessCheckInterface {
$this->entityManager = $entity_manager;
}
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_field_ui_form_mode_access');
}
/**
* {@inheritdoc}
*/

View File

@ -7,8 +7,8 @@
namespace Drupal\field_ui\Access;
use Drupal\Core\Access\StaticAccessCheckInterface;
use Drupal\Core\Entity\EntityManagerInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
@ -16,7 +16,7 @@ use Symfony\Component\HttpFoundation\Request;
/**
* Allows access to routes to be controlled by an '_access' boolean parameter.
*/
class ViewModeAccessCheck implements StaticAccessCheckInterface {
class ViewModeAccessCheck implements AccessInterface {
/**
* The entity manager.
@ -35,13 +35,6 @@ class ViewModeAccessCheck implements StaticAccessCheckInterface {
$this->entityManager = $entity_manager;
}
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_field_ui_view_mode_access');
}
/**
* {@inheritdoc}
*/

View File

@ -9,7 +9,7 @@ services:
access_check.filter_disable:
class: Drupal\filter\Access\FormatDisableCheck
tags:
- { name: access_check }
- { name: access_check, applies_to: _filter_disable_format_access }
plugin.manager.filter:
class: Drupal\filter\FilterPluginManager
parent: default_plugin_manager

View File

@ -7,7 +7,7 @@
namespace Drupal\filter\Access;
use Drupal\Core\Access\StaticAccessCheckInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
@ -15,14 +15,7 @@ use Symfony\Component\HttpFoundation\Request;
/**
* Checks access for disabling text formats.
*/
class FormatDisableCheck implements StaticAccessCheckInterface {
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_filter_disable_format_access');
}
class FormatDisableCheck implements AccessInterface {
/**
* {@inheritdoc}

View File

@ -7,7 +7,8 @@
namespace Drupal\node\Access;
use Drupal\Core\Entity\EntityCreateAccessCheck;
use Drupal\Core\Entity\EntityManagerInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
@ -15,12 +16,24 @@ use Symfony\Component\HttpFoundation\Request;
/**
* Determines access to for node add pages.
*/
class NodeAddAccessCheck extends EntityCreateAccessCheck {
class NodeAddAccessCheck implements AccessInterface {
/**
* {@inheritdoc}
* The entity manager.
*
* @var \Drupal\Core\Entity\EntityManagerInterface
*/
protected $requirementsKey = '_node_add_access';
protected $entityManager;
/**
* Constructs a EntityCreateAccessCheck object.
*
* @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
* The entity manager.
*/
public function __construct(EntityManagerInterface $entity_manager) {
$this->entityManager = $entity_manager;
}
/**
* {@inheritdoc}

View File

@ -7,9 +7,9 @@
namespace Drupal\node\Access;
use Drupal\Core\Access\AccessCheckInterface;
use Drupal\Core\Database\Connection;
use Drupal\Core\Entity\EntityManagerInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\node\NodeInterface;
use Symfony\Component\HttpFoundation\Request;
@ -18,7 +18,7 @@ use Symfony\Component\Routing\Route;
/**
* Provides an access checker for node revisions.
*/
class NodeRevisionAccessCheck implements AccessCheckInterface {
class NodeRevisionAccessCheck implements AccessInterface {
/**
* The node storage.
@ -62,13 +62,6 @@ class NodeRevisionAccessCheck implements AccessCheckInterface {
$this->connection = $connection;
}
/**
* {@inheritdoc}
*/
public function applies(Route $route) {
return array_key_exists('_access_node_revision', $route->getRequirements());
}
/**
* {@inheritdoc}
*/

View File

@ -6,9 +6,9 @@ services:
class: Drupal\node\Access\NodeRevisionAccessCheck
arguments: ['@entity.manager', '@database']
tags:
- { name: access_check }
- { name: access_check, applies_to: _access_node_revision }
access_check.node.add:
class: Drupal\node\Access\NodeAddAccessCheck
arguments: ['@entity.manager']
tags:
- { name: access_check }
- { name: access_check, applies_to: _node_add_access }

View File

@ -7,7 +7,7 @@
namespace Drupal\search\Access;
use Drupal\Core\Access\StaticAccessCheckInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\search\SearchPluginManager;
use Symfony\Component\HttpFoundation\Request;
@ -16,7 +16,7 @@ use Symfony\Component\Routing\Route;
/**
* Checks access for viewing search.
*/
class SearchAccessCheck implements StaticAccessCheckInterface {
class SearchAccessCheck implements AccessInterface {
/**
* The search plugin manager.
@ -35,13 +35,6 @@ class SearchAccessCheck implements StaticAccessCheckInterface {
$this->searchManager = $search_plugin_manager;
}
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_search_access');
}
/**
* {@inheritdoc}
*/

View File

@ -16,13 +16,6 @@ use Symfony\Component\Routing\Route;
*/
class SearchPluginAccessCheck extends SearchAccessCheck {
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_search_plugin_view_access');
}
/**
* {@inheritdoc}
*/

View File

@ -7,10 +7,10 @@ services:
class: Drupal\search\Access\SearchAccessCheck
arguments: ['@plugin.manager.search']
tags:
- { name: access_check }
- { name: access_check, applies_to: _search_access }
access_check.search_plugin:
class: Drupal\search\Access\SearchPluginAccessCheck
arguments: ['@plugin.manager.search']
tags:
- { name: access_check }
- { name: access_check, applies_to: _search_plugin_view_access }

View File

@ -0,0 +1,32 @@
<?php
/**
* @file
* Contains Drupal\shortcut\Access\LinkAccessCheck.
*/
namespace Drupal\shortcut\Access;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
/**
* Provides an access check for shortcut link delete routes.
*/
class LinkAccessCheck implements AccessInterface {
/**
* {@inheritdoc}
*/
public function access(Route $route, Request $request, AccountInterface $account) {
$menu_link = $request->attributes->get('menu_link');
$set_name = str_replace('shortcut-', '', $menu_link['menu_name']);
if ($shortcut_set = shortcut_set_load($set_name)) {
return shortcut_set_edit_access($shortcut_set) ? static::ALLOW : static::DENY;
}
return static::DENY;
}
}

View File

@ -7,7 +7,7 @@
namespace Drupal\shortcut\Access;
use Drupal\Core\Access\StaticAccessCheckInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
@ -15,14 +15,7 @@ use Symfony\Component\HttpFoundation\Request;
/**
* Provides an access check for shortcut link delete routes.
*/
class ShortcutSetEditAccessCheck implements StaticAccessCheckInterface {
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_access_shortcut_set_edit');
}
class ShortcutSetEditAccessCheck implements AccessInterface {
/**
* {@inheritdoc}

View File

@ -7,7 +7,7 @@
namespace Drupal\shortcut\Access;
use Drupal\Core\Access\StaticAccessCheckInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
@ -15,14 +15,7 @@ use Symfony\Component\HttpFoundation\Request;
/**
* Provides an access check for shortcut link delete routes.
*/
class ShortcutSetSwitchAccessCheck implements StaticAccessCheckInterface {
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_access_shortcut_set_switch');
}
class ShortcutSetSwitchAccessCheck implements AccessInterface {
/**
* {@inheritdoc}

View File

@ -1,10 +1,15 @@
services:
access_check.shortcut.link:
class: Drupal\shortcut\Access\LinkAccessCheck
tags:
- { name: access_check, applies_to: _access_shortcut_link }
access_check.shortcut.shortcut_set_edit:
class: Drupal\shortcut\Access\ShortcutSetEditAccessCheck
tags:
- { name: access_check }
- { name: access_check, applies_to: _access_shortcut_set_edit }
access_check.shortcut.shortcut_set_switch:
class: Drupal\shortcut\Access\ShortcutSetSwitchAccessCheck
tags:
- { name: access_check }
- { name: access_check, applies_to: _access_shortcut_set_switch }

View File

@ -7,7 +7,7 @@
namespace Drupal\system\Access;
use Drupal\Core\Access\StaticAccessCheckInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
@ -15,14 +15,7 @@ use Symfony\Component\HttpFoundation\Request;
/**
* Access check for cron routes.
*/
class CronAccessCheck implements StaticAccessCheckInterface {
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_access_system_cron');
}
class CronAccessCheck implements AccessInterface {
/**
* Implements AccessCheckInterface::access().

View File

@ -2,7 +2,7 @@ services:
access_check.cron:
class: Drupal\system\Access\CronAccessCheck
tags:
- { name: access_check }
- { name: access_check, applies_to: _access_system_cron }
system.manager:
class: Drupal\system\SystemManager
arguments: ['@module_handler', '@database', '@entity.manager']

View File

@ -7,7 +7,7 @@
namespace Drupal\router_test\Access;
use Drupal\Core\Access\AccessCheckInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Route;
@ -15,14 +15,7 @@ use Symfony\Component\Routing\Route;
/**
* Defines an access checker similar to DefaultAccessCheck
*/
class DefinedTestAccessCheck implements AccessCheckInterface {
/**
* {@inheritdoc}
*/
public function applies(Route $route) {
return array_key_exists('_test_access', $route->getRequirements());
}
class DefinedTestAccessCheck implements AccessInterface {
/**
* {@inheritdoc}

View File

@ -7,7 +7,7 @@
namespace Drupal\router_test\Access;
use Drupal\Core\Access\AccessCheckInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
@ -15,14 +15,7 @@ use Symfony\Component\HttpFoundation\Request;
/**
* Access check for test routes.
*/
class TestAccessCheck implements AccessCheckInterface {
/**
* Implements AccessCheckInterface::applies().
*/
public function applies(Route $route) {
return array_key_exists('_access_router_test', $route->getRequirements());
}
class TestAccessCheck implements AccessInterface {
/**
* Implements AccessCheckInterface::access().

View File

@ -21,6 +21,6 @@ class RouterTestServiceProvider implements ServiceProviderInterface {
public function register(ContainerBuilder $container) {
$container->register('router_test.subscriber', 'Drupal\router_test\RouteTestSubscriber')->addTag('event_subscriber');
$container->register('access_check.router_test', 'Drupal\router_test\Access\TestAccessCheck')
->addTag('access_check');
->addTag('access_check', array('applies_to' => '_access_router_test'));
}
}

View File

@ -7,7 +7,7 @@
namespace Drupal\tracker\Access;
use Drupal\Core\Access\StaticAccessCheckInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
@ -15,14 +15,7 @@ use Symfony\Component\HttpFoundation\Request;
/**
* Access check for user tracker routes.
*/
class ViewOwnTrackerAccessCheck implements StaticAccessCheckInterface {
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_access_tracker_own_information');
}
class ViewOwnTrackerAccessCheck implements AccessInterface {
/**
* {@inheritdoc}

View File

@ -2,4 +2,4 @@ services:
access_check.tracker.view_own:
class: Drupal\tracker\Access\ViewOwnTrackerAccessCheck
tags:
- { name: access_check }
- { name: access_check, applies_to: _access_tracker_own_information }

View File

@ -8,7 +8,7 @@
namespace Drupal\update\Access;
use Drupal\Component\Utility\Settings;
use Drupal\Core\Access\StaticAccessCheckInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
@ -16,7 +16,7 @@ use Symfony\Component\HttpFoundation\Request;
/**
* Determines whether allow authorized operations is set.
*/
class UpdateManagerAccessCheck implements StaticAccessCheckInterface {
class UpdateManagerAccessCheck implements AccessInterface {
/**
* Settings Service.
@ -28,20 +28,13 @@ class UpdateManagerAccessCheck implements StaticAccessCheckInterface {
/**
* Constructs a UpdateManagerAccessCheck object.
*
* @param \Drupal\update\updateManager $update_manager
* update Manager Service.
* @param \Drupal\Component\Utility\Settings $settings
* The read-only settings container.
*/
public function __construct(Settings $settings) {
$this->settings = $settings;
}
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_access_update_manager');
}
/**
* {@inheritdoc}
*/

View File

@ -3,4 +3,4 @@ services:
class: Drupal\update\Access\UpdateManagerAccessCheck
arguments: ['@settings']
tags:
- { name: access_check }
- { name: access_check, applies_to: _access_update_manager }

View File

@ -7,7 +7,7 @@
namespace Drupal\user\Access;
use Drupal\Core\Access\StaticAccessCheckInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
@ -15,14 +15,7 @@ use Symfony\Component\HttpFoundation\Request;
/**
* Determines access to routes based on login status of current user.
*/
class LoginStatusCheck implements StaticAccessCheckInterface {
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_user_is_logged_in');
}
class LoginStatusCheck implements AccessInterface {
/**
* {@inheritdoc}

View File

@ -7,7 +7,7 @@
namespace Drupal\user\Access;
use Drupal\Core\Access\StaticAccessCheckInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
@ -15,14 +15,7 @@ use Symfony\Component\HttpFoundation\Request;
/**
* Determines access to routes based on permissions defined via hook_permission().
*/
class PermissionAccessCheck implements StaticAccessCheckInterface {
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_permission');
}
class PermissionAccessCheck implements AccessInterface {
/**
* Implements AccessCheckInterface::access().

View File

@ -7,7 +7,7 @@
namespace Drupal\user\Access;
use Drupal\Core\Access\StaticAccessCheckInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
@ -15,14 +15,7 @@ use Symfony\Component\HttpFoundation\Request;
/**
* Access check for user registration routes.
*/
class RegisterAccessCheck implements StaticAccessCheckInterface {
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_access_user_register');
}
class RegisterAccessCheck implements AccessInterface {
/**
* Implements AccessCheckInterface::access().

View File

@ -7,7 +7,7 @@
namespace Drupal\user\Access;
use Drupal\Core\Access\StaticAccessCheckInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Route;
@ -19,14 +19,7 @@ use Symfony\Component\Routing\Route;
* single role, users with that role with have access. If you specify multiple
* ones you can conjunct them with AND by using a "+" and with OR by using ",".
*/
class RoleAccessCheck implements StaticAccessCheckInterface {
/**
* {@inheritdoc}
*/
public function appliesTo() {
return array('_role');
}
class RoleAccessCheck implements AccessInterface {
/**
* {@inheritdoc}

View File

@ -2,19 +2,19 @@ services:
access_check.permission:
class: Drupal\user\Access\PermissionAccessCheck
tags:
- { name: access_check }
- { name: access_check, applies_to: _permission }
access_check.user.register:
class: Drupal\user\Access\RegisterAccessCheck
tags:
- { name: access_check }
- { name: access_check, applies_to: _access_user_register }
access_check.user.role:
class: Drupal\user\Access\RoleAccessCheck
tags:
- { name: access_check }
- { name: access_check, applies_to: _role }
access_check.user.login_status:
class: Drupal\user\Access\LoginStatusCheck
tags:
- { name: access_check }
- { name: access_check, applies_to: _user_is_logged_in }
user.data:
class: Drupal\user\UserData
arguments: ['@database']

View File

@ -352,7 +352,7 @@ class AccessManagerTest extends UnitTestCase {
$this->setupAccessChecker();
$access_check = new DefinedTestAccessCheck();
$this->container->register('test_access_defined', $access_check);
$this->accessManager->addCheckService('test_access_defined');
$this->accessManager->addCheckService('test_access_defined', array('_test_access'));
$request = new Request();
@ -370,21 +370,6 @@ class AccessManagerTest extends UnitTestCase {
$this->assertSame($this->accessManager->check($route, $request, $this->account), $expected_access);
}
/**
* Tests the static access checker interface.
*/
public function testStaticAccessCheckInterface() {
$mock_static = $this->getMock('Drupal\Core\Access\StaticAccessCheckInterface');
$mock_static->expects($this->once())
->method('appliesTo')
->will($this->returnValue(array('_access')));
$this->container->set('test_static_access', $mock_static);
$this->accessManager->addCheckService('test_static_access');
$this->accessManager->setChecks($this->routeCollection);
}
/**
* Tests the checkNamedRoute method.
*
@ -593,7 +578,7 @@ class AccessManagerTest extends UnitTestCase {
$this->accessManager->setContainer($this->container);
$access_check = new DefaultAccessCheck();
$this->container->register('test_access_default', $access_check);
$this->accessManager->addCheckService('test_access_default');
$this->accessManager->addCheckService('test_access_default', array('_access'));
}
}

View File

@ -62,13 +62,6 @@ class CsrfAccessCheckTest extends UnitTestCase {
$this->accessCheck = new CsrfAccessCheck($this->csrfToken);
}
/**
* Tests CsrfAccessCheck::appliesTo().
*/
public function testAppliesTo() {
$this->assertEquals($this->accessCheck->appliesTo(), array('_csrf_token'), 'Access checker returned the expected appliesTo() array.');
}
/**
* Tests the access() method with a valid token.
*/

View File

@ -52,14 +52,6 @@ class CustomAccessCheckTest extends UnitTestCase {
$this->accessChecker = new CustomAccessCheck($this->controllerResolver);
}
/**
* Tests the appliesTo method.
*/
public function testAppliesTo() {
$this->assertEquals($this->accessChecker->appliesTo(), array('_custom_access'));
}
/**
* Test the access method.
*/

View File

@ -52,14 +52,6 @@ class DefaultAccessCheckTest extends UnitTestCase {
$this->accessChecker = new DefaultAccessCheck();
}
/**
* Tests the appliesTo method.
*/
public function testAppliesTo() {
$this->assertEquals($this->accessChecker->appliesTo(), array('_access'), 'Access checker returned the expected appliesTo() array.');
}
/**
* Test the access method.
*/

View File

@ -28,14 +28,6 @@ class EntityAccessCheckTest extends UnitTestCase {
);
}
/**
* Tests the appliesTo method for the access checker.
*/
public function testAppliesTo() {
$entity_access = new EntityAccessCheck();
$this->assertEquals($entity_access->appliesTo(), array('_entity_access'), 'Access checker returned the expected appliesTo() array.');
}
/**
* Tests the method for checking access to routes.
*/

View File

@ -44,15 +44,6 @@ class EntityCreateAccessCheckTest extends UnitTestCase {
parent::setUp();
}
/**
* Tests the appliesTo method for the access checker.
*/
public function testAppliesTo() {
$entity_manager = $this->getMock('Drupal\Core\Entity\EntityManagerInterface');
$entity_access = new EntityCreateAccessCheck($entity_manager);
$this->assertEquals($entity_access->appliesTo(), array('_entity_create_access'), 'Access checker returned the expected appliesTo() array.');
}
/**
* Provides test data for testAccess.
*