Commit ecf033672981009aefbd2b91005d51bc787ed282
1 parent
393a55ab
TEst
Showing
14 changed files
with
278 additions
and
27 deletions
Show diff stats
backend/controllers/SiteController.php
... | ... | @@ -29,16 +29,6 @@ class SiteController extends Controller |
29 | 29 | 'rules' => [ |
30 | 30 | [ |
31 | 31 | 'allow' => true, |
32 | - 'actions' => ['test'], | |
33 | - 'matchCallback' => function($rule, $action) { | |
34 | - return (Yii::$app->user->identity->id == 1); | |
35 | - }, | |
36 | - 'denyCallback' => function($rule, $action) { | |
37 | - var_dump(Yii::$app->user->identity->id); | |
38 | - }, | |
39 | - ], | |
40 | - [ | |
41 | - 'allow' => true, | |
42 | 32 | 'roles' => ['@'] |
43 | 33 | ], |
44 | 34 | ], |
... | ... | @@ -157,6 +147,11 @@ class SiteController extends Controller |
157 | 147 | |
158 | 148 | public function actionTest() |
159 | 149 | { |
150 | + echo "<pre>"; | |
151 | + //var_dump(Yii::$app->getAuthManager()->getRole('CHUVAK')); | |
152 | + //var_dump(Yii::$app->getAuthManager()->assign(Yii::$app->getAuthManager()->getRole('CHUVAK'), Yii::$app->user->getId())); | |
153 | + var_dump(Yii::$app->getAuthManager()->getRoles()); | |
154 | + echo "</pre>"; | |
160 | 155 | return $this->render('index'); |
161 | 156 | } |
162 | 157 | ... | ... |
1 | +<?php | |
2 | + | |
3 | + namespace common\components\rules; | |
4 | + | |
5 | + use yii\db\Query; | |
6 | + use yii\rbac\Rule; | |
7 | + | |
8 | + class CommentRule extends Rule | |
9 | + { | |
10 | + public $name = 'canComment'; | |
11 | + | |
12 | + public function execute ($user, $item, $params) | |
13 | + { | |
14 | + $auth = \Yii::$app->authManager; | |
15 | + $access = false; | |
16 | + if($params['record']) { | |
17 | + $roles = \Yii::$app->user->identity->getRoles(); | |
18 | + $permissions = []; | |
19 | + $queryRole = (new Query())->from('auth_table_access_group')->where(['in', 'role', $roles])->andWhere(['record_id' => $params['record']->primaryKey])->all(); | |
20 | + $queryUser = (new Query())->from('auth_table_access_user')->where(['user_id' => $user])->andWhere(['record_id' => $params['record']->primaryKey])->all(); | |
21 | + foreach($queryRole as $oneRole) | |
22 | + { | |
23 | + $permissions[] = $oneRole['permission']; | |
24 | + $permissions = array_merge($permissions, array_keys($auth->getPermissionsByRole($oneRole['permission']))); | |
25 | + } | |
26 | + foreach($queryUser as $oneUser) | |
27 | + { | |
28 | + $permissions[] = $oneUser['permission']; | |
29 | + $permissions = array_merge($permissions, array_keys($auth->getPermissionsByRole($oneUser['permission']))); | |
30 | + } | |
31 | + $access = in_array($item->name, array_unique($permissions)); | |
32 | + } | |
33 | + return $access; | |
34 | + } | |
35 | + | |
36 | + } | |
0 | 37 | \ No newline at end of file | ... | ... |
1 | +<?php | |
2 | + | |
3 | + namespace common\components\rules; | |
4 | + | |
5 | + use yii\db\Query; | |
6 | + use yii\rbac\Rule; | |
7 | + | |
8 | + class DeleteRule extends Rule | |
9 | + { | |
10 | + public $name = 'canDelete'; | |
11 | + | |
12 | + public function execute ($user, $item, $params) | |
13 | + { | |
14 | + $auth = \Yii::$app->authManager; | |
15 | + $access = false; | |
16 | + if($params['record']) { | |
17 | + $roles = \Yii::$app->user->identity->getRoles(); | |
18 | + $permissions = []; | |
19 | + $queryRole = (new Query())->from('auth_table_access_group')->where(['in', 'role', $roles])->andWhere(['record_id' => $params['record']->primaryKey])->all(); | |
20 | + $queryUser = (new Query())->from('auth_table_access_user')->where(['user_id' => $user])->andWhere(['record_id' => $params['record']->primaryKey])->all(); | |
21 | + foreach($queryRole as $oneRole) | |
22 | + { | |
23 | + $permissions[] = $oneRole['permission']; | |
24 | + $permissions = array_merge($permissions, array_keys($auth->getPermissionsByRole($oneRole['permission']))); | |
25 | + } | |
26 | + foreach($queryUser as $oneUser) | |
27 | + { | |
28 | + $permissions[] = $oneUser['permission']; | |
29 | + $permissions = array_merge($permissions, array_keys($auth->getPermissionsByRole($oneUser['permission']))); | |
30 | + } | |
31 | + $access = in_array($item->name, array_unique($permissions)); | |
32 | + } | |
33 | + return $access; | |
34 | + } | |
35 | + | |
36 | + } | |
0 | 37 | \ No newline at end of file | ... | ... |
1 | +<?php | |
2 | + | |
3 | + namespace common\components\rules; | |
4 | + | |
5 | + use yii\db\Query; | |
6 | + use yii\rbac\Rule; | |
7 | + | |
8 | + class UpdateRule extends Rule | |
9 | + { | |
10 | + public $name = 'canUpdate'; | |
11 | + | |
12 | + public function execute ($user, $item, $params) | |
13 | + { | |
14 | + $auth = \Yii::$app->authManager; | |
15 | + $access = false; | |
16 | + if($params['record']) { | |
17 | + $roles = \Yii::$app->user->identity->getRoles(); | |
18 | + $permissions = []; | |
19 | + $queryRole = (new Query())->from('auth_table_access_group')->where(['in', 'role', $roles])->andWhere(['record_id' => $params['record']->primaryKey])->all(); | |
20 | + $queryUser = (new Query())->from('auth_table_access_user')->where(['user_id' => $user])->andWhere(['record_id' => $params['record']->primaryKey])->all(); | |
21 | + foreach($queryRole as $oneRole) | |
22 | + { | |
23 | + $permissions[] = $oneRole['permission']; | |
24 | + $permissions = array_merge($permissions, array_keys($auth->getPermissionsByRole($oneRole['permission']))); | |
25 | + } | |
26 | + foreach($queryUser as $oneUser) | |
27 | + { | |
28 | + $permissions[] = $oneUser['permission']; | |
29 | + $permissions = array_merge($permissions, array_keys($auth->getPermissionsByRole($oneUser['permission']))); | |
30 | + } | |
31 | + $access = in_array($item->name, array_unique($permissions)); | |
32 | + } | |
33 | + return $access; | |
34 | + } | |
35 | + | |
36 | + } | |
0 | 37 | \ No newline at end of file | ... | ... |
1 | +<?php | |
2 | + | |
3 | + namespace common\components\rules; | |
4 | + | |
5 | + use yii\db\Query; | |
6 | + use yii\rbac\Rule; | |
7 | + | |
8 | + class ViewRule extends Rule | |
9 | + { | |
10 | + public $name = 'canView'; | |
11 | + | |
12 | + public function execute ($user, $item, $params) | |
13 | + { | |
14 | + $auth = \Yii::$app->authManager; | |
15 | + $access = false; | |
16 | + if($params['record']) { | |
17 | + $roles = \Yii::$app->user->identity->getRoles(); | |
18 | + $permissions = []; | |
19 | + $queryRole = (new Query())->from('auth_table_access_group')->where(['in', 'role', $roles])->andWhere(['record_id' => $params['record']->primaryKey])->all(); | |
20 | + $queryUser = (new Query())->from('auth_table_access_user')->where(['user_id' => $user])->andWhere(['record_id' => $params['record']->primaryKey])->all(); | |
21 | + foreach($queryRole as $oneRole) | |
22 | + { | |
23 | + $permissions[] = $oneRole['permission']; | |
24 | + $permissions = array_merge($permissions, array_keys($auth->getPermissionsByRole($oneRole['permission']))); | |
25 | + } | |
26 | + foreach($queryUser as $oneUser) | |
27 | + { | |
28 | + $permissions[] = $oneUser['permission']; | |
29 | + $permissions = array_merge($permissions, array_keys($auth->getPermissionsByRole($oneUser['permission']))); | |
30 | + } | |
31 | + $access = in_array($item->name, array_unique($permissions)); | |
32 | + } | |
33 | + return $access; | |
34 | + } | |
35 | + | |
36 | + } | |
0 | 37 | \ No newline at end of file | ... | ... |
common/config/main.php
... | ... | @@ -12,6 +12,9 @@ return [ |
12 | 12 | 'class' => 'common\modules\blog\Module', |
13 | 13 | ], |
14 | 14 | ], |
15 | + 'bootstrap' => [ | |
16 | + 'options', | |
17 | + ], | |
15 | 18 | 'components' => [ |
16 | 19 | 'cache' => [ |
17 | 20 | 'class' => 'yii\caching\FileCache', |
... | ... | @@ -169,7 +172,9 @@ return [ |
169 | 172 | /*========End======= |
170 | 173 | *end api sicial |
171 | 174 | * */ |
172 | - | |
175 | + 'options' => [ | |
176 | + 'class' => 'common\models\OptionHelper', | |
177 | + ] | |
173 | 178 | ], |
174 | 179 | 'language' => 'ru-RU' |
175 | 180 | ]; | ... | ... |
1 | +<?php | |
2 | + | |
3 | + namespace common\models; | |
4 | + | |
5 | + use yii\db\ActiveRecord; | |
6 | + use yii\web\ForbiddenHttpException; | |
7 | + | |
8 | + class ActiveRecordRule extends ActiveRecord | |
9 | + { | |
10 | + public static function find () | |
11 | + { | |
12 | + $table = self::tableName(); | |
13 | + $pk = self::primaryKey()[0]; | |
14 | + $query = parent::find (); | |
15 | + if (\Yii::$app->authManager && \Yii::$app->options->rule) | |
16 | + { | |
17 | + $authManager = \Yii::$app->authManager; | |
18 | + $roles = \Yii::$app->user->identity->roles; | |
19 | + $query->leftJoin ('auth_table_access_group', $table.'.'.$pk.' = auth_table_access_group.record_id') | |
20 | + ->leftJoin ('auth_table_access_user', $table.'.'.$pk.' = auth_table_access_user.record_id') | |
21 | + ->orWhere (['auth_table_access_group.model_name' => self::className (), 'auth_table_access_group.role' => $roles]) | |
22 | + ->orWhere (['auth_table_access_user.user_id' => \Yii::$app->user->getId(), 'auth_table_access_user.model_name' => self::className ()]); | |
23 | + } | |
24 | + return $query; | |
25 | + } | |
26 | + | |
27 | + public function delete () | |
28 | + { | |
29 | + $id = $this->primaryKey; | |
30 | + $result = parent::delete(); | |
31 | + if(is_int($id)) { | |
32 | + \Yii::$app->db->createCommand()->delete('auth_table_access_group', ['model_name' => self::className(), 'record_id' => $id])->execute(); | |
33 | + \Yii::$app->db->createCommand()->delete('auth_table_access_user', ['model_name' => self::className(), 'record_id' => $id])->execute(); | |
34 | + } | |
35 | + return $result; | |
36 | + } | |
37 | + | |
38 | + public function update ($runValidation = true, $attributeNames = null) | |
39 | + { | |
40 | + if(\Yii::$app->user->can('updateRecord', ['record' => $this])) { | |
41 | + return parent::update ($runValidation, $attributeNames); | |
42 | + } else { | |
43 | + throw new ForbiddenHttpException(\Yii::t('app', 'Permission denied')); | |
44 | + } | |
45 | + } | |
46 | + } | |
0 | 47 | \ No newline at end of file | ... | ... |
1 | +<?php | |
2 | + | |
3 | +namespace common\models; | |
4 | + | |
5 | +use frontend\models\Options; | |
6 | +use Yii; | |
7 | +use yii\base\InvalidParamException; | |
8 | +use yii\base\Model; | |
9 | + | |
10 | +class OptionHelper extends Model | |
11 | +{ | |
12 | + const OPTION_OBJECT = 1; | |
13 | + const OPTION_ARRAY = 2; | |
14 | + const OPTION_VALUE = 3; | |
15 | + public function getRule($return = 3) | |
16 | + { | |
17 | + $result = Options::find()->where(['name' => 'rules'])->with('value'); | |
18 | + if($return == self::OPTION_OBJECT) { | |
19 | + return $result->one(); | |
20 | + } elseif($return == self::OPTION_ARRAY) { | |
21 | + return $result->asArray()->one(); | |
22 | + } elseif($return == self::OPTION_VALUE) { | |
23 | + return $result->one()->value->value; | |
24 | + } else { | |
25 | + throw new InvalidParamException(Yii::t('app', 'Must be 1-3')); | |
26 | + } | |
27 | + } | |
28 | +} | ... | ... |
common/models/Tools.php
common/models/User.php
... | ... | @@ -228,4 +228,29 @@ class User extends ActiveRecord implements IdentityInterface, UserRbacInterface |
228 | 228 | { |
229 | 229 | return $this->username; |
230 | 230 | } |
231 | + | |
232 | + public function getRoles() | |
233 | + { | |
234 | + $auth = \Yii::$app->authManager; | |
235 | + $roles = $this->getRoleChildrenRecursive($auth->getRolesByUser($this->id), $auth); | |
236 | + return $roles; | |
237 | + } | |
238 | + | |
239 | + protected function getRoleChildrenRecursive($roles, $auth, $result = []) | |
240 | + { | |
241 | + if(is_array($roles) && !empty($roles)) | |
242 | + { | |
243 | + foreach($roles as $role => $item) | |
244 | + { | |
245 | + if(!($item instanceof \yii\rbac\Role)) { | |
246 | + continue; | |
247 | + } | |
248 | + $result[] = $role; | |
249 | + $result = self::getRoleChildrenRecursive($auth->getChildren($role), $auth, $result); | |
250 | + } | |
251 | + return $result; | |
252 | + } else { | |
253 | + return $result; | |
254 | + } | |
255 | + } | |
231 | 256 | } | ... | ... |
common/modules/blog/controllers/ArticleController.php
1 | 1 | <?php |
2 | 2 | namespace common\modules\blog\controllers; |
3 | 3 | |
4 | +use common\components\rules\CommentRule; | |
5 | +use common\components\rules\DeleteRule; | |
6 | +use common\components\rules\UpdateRule; | |
7 | +use common\components\rules\ViewRule; | |
4 | 8 | use common\models\Language; |
5 | 9 | use common\modules\blog\models\Article; |
6 | 10 | use common\modules\blog\models\ArticleLang; |
7 | 11 | use common\modules\blog\models\ArticleMedia; |
8 | 12 | use common\modules\blog\models\ArticleToCategory; |
9 | 13 | use yii\data\ActiveDataProvider; |
14 | +use yii\rbac\DbManager; | |
10 | 15 | use yii\web\Controller; |
11 | 16 | use yii\web\UploadedFile; |
12 | 17 | |
... | ... | @@ -15,6 +20,7 @@ class ArticleController extends Controller |
15 | 20 | |
16 | 21 | public function actionIndex() |
17 | 22 | { |
23 | + var_dump(\Yii::$app->options->rule); | |
18 | 24 | $dataProvider = new ActiveDataProvider([ |
19 | 25 | 'query' => Article::find(), |
20 | 26 | 'pagination' => [ | ... | ... |
common/modules/blog/models/Article.php
... | ... | @@ -2,6 +2,7 @@ |
2 | 2 | |
3 | 3 | namespace common\modules\blog\models; |
4 | 4 | |
5 | +use common\models\ActiveRecordRule; | |
5 | 6 | use common\models\Media; |
6 | 7 | use common\models\User; |
7 | 8 | use common\modules\blog\behaviors\Autocomplete; |
... | ... | @@ -31,7 +32,7 @@ use yii\db\Query; |
31 | 32 | * @property ArticleToCategory[] $articleToCategories |
32 | 33 | * @property Media[] $media |
33 | 34 | */ |
34 | -class Article extends \yii\db\ActiveRecord | |
35 | +class Article extends ActiveRecordRule | |
35 | 36 | { |
36 | 37 | /** |
37 | 38 | * @inheritdoc |
... | ... | @@ -158,4 +159,5 @@ class Article extends \yii\db\ActiveRecord |
158 | 159 | { |
159 | 160 | return $this->getArticleToCategories()->select('article_category_id')->column(); |
160 | 161 | } |
162 | + | |
161 | 163 | } | ... | ... |
db-migration/yarik/all.backup
No preview for this file type
frontend/models/Options.php
... | ... | @@ -5,7 +5,7 @@ namespace frontend\models; |
5 | 5 | use Yii; |
6 | 6 | |
7 | 7 | /** |
8 | - * This is the model class for table "options". | |
8 | + * This is the model class for table "option". | |
9 | 9 | * |
10 | 10 | * @property integer $option_id |
11 | 11 | * @property string $option_key |
... | ... | @@ -22,43 +22,42 @@ class Options extends \yii\db\ActiveRecord |
22 | 22 | /** |
23 | 23 | * @inheritdoc |
24 | 24 | */ |
25 | - public static function tableName() | |
25 | + public static function tableName () | |
26 | 26 | { |
27 | - return 'options'; | |
27 | + return 'option'; | |
28 | 28 | } |
29 | 29 | |
30 | 30 | /** |
31 | 31 | * @inheritdoc |
32 | 32 | */ |
33 | - public function rules() | |
33 | + public function rules () | |
34 | 34 | { |
35 | 35 | return [ |
36 | - [['option_key'], 'required'], | |
37 | - [['option_parent', 'option_translatable'], 'integer'], | |
38 | - [['option_key', 'option_format'], 'string', 'max' => 200] | |
36 | + [['option_key'], 'required'], [['option_parent', 'option_translatable'], 'integer'], [['option_key', 'option_format'], 'string', 'max' => 200] | |
39 | 37 | ]; |
40 | 38 | } |
41 | 39 | |
42 | 40 | /** |
43 | 41 | * @inheritdoc |
44 | 42 | */ |
45 | - public function attributeLabels() | |
43 | + public function attributeLabels () | |
46 | 44 | { |
47 | 45 | return [ |
48 | - 'option_id' => Yii::t('app', 'Option ID'), | |
49 | - 'option_key' => Yii::t('app', 'Option Key'), | |
50 | - 'option_parent' => Yii::t('app', 'Option Parent'), | |
51 | - 'option_translatable' => Yii::t('app', 'Option Translatable'), | |
52 | - 'option_format' => Yii::t('app', 'Option Format'), | |
46 | + 'option_id' => Yii::t ('app', 'Option ID'), 'option_key' => Yii::t ('app', 'Option Key'), 'option_parent' => Yii::t ('app', 'Option Parent'), 'option_translatable' => Yii::t ('app', 'Option Translatable'), 'option_format' => Yii::t ('app', 'Option Format'), | |
53 | 47 | ]; |
54 | 48 | } |
55 | 49 | |
56 | 50 | /** |
57 | 51 | * @return \yii\db\ActiveQuery |
58 | 52 | */ |
59 | - public function getOptionValues() | |
53 | + public function getOptionLang () | |
60 | 54 | { |
61 | - return $this->hasMany(OptionValues::className(), ['option_id' => 'option_id']); | |
55 | + return $this->hasMany (OptionLang::className (), ['option_id' => 'option_id']); | |
56 | + } | |
57 | + | |
58 | + public function getValue () | |
59 | + { | |
60 | + return $this->hasOne(OptionLang::className(), ['option_id' => 'option_id'])->where(['option_lang.language_id' => '0']); | |
62 | 61 | } |
63 | 62 | |
64 | 63 | /** | ... | ... |