Commit ecf033672981009aefbd2b91005d51bc787ed282

Authored by Yarik
1 parent 393a55ab

TEst

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  
... ...
common/components/rules/CommentRule.php 0 → 100644
  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
... ...
common/components/rules/DeleteRule.php 0 → 100644
  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
... ...
common/components/rules/UpdateRule.php 0 → 100644
  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
... ...
common/components/rules/ViewRule.php 0 → 100644
  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 ];
... ...
common/models/ActiveRecordRule.php 0 → 100644
  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
... ...
common/models/OptionHelper.php 0 → 100644
  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
... ... @@ -2,6 +2,7 @@
2 2  
3 3 namespace common\models;
4 4  
  5 +
5 6 class Tools
6 7 {
7 8 /**
... ...
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 /**
... ...