Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
D
drupal
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Custom Issue Tracker
Custom Issue Tracker
Labels
Merge Requests
301
Merge Requests
301
Requirements
Requirements
List
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Analytics
Analytics
Code Review
Insights
Issue
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
project
drupal
Commits
2891848c
Commit
2891848c
authored
Sep 22, 2013
by
alexpott
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Issue
#2057377
by Xano: Added Implement hook_entity_access() and hook_entity_create_access().
parent
d7fa47b4
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
148 additions
and
11 deletions
+148
-11
core/includes/entity.api.php
core/includes/entity.api.php
+80
-0
core/lib/Drupal/Core/Entity/EntityAccessController.php
core/lib/Drupal/Core/Entity/EntityAccessController.php
+19
-11
core/modules/system/lib/Drupal/system/Tests/Entity/EntityAccessTest.php
...ystem/lib/Drupal/system/Tests/Entity/EntityAccessTest.php
+20
-0
core/modules/system/tests/modules/entity_test/entity_test.module
...dules/system/tests/modules/entity_test/entity_test.module
+29
-0
No files found.
core/includes/entity.api.php
View file @
2891848c
...
...
@@ -10,6 +10,86 @@
* @{
*/
/**
* Control entity operation access.
*
* @param \Drupal\Core\Entity\EntityInterface $entity
* The entity to check access to.
* @param string $operation
* The operation that is to be performed on $entity.
* @param \Drupal\Core\Session\AccountInterface $account
* The account trying to access the entity.
* @param string $langcode
* The code of the language $entity is accessed in.
*
* @return bool|null
* A boolean to explicitly allow or deny access, or NULL to neither allow nor
* deny access.
*
* @see \Drupal\Core\Entity\EntityAccessController
*/
function
hook_entity_access
(
\
Drupal\Core\Entity\EntityInterface
$entity
,
$operation
,
\
Drupal\Core\Session\AccountInterface
$account
,
$langcode
)
{
return
NULL
;
}
/**
* Control entity operation access for a specific entity type.
*
* @param \Drupal\Core\Entity\EntityInterface $entity
* The entity to check access to.
* @param string $operation
* The operation that is to be performed on $entity.
* @param \Drupal\Core\Session\AccountInterface $account
* The account trying to access the entity.
* @param string $langcode
* The code of the language $entity is accessed in.
*
* @return bool|null
* A boolean to explicitly allow or deny access, or NULL to neither allow nor
* deny access.
*
* @see \Drupal\Core\Entity\EntityAccessController
*/
function
hook_ENTITY_TYPE_access
(
\
Drupal\Core\Entity\EntityInterface
$entity
,
$operation
,
\
Drupal\Core\Session\AccountInterface
$account
,
$langcode
)
{
return
NULL
;
}
/**
* Control entity create access.
*
* @param \Drupal\Core\Session\AccountInterface $account
* The account trying to access the entity.
* @param string $langcode
* The code of the language $entity is accessed in.
*
* @return bool|null
* A boolean to explicitly allow or deny access, or NULL to neither allow nor
* deny access.
*
* @see \Drupal\Core\Entity\EntityAccessController
*/
function
hook_entity_create_access
(
\
Drupal\Core\Session\AccountInterface
$account
,
$langcode
)
{
return
NULL
;
}
/**
* Control entity create access for a specific entity type.
*
* @param \Drupal\Core\Session\AccountInterface $account
* The account trying to access the entity.
* @param string $langcode
* The code of the language $entity is accessed in.
*
* @return bool|null
* A boolean to explicitly allow or deny access, or NULL to neither allow nor
* deny access.
*
* @see \Drupal\Core\Entity\EntityAccessController
*/
function
hook_ENTITY_TYPE_create_access
(
\
Drupal\Core\Session\AccountInterface
$account
,
$langcode
)
{
return
NULL
;
}
/**
* Add to entity type definitions.
*
...
...
core/lib/Drupal/Core/Entity/EntityAccessController.php
View file @
2891848c
...
...
@@ -44,7 +44,7 @@ class EntityAccessController implements EntityAccessControllerInterface {
* The entity type of the access controller instance.
*/
public
function
__construct
(
$entity_type
)
{
$this
->
entity
_t
ype
=
$entity_type
;
$this
->
entity
T
ype
=
$entity_type
;
}
/**
...
...
@@ -58,15 +58,19 @@ public function access(EntityInterface $entity, $operation, $langcode = Language
return
$access
;
}
// Invoke hook_entity_access(), hook results take precedence over overridden
// implementations of EntityAccessController::checkAccess(). Entities
// that have checks that need to be done before the hook is invoked should
// do so by overridding this method.
// Invoke hook_entity_access() and hook_ENTITY_TYPE_access(). Hook results
// take precedence over overridden implementations of
// EntityAccessController::checkAccess(). Entities that have checks that
// need to be done before the hook is invoked should do so by overriding
// this method.
// We grant access to the entity if both of these conditions are met:
// - No modules say to deny access.
// - At least one module says to grant access.
$access
=
$this
->
moduleHandler
->
invokeAll
(
$entity
->
entityType
()
.
'_access'
,
array
(
$entity
,
$operation
,
$account
,
$langcode
));
$access
=
array_merge
(
$this
->
moduleHandler
->
invokeAll
(
'entity_access'
,
array
(
$entity
,
$operation
,
$account
,
$langcode
)),
$this
->
moduleHandler
->
invokeAll
(
$entity
->
entityType
()
.
'_access'
,
array
(
$entity
,
$operation
,
$account
,
$langcode
))
);
if
((
$return
=
$this
->
processAccessHookResults
(
$access
))
===
NULL
)
{
// No module had an opinion about the access, so let's the access
...
...
@@ -196,15 +200,19 @@ public function createAccess($entity_bundle = NULL, AccountInterface $account =
return
$access
;
}
// Invoke hook_entity_access(), hook results take precedence over overridden
// implementations of EntityAccessController::checkAccess(). Entities
// that have checks that need to be done before the hook is invoked should
// do so by overridding this method.
// Invoke hook_entity_create_access() and hook_ENTITY_TYPE_create_access().
// Hook results take precedence over overridden implementations of
// EntityAccessController::checkAccess(). Entities that have checks that
// need to be done before the hook is invoked should do so by overriding
// this method.
// We grant access to the entity if both of these conditions are met:
// - No modules say to deny access.
// - At least one module says to grant access.
$access
=
$this
->
moduleHandler
->
invokeAll
(
$this
->
entity_type
.
'_create_access'
,
array
(
$account
,
$context
[
'langcode'
]));
$access
=
array_merge
(
$this
->
moduleHandler
->
invokeAll
(
'entity_create_access'
,
array
(
$account
,
$context
[
'langcode'
])),
$this
->
moduleHandler
->
invokeAll
(
$this
->
entityType
.
'_create_access'
,
array
(
$account
,
$context
[
'langcode'
]))
);
if
((
$return
=
$this
->
processAccessHookResults
(
$access
))
===
NULL
)
{
// No module had an opinion about the access, so let's the access
...
...
core/modules/system/lib/Drupal/system/Tests/Entity/EntityAccessTest.php
View file @
2891848c
...
...
@@ -135,4 +135,24 @@ function testEntityTranslationAccess() {
'view'
=>
TRUE
,
),
$translation
);
}
/**
* Tests hook invocations.
*/
protected
function
testHooks
()
{
$state
=
$this
->
container
->
get
(
'state'
);
$entity
=
entity_create
(
'entity_test'
,
array
(
'name'
=>
'test'
,
));
// Test hook_entity_create_access() and hook_ENTITY_TYPE_create_access().
$entity
->
access
(
'create'
);
$this
->
assertEqual
(
$state
->
get
(
'entity_test_entity_create_access'
),
TRUE
);
$this
->
assertEqual
(
$state
->
get
(
'entity_test_entity_test_create_access'
),
TRUE
);
// Test hook_entity_access() and hook_ENTITY_TYPE_access().
$entity
->
access
(
'view'
);
$this
->
assertEqual
(
$state
->
get
(
'entity_test_entity_access'
),
TRUE
);
$this
->
assertEqual
(
$state
->
get
(
'entity_test_entity_test_access'
),
TRUE
);
}
}
core/modules/system/tests/modules/entity_test/entity_test.module
View file @
2891848c
...
...
@@ -6,6 +6,7 @@
*/
use
Drupal\Core\Entity\EntityInterface
;
use
Drupal\Core\Session\AccountInterface
;
use
Drupal\entity\Entity\EntityFormDisplay
;
use
Drupal\field\Entity\Field
;
use
Drupal\field\Entity\FieldInstance
;
...
...
@@ -529,3 +530,31 @@ function entity_test_entity_prepare_view($entity_type, array $entities, array $d
}
}
}
/**
* Implements hook_entity_access().
*/
function
entity_test_entity_access
(
EntityInterface
$entity
,
$operation
,
AccountInterface
$account
,
$langcode
)
{
\
Drupal
::
state
()
->
set
(
'entity_test_entity_access'
,
TRUE
);
}
/**
* Implements hook_ENTITY_TYPE_access().
*/
function
entity_test_entity_test_access
(
EntityInterface
$entity
,
$operation
,
AccountInterface
$account
,
$langcode
)
{
\
Drupal
::
state
()
->
set
(
'entity_test_entity_test_access'
,
TRUE
);
}
/**
* Implements hook_entity_create_access().
*/
function
entity_test_entity_create_access
(
AccountInterface
$account
,
$langcode
)
{
\
Drupal
::
state
()
->
set
(
'entity_test_entity_create_access'
,
TRUE
);
}
/**
* Implements hook_ENTITY_TYPE_create_access().
*/
function
entity_test_entity_test_create_access
(
AccountInterface
$account
,
$langcode
)
{
\
Drupal
::
state
()
->
set
(
'entity_test_entity_test_create_access'
,
TRUE
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment