yii2mod / yii2-comments

Comments module for Yii2
MIT License
158 stars 63 forks source link

Some questions! #73

Closed vystepanenko closed 7 years ago

vystepanenko commented 7 years ago

Hello! I'm new to yii2 and if you dont mind I'll ask you some question. I'm use yii2-advanced template. Added your module via composer. Migrate all migrations without errors. Added to "common/config/main.php" this config string " 'modules' => [ 'comment' => [ 'class' => 'yii2mod\comments\Module', ],] " 1) If i havent config RBAC yet(but i have users table with user_role attribute) can I somehow access management section? 2) Can I somehow make access to management section only from backend? for example backedn.mydomain.com/commets/index ?

ihorchepurnyi commented 7 years ago
  1. You need to setup RBAC for security on your website.
  2. Yes, you can make access to comment management section in the backend module, use the folowing code for this:

In your backend configuration, backend/config/main.php:

'controllerMap' => [
     'comment' => \yii2mod\comments\controllers\ManageController::class,
],
'components' => [
......
],

In your common configuration, common/config/main.php

    'modules' => [
        'comment' => [
            'class' => 'yii2mod\comments\Module',
        ],
    ],

Then you can use the following url for access to comment management page: http://backend.your-domain.com/comment

ihorchepurnyi commented 7 years ago

But, only users with admin role can access to this page.

ihorchepurnyi commented 7 years ago

If you want to access without rbac to comment managemet page, you can use the following configuration:

    'controllerMap' => [
        'comment' => [
            'class' => \yii2mod\comments\controllers\ManageController::class,
            'accessControlConfig' => [
                'class' => 'yii\filters\AccessControl',
                'rules' => [
                    [
                        'allow' => true,
                    ],
                ],
            ]
        ],
    ],

But, this is the bad approach!

vystepanenko commented 7 years ago

Thanks for your reply. I definitely will use RBAC. It's just for test

vystepanenko commented 7 years ago

А можно еще парочку глупых вопросов от новичка? Прежде всего я пока все делаю на бэкенде.(тестовый сервер, тренируюсь) Мои настройки: В composer.json:

  "require": {
        ....
        "yii2mod/yii2-comments": "*"
    },

В common/config/main.php:

 'modules' => [
        'comment' => [
            'class' => 'yii2mod\comments\Module',
        ],

В backend/config/main.php

...
   'controllerMap' => [
     'comment' => \yii2mod\comments\controllers\ManageController::class,
],
....
'urlManager' => [
            'scriptUrl' => 'index.php',
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
                '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
                '<module:\w+>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>',
            ],
  1. Не могу попасть на панель управления. Если отключаю проверку доступа(как подсказано выше) то все работает. Если же в backend/config/main.php оставляю только:
    'controllerMap' => [
     'comment' => \yii2mod\comments\controllers\ManageController::class,
    ],

    Получаю ошибку, что нет доступа к этому action: ...-][error][yii\web\HttpException:403] yii\web\ForbiddenHttpException: You are not allowed to perform this action. in /app/vendor/yiisoft/yii2/filters/AccessControl.php:154

Хотя Yii говорит мне, что моя роль admin image

  1. При попытке сохранить комментарий получаю ошибку image
ihorchepurnyi commented 7 years ago

Покажите пожалуйста ошибку, мне так сложно понять

ihorchepurnyi commented 7 years ago

Добавьте в комментарий целиком всю ошибку

vystepanenko commented 7 years ago

Ошибка при добавлении комментария

2017-07-17 11:43:23 [192.168.83.1][1][-][error][yii\web\HttpException:404] yii\base\InvalidRouteException: Unable to resolve the request: comment/default/create in /app/vendor/yiisoft/yii2/base/Controller.php:127
Stack trace:
#0 /app/vendor/yiisoft/yii2/base/Module.php(523): yii\base\Controller->runAction('default/create', Array)
#1 /app/vendor/yiisoft/yii2/web/Application.php(102): yii\base\Module->runAction('comment/default...', Array)
#2 /app/vendor/yiisoft/yii2/base/Application.php(380): yii\web\Application->handleRequest(Object(yii\web\Request))
#3 /app/backend/web/index.php(17): yii\base\Application->run()
#4 {main}

Next yii\web\NotFoundHttpException: Page not found. in /app/vendor/yiisoft/yii2/web/Application.php:114
Stack trace:
#0 /app/vendor/yiisoft/yii2/base/Application.php(380): yii\web\Application->handleRequest(Object(yii\web\Request))
#1 /app/backend/web/index.php(17): yii\base\Application->run()
#2 {main}
2017-07-17 11:43:23 [192.168.83.1][1][-][info][application] $_GET = [
    'entity' => ':B39£æÿYH…ß삕›df1f9d0c066b90e500788cc0b0d1c8f5b10cbeba92b6193d55801fd2f521e870o¼tGa3,(ÛPRfim]É]F­£Ä‘<«É|±Á,R
®éÙ+½uÄÛüDH—>oc»„Þ\"sǏ
)³¿DÿÅlæ3W¼|M󋆋$ÒåwêJqdB'
]
ihorchepurnyi commented 7 years ago

