Yii2 basic template + yii2-usuario

Ciao a tutti, non sono un esperto del framework premetto, ma testando le varie estensioni per l’utilizzo di RBAC con un template BASIC, non ho trovato alcun sistema funzionante correttamente.
Qualcuno saprebbe darmi una dritta? Sono interessato ad un semplice template BASIC con l’implementazione di RBAC in quanto necessito di diverse soluzioni di accesso a livelli di responsabilita’.
Vi ringrazio in anticipo.
Su GITHUB ho provato varie soluzioni, ma niente di stabile.

Noi usiamo yii2-usuario e ci troviamo bene (spoiler: abbiamo un marginale coinvolgimento nello sviluppo).

Ok. Grazie per l’indicazione. yii2-usuario è integrato in alcuni progetti su github ma non è uno dei pochi su cui non ho testato l’integrazione su un basic da configurare. Una volta testato posto gli eventuali errori che faccio. Sono convinto che ci sia qualche lacuna grave sulle modifiche che dovrei apportare sui models e controller relativi all’user. Ancora grazie per il consiglio.

Innanzitutto scusami per il ritardo della mia risposta ma volevo cercare di risolvere utilizzando l’estensione che mi hai consigliato e che personalmente trovo la piu’ valida.

Di seguito ti posto i dati e le operazioni fatte:

  1. Software utilizzati:

    • Laragon Full 4.0.16
    • Apache 2.4.41 x64
    • Mysql 5.7.24 x64
    • Php 7.2.19 ts x64 ( originariamente avevo la versione 7.4.1)
  2. Framework

    • Yii2 basic 2.0.32
  3. Estensioni installate

    • yii2-usuario (installato tramite composer e eseguite le migrazioni, inclusa quella creata come da guida dell’estensione per la creazione dell’utente e assegnazione del ruolo)
  4. Problema

    • user/admin/index restituisce errore Forbidden 403, precedentemente ho controllato sul database se esistesse l’utente e le assegnazioni e dopo ho anche testato il login con successo.

Non capisco davvero dove sbaglio, di seguito posto le modifiche fatte.

Ho creato la migrazione per inserire l’utente amministratore e il ruolo

migrations

use yii\db\Migration;

class m200124_074421_m000000_000010_add_administrator extends Migration
{
public function safeUp()
{
$auth = Yii::$app->authManager;

    // create a role named "administrator"
    $administratorRole = $auth->createRole('administrator');
    $administratorRole->description = 'Administrator';
    $auth->add($administratorRole);

    // create permission for certain tasks
    $permission = $auth->createPermission('user-management');
    $permission->description = 'User Management';
    $auth->add($permission);

    // let administrators do user management
    $auth->addChild($administratorRole, $auth->getPermission('user-management'));

    // create user "admin" with password "verysecret"
    $user = new \Da\User\Model\User([
        'scenario' => 'create',
        'email' => "email@example.com",
        'username' => "admin",
        'password' => "verysecret"  // >6 characters!
    ]);
    $user->confirmed_at = time();
    $user->save();

    // assign role to our admin-user
    $auth->assign($administratorRole, $user->id);
}

public function safeDown()
{
    $auth = Yii::$app->authManager;

    // delete permission
    $auth->remove($auth->getPermission('user-management'));

    // delete admin-user and administrator role
    $administratorRole = $auth->getRole("administrator");
    $user = \Da\User\Model\User::findOne(['name'=>"admin"]);
    $auth->revoke($administratorRole, $user->id);
    $user->delete();

}

}

Successivamente ho modificato la configurazione

config/console.php
<?php

$params = require DIR . ‘/params.php’;
$db = require DIR . ‘/db.php’;

$config = [
‘id’ => ‘basic-console’,
‘basePath’ => dirname(DIR),
‘bootstrap’ => [‘log’],
‘controllerNamespace’ => ‘app\commands’,
‘aliases’ => [
@bower’ => ‘@vendor/bower-asset’,
@npm’ => ‘@vendor/npm-asset’,
@tests’ => ‘@app/tests’,
],
‘modules’ => [
‘user’ => [
‘class’ => Da\User\Module::class,
]
],
‘components’ => [
‘cache’ => [
‘class’ => ‘yii\caching\FileCache’,
],
‘log’ => [
‘targets’ => [
[
‘class’ => ‘yii\log\FileTarget’,
‘levels’ => [‘error’, ‘warning’],
],
],
],
‘db’ => $db,
‘authManager’ => [
‘class’ => ‘Da\User\Component\AuthDbManagerComponent’,
],
],
‘params’ => $params,
‘controllerMap’ => [
‘migrate’ => [
‘class’ => \yii\console\controllers\MigrateController::class,
‘migrationPath’ => [
@app/migrations’,
@yii/rbac/migrations’,
],
‘migrationNamespaces’ => [
‘Da\User\Migration’,
],
],
],
];

if (YII_ENV_DEV) {
// configuration adjustments for ‘dev’ environment
$config[‘bootstrap’][] = ‘gii’;
$config[‘modules’][‘gii’] = [
‘class’ => ‘yii\gii\Module’,
];
}

return $config;

config/web.php

$params = require DIR . ‘/params.php’;
$db = require DIR . ‘/db.php’;

$config = [
‘id’ => ‘basic’,
‘basePath’ => dirname(DIR),
‘bootstrap’ => [‘log’],
‘aliases’ => [
@bower’ => ‘@vendor/bower-asset’,
@npm’ => ‘@vendor/npm-asset’,
],
‘modules’ => [
‘user’ => [
‘class’ => Da\User\Module::class,
]
],
‘components’ => [
‘request’ => [
// !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
‘cookieValidationKey’ => ‘***********************************’,
],
‘cache’ => [
‘class’ => ‘yii\caching\FileCache’,
],
‘errorHandler’ => [
‘errorAction’ => ‘site/error’,
],
‘authManager’ => [
‘class’ => ‘Da\User\Component\AuthDbManagerComponent’,
],
‘mailer’ => [
‘class’ => ‘yii\swiftmailer\Mailer’,
// send all mails to a file by default. You have to set
// ‘useFileTransport’ to false and configure a transport
// for the mailer to send real emails.
‘useFileTransport’ => true,
],
‘log’ => [
‘traceLevel’ => YII_DEBUG ? 3 : 0,
‘targets’ => [
[
‘class’ => ‘yii\log\FileTarget’,
‘levels’ => [‘error’, ‘warning’],
],
],
],
‘db’ => $db,
/*
‘urlManager’ => [
‘enablePrettyUrl’ => true,
‘showScriptName’ => false,
‘rules’ => [
],
],
*/
],
‘params’ => $params,
];

Ho testato il login e il logout e tutto funziona correttamente, se devo accedere alla parte admin, inserendo il link user/admin invece non risulto autorizzato.

errore 403

Mi sono sicuramente perso qualcosa, ma non trovo riferimenti, quell’errore non dovrebbe darlo con l’account admin e mi sono accertato che anche sul database fossero presenti tabelle e gli inserimenti dalle migrazioni lanciate e risulta tutto…
Sono ad un punto morto…

Risolto grazie a @maxxer.

Modificato config/web.php

    'modules' => [
        'user' => [
        'class' => Da\User\Module::class,
       'administrators' => ['admin'], --> riga aggiunta per impostare administrators
]

]

Grazie funziona!

1 Like

Ciao, ho una domanda su quest’estensione. Ho usato in passato dektrium (che contiene l’apposito pannello “routes”), come faccio invece qui ad assegnare ad un utente le route consentite?

Ciao. Non ricordavo questa funzione in Dektrium, ma non mi risulta ci sia una cosa simile in Usuario. Non mi è chiaro però come funziona, puoi mettere una breve descrizione o un link alla documentazione?

Ciao maxxer e grazie per la tua risposta. Premetto che sono un pò arruginito in materia.
In immagine 1 lo screenshot della schermata di route che utilizzai qualche anno fa per il software che realizzai. Rivedendola ho notato che probabilmente è Yii2 RBAC non direttamente usuario (sono riuscito ad accedervi tramite il percorso “/admin/route”).

Quello che vorrei fare è che gli utenti che non hanno una determinta route assegnata tipo mycontroller/myaction (direttamente o tramite il loro ruolo) non possano accedere al percorso mycontroller/myaction ma non ricordo come implementare questo controllo. devo metterlo in behaviors() in ogni controller? (al momento tutti gli utenti sembrano poter accedere ai percorsi anche senza la route assegnata - sto lavorando su una installazione pulita di yii2-advanced + usuario, modificato solo il tema grafico)

con Usuario di solito si fa a livello di singolo controller. definisci quali sono i ruoli o meglio i permessi e cosa possono fare

Ciao,

@wizardman mi sono imbattuto nel tuo stesso problema qualche tempo fa con usuario.
Alla fine uso insieme usuario ed rbac.
Con usuario creo il ruolo, gli aggiungo i permessi, ed rbac controlla i permessi.
Più che altro per permettere ad un utente finale di crearsi e gestirsi i ruoli e permessi in maniera capillare senza modificare il codice.
Quello di aggiungerlo in ogni controller mi risulta leggermente più scomodo.

Sarebbe una funzione interessante da integrare ad usuario.
@maxxer dici che sarebbe fattibile? (chiedo a te in quanto ho visto su github che sei un collaborator di usuario)

Se qualcuno ha voglia di fare una PR ci si può pensae :smiley:

Mi ricordo che c’era una gestione simile dei permessi per Yii1, con l’estensione usergroups, però era più limitata.

Con Yii1 utilizzavo l’estensione Rights che funzionava come yii2-rbac
se trovo il tempo provo a proporre un PR

1 Like