d8c1a2e0
Yarik
Big commit artbox
|
1
|
<?php
|
8af13427
Yarik
For leha commit.
|
2
|
|
c70f24ea
Yarik
For Leha commit.
|
3
|
namespace common\behaviors;
|
8af13427
Yarik
For leha commit.
|
4
|
|
c70f24ea
Yarik
For Leha commit.
|
5
6
7
8
9
10
11
12
13
14
15
16
|
use Yii;
use yii\base\Action;
use yii\base\Event;
use yii\behaviors\AttributeBehavior;
use yii\di\Instance;
use yii\base\Module;
use yii\filters\AccessRule;
use yii\web\Request;
use yii\web\User;
use yii\web\ForbiddenHttpException;
class ArtBoxAccessBehavior extends AttributeBehavior
|
d8c1a2e0
Yarik
Big commit artbox
|
17
|
{
|
c70f24ea
Yarik
For Leha commit.
|
18
19
20
21
22
23
24
25
26
27
28
29
|
public $rules = [];
/**
* @var AccessRule[] $ruleList
*/
private $ruleList = [];
public function events()
{
return [
Module::EVENT_BEFORE_ACTION => 'interception',
|
d8c1a2e0
Yarik
Big commit artbox
|
30
31
|
];
}
|
c70f24ea
Yarik
For Leha commit.
|
32
33
34
35
36
37
38
39
40
41
|
/**
* Check whether current user have access to current action.
*
* @param Event $event
*
* @return void
* @throws \yii\web\ForbiddenHttpException
*/
public function interception($event)
|
d8c1a2e0
Yarik
Big commit artbox
|
42
|
{
|
c70f24ea
Yarik
For Leha commit.
|
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
if (!isset( Yii::$app->i18n->translations[ 'db_rbac' ] )) {
Yii::$app->i18n->translations[ 'db_rbac' ] = [
'class' => 'yii\i18n\PhpMessageSource',
'sourceLanguage' => 'ru-Ru',
'basePath' => '@developeruz/db_rbac/messages',
];
}
$route = Yii::$app->getRequest()
->resolve();
//Проверяем права по конфигу
$this->createRule();
$user = Instance::ensure(Yii::$app->user, User::className());
$request = Yii::$app->getRequest();
$action = $event->action;
if (!$this->cheсkByRule($action, $user, $request)) {
//И по AuthManager
if (!$this->checkPermission($route)) {
if ($user->getIsGuest()) {
$user->loginRequired();
} else {
throw new ForbiddenHttpException(Yii::t('db_rbac', 'Недостаточно прав'));
}
|
d8c1a2e0
Yarik
Big commit artbox
|
67
|
}
|
c70f24ea
Yarik
For Leha commit.
|
68
|
|
d8c1a2e0
Yarik
Big commit artbox
|
69
|
}
|
d8c1a2e0
Yarik
Big commit artbox
|
70
|
}
|
c70f24ea
Yarik
For Leha commit.
|
71
72
73
74
75
76
77
|
/**
* Fill $ruleList with AccessRules
*
* @return void
*/
protected function createRule()
|
d8c1a2e0
Yarik
Big commit artbox
|
78
|
{
|
c70f24ea
Yarik
For Leha commit.
|
79
80
81
82
83
84
85
86
87
|
foreach ($this->rules as $controller => $rule) {
foreach ($rule as $singleRule) {
if (is_array($singleRule)) {
$option = [
'controllers' => [ $controller ],
'class' => 'yii\filters\AccessRule',
];
$this->ruleList[] = Yii::createObject(array_merge($option, $singleRule));
}
|
d8c1a2e0
Yarik
Big commit artbox
|
88
89
90
|
}
}
}
|
c70f24ea
Yarik
For Leha commit.
|
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
/**
* Check whether the User allowed to perform action
*
* @param Action $action
* @param User $user
* @param Request $request
*
* @return bool
*/
protected function cheсkByRule($action, $user, $request)
{
foreach ($this->ruleList as $rule) {
if ($rule->allows($action, $user, $request)) {
return true;
}
}
return false;
|
d8c1a2e0
Yarik
Big commit artbox
|
111
|
}
|
c70f24ea
Yarik
For Leha commit.
|
112
113
114
115
116
117
118
119
120
|
/**
* Check whether the User have permission for current operation
*
* @param array $route
*
* @return bool
*/
protected function checkPermission($route)
|
d8c1a2e0
Yarik
Big commit artbox
|
121
|
{
|
c70f24ea
Yarik
For Leha commit.
|
122
123
124
125
|
//$route[0] - is the route, $route[1] - is the associated parameters
$routePathTmp = explode('/', $route[ 0 ]);
$routeVariant = array_shift($routePathTmp);
if (Yii::$app->user->can($routeVariant, $route[ 1 ])) {
|
d8c1a2e0
Yarik
Big commit artbox
|
126
|
return true;
|
c70f24ea
Yarik
For Leha commit.
|
127
128
129
130
131
132
133
134
135
136
137
|
}
/**
* @var string $routePart
*/
foreach ($routePathTmp as $routePart) {
$routeVariant .= '/' . $routePart;
if (Yii::$app->user->can($routeVariant, $route[ 1 ])) {
return true;
}
}
return false;
|
d8c1a2e0
Yarik
Big commit artbox
|
138
|
}
|
c70f24ea
Yarik
For Leha commit.
|
139
|
|
d8c1a2e0
Yarik
Big commit artbox
|
140
|
}
|
c70f24ea
Yarik
For Leha commit.
|
141
|
|