Запрос идет на фронтенд часть при добавлении комментария через форму?

ihorchepurnyi commented 7 years ago

Возможно вам нужно добавить след. правила в конфиг на фронтенде

'rules' => [
             '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
             '<module:\w+>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>',
],
vystepanenko commented 7 years ago

Насколько я могу судить запрос остается на бэкенде.

 'SCRIPT_FILENAME' => '/app/backend/web/index.php'
    'REDIRECT_STATUS' => '200'
    'SERVER_NAME' => 'admin.domain.dev'
    'SERVER_PORT' => '80'
    'SERVER_ADDR' => '192.168.83.137'
    'REMOTE_PORT' => '14634'
    'REMOTE_ADDR' => '192.168.83.1'
    'SERVER_SOFTWARE' => 'nginx/1.10.3'
    'GATEWAY_INTERFACE' => 'CGI/1.1'
    'REQUEST_SCHEME' => 'http'
    'SERVER_PROTOCOL' => 'HTTP/1.1'
    'DOCUMENT_ROOT' => '/app/backend/web'
    'DOCUMENT_URI' => '/index.php'
    'REQUEST_URI' => '/comment/default/create?entity=%C3%A6%40%C3%80%C3%9D%C3%BD%C3%A4b%C2%A6%C2%80%C3%88%06%C2%9A%C3%B8%C3%9F%1Evd172d9b7303ed024536ed7f1e3ace24b8e27ffcee78d139d971a35598e714468w%3Br%C2%91%5E%3B%C3%A8%C2%94I%5E%C3%87p%C2%BB%0F%C2%B8N%C2%9Fi%1E%C3%B6%C3%BE%C3%88%C2%93%C2%A6j%21%C2%AE+%C2%A3%C3%8BV%3F%19z%C2%A3%C2%B6m%C3%A4%08%16%3F%C3%B2%C2%8D%C3%803%C2%AA%C3%B6%2C%5C%C2%98%C2%BE%C3%B6H%C3%B0%05S%C2%84%21%C3%8E%5E%C3%B1%5E5H%19%C3%B9%14%04o%C2%A0%C3%B3aa%C2%94u1%2F%3E%05%C3%85%C2%B0%C2%B6H%C3%A3%C3%90K%C2%98%C2%93e%C3%A8%C3%A4H%40%C3%A2l%01'
    'SCRIPT_NAME' => '/index.php'

Пробовал добавить указанные правила в frontend/config/main.php - не помогло :(

ihorchepurnyi commented 7 years ago

Такс, вьюха с комментариями у вас на фронтенде, но запрос идет на бекенд. Пока не понимаю в чем проблема и как такое возможно. Вечером гляну, пока трудно сказать

vystepanenko commented 7 years ago

Нет. У меня все на бэке. Вьюха с комментариями тоже на бэке http://admin.domain.dev/products/view?id=1

ihorchepurnyi commented 7 years ago

ну если вьюха на беке, тогда вот этот код нужно на бек добавить

 'modules' => [
      'comment' => [
          'class' => 'yii2mod\comments\Module',
     ],
],

А вот этот убрать

'controllerMap' => [
     'comment' => \yii2mod\comments\controllers\ManageController::class,
],
ihorchepurnyi commented 7 years ago

А также, этот код уберите из common/main.php

 'modules' => [
      'comment' => [
          'class' => 'yii2mod\comments\Module',
     ],
],
vystepanenko commented 7 years ago

Осознал свою глупость 👍 Комменты сохраняются и отображаются в во вьюхе без проблем.

Но вопрос с панелью управления при такой конфигурации остается открытым. Если убрать вот это из backend/config/main.php :

'controllerMap' => [ 
     'comment' => \yii2mod\comments\controllers\ManageController::class,
],

то невозможно попасть на панель управления из бэка. Ругается на что не может обработать запрос yii\base\InvalidRouteException: Unable to resolve the request: comment/default/ in /app/vendor/yiisoft/yii2/base/Controller.php:127

Пробовал вот такую конфигурацию в backend/config/main.php

   'modules' => [
    ....
         'comment' => [
             'class' => 'yii2mod\comments\Module',
                 'controllerMap' => [
                  'default' => \yii2mod\comments\controllers\ManageController::class,
        ],
    ],
    ],

При такой конфигурации опять не могу попасть из-за ошибки доступа:

An Error occurred while handling another error:
yii\base\InvalidRouteException: Unable to resolve the request: site/error in /app/vendor/yiisoft/yii2/base/Controller.php:127
Stack trace:
#0 /app/vendor/yiisoft/yii2/base/Module.php(523): yii\base\Controller->runAction('error', Array)
#1 /app/vendor/yiisoft/yii2/web/ErrorHandler.php(97): yii\base\Module->runAction('site/error')
#2 /app/vendor/yiisoft/yii2/base/ErrorHandler.php(111): yii\web\ErrorHandler->renderException(Object(yii\web\ForbiddenHttpException))
#3 [internal function]: yii\base\ErrorHandler->handleException(Object(yii\web\ForbiddenHttpException))
#4 {main}
Previous exception:
yii\web\ForbiddenHttpException: You are not allowed to perform this action. in /app/vendor/yiisoft/yii2/filters/AccessControl.php:154
Stack trace:
#0 /app/vendor/yiisoft/yii2/filters/AccessControl.php(137): yii\filters\AccessControl->denyAccess(Object(yii\web\User))
#1 /app/vendor/yiisoft/yii2/base/ActionFilter.php(75): yii\filters\AccessControl->beforeAction(Object(yii\base\InlineAction))
#2 [internal function]: yii\base\ActionFilter->beforeFilter(Object(yii\base\ActionEvent))
#3 /app/vendor/yiisoft/yii2/base/Component.php(545): call_user_func(Array, Object(yii\base\ActionEvent))
#4 /app/vendor/yiisoft/yii2/base/Controller.php(272): yii\base\Component->trigger('beforeAction', Object(yii\base\ActionEvent))
#5 /app/vendor/yiisoft/yii2/web/Controller.php(164): yii\base\Controller->beforeAction(Object(yii\base\InlineAction))
#6 /app/vendor/yiisoft/yii2/base/Controller.php(154): yii\web\Controller->beforeAction(Object(yii\base\InlineAction))
#7 /app/vendor/yiisoft/yii2/base/Module.php(523): yii\base\Controller->runAction('', Array)
#8 /app/vendor/yiisoft/yii2/web/Application.php(102): yii\base\Module->runAction('comment', Array)
#9 /app/vendor/yiisoft/yii2/base/Application.php(380): yii\web\Application->handleRequest(Object(yii\web\Request))
#10 /app/backend/web/index.php(17): yii\base\Application->run()
#11 {main}

Плюс опять не сохраняются комментарии.

ihorchepurnyi commented 7 years ago

Вечерком гляну, сейчас не смогу помочь

ihorchepurnyi commented 7 years ago

Если будет актуально для вас

vystepanenko commented 7 years ago

Если вас не затруднит :)

В целом я думаю есть ли смысл вообще с этим заморачиваться и пробовать лепить все на бэк? Если у меня вьюхи будут на фронте(модуль будет подключен в common/config) а панель управления на бэке, с помощью вот этого в backend/config :

'controllerMap' => [ 
     'comment' => \yii2mod\comments\controllers\ManageController::class,
],

То все ж должно работать без проблем?

ihorchepurnyi commented 7 years ago

да, конечно, недавно пробовал c yii2-advanced, модуль работал без проблем.

vystepanenko commented 7 years ago

Тогда остался тока вопрос почему меня с ролью admin не пускает в панель управления, а если добавляю вот это в backend/config:

  'controllerMap' => [
        'comment' => [
            'class' => \yii2mod\comments\controllers\ManageController::class,
            'accessControlConfig' => [
                'class' => 'yii\filters\AccessControl',
                'rules' => [
                    [
                        'allow' => true,
                    ],
                ],
            ]
        ],
    ],

то проблем нет. Но пускает конечно тогда абсолютно всех

ihorchepurnyi commented 7 years ago

сложно сказать, что у вас отдает такой код?

var_dump(\Yii::$app->user->can('admin'));
vystepanenko commented 7 years ago

/app/backend/controllers/ProductsController.php:57:boolean false

ihorchepurnyi commented 7 years ago

значит у вас роль не 'admin'

vystepanenko commented 7 years ago

А если доступ реализован не через RBAC, а просто через АСF можно ли как-то сконфигурировать ваш модуль для доступа к панели управления?

ihorchepurnyi commented 7 years ago

Так он через него и работает, посмотрите в контроллер, там конфиги применяются через класс AccessControl

ihorchepurnyi commented 7 years ago

Просто требуется роль - admin

ihorchepurnyi commented 7 years ago

Вот вы же сами конфигурировали

                'class' => 'yii\filters\AccessControl',
                'rules' => [
                    [
                        'allow' => true,
                    ],
                ],
vystepanenko commented 7 years ago

Еще раз осознал свою глупость)

Относледовался от вашего класса. Заменил функцию behaviors() на свою с проверкой на админа и все заработало!

Спасибо за помощь 👍

ihorchepurnyi commented 7 years ago

не за что!