Behavior for user simple (view + id) doesn't work [solved]

Hey fellas, I’m trying to show the ‘alumno’ view by an alumno->id only to the simple user.

I’ve been trying this with no success on AlumnoController

'actions' => ['view', 'id' => $alumno->id]

and also this

'actions' => [['view', 'id' => $alumno->id]]

Here’s the code.

public function behaviors()
    {
        $user = Users::findOne(Yii::$app->user->identity->id);
        $alumno = Alumno::find()->where(['apoderado_id' => $user->id_apoderado])->one();
        
        return [
            'access' => [
                'class' => AccessControl::className(),
                //Acciones incluidas
                'only' => ['index', 'view', 'create', 'update', 'delete'],
                'rules' => [
                    [
                        //El super admin tiene permisos sobre las siguientes acciones
                        'actions' => ['index', 'view', 'create', 'update', 'delete'],
                        //Esta propiedad establece que tiene permisos
                        'allow' => true,
                        //Usuarios autenticados, el signo ? es para invitados
                        'roles' => ['@'],
                        //Este método nos permite crear un filtro sobre la identidad del usuario
                        //y así establecer si tiene permisos o no
                        'matchCallback' => function ($rule, $action) {
                        //Llamada al método que comprueba si es un superadministrador
                            return User::isSuperAdmin(Yii::$app->user->identity->id);
                        },
                   ],
                    [
                        //El administrador tiene permisos sobre las siguientes acciones
                        'actions' => ['index', 'view', 'update'],
                        //Esta propiedad establece que tiene permisos
                        'allow' => true,
                        //Usuarios autenticados, el signo ? es para invitados
                        'roles' => ['@'],
                        //Este método nos permite crear un filtro sobre la identidad del usuario
                        //y así establecer si tiene permisos o no
                        'matchCallback' => function ($rule, $action) {
                        //Llamada al método que comprueba si es un administrador
                            return User::isUserAdmin(Yii::$app->user->identity->id);
                        },
                   ],
                    [
                        //Los usuarios simples tienen permisos sobre las siguientes acciones
//                       'actions' => ['view', 'id' => $alumno->id], no funciona
                       'actions' => ['view'],
                        //Esta propiedad establece que tiene permisos
                       'allow' => true,
                        //Usuarios autenticados, el signo ? es para invitados
                       'roles' => ['@'],
                        //Este método nos permite crear un filtro sobre la identidad del usuario
                        //y así establecer si tiene permisos o no
                       'matchCallback' => function ($rule, $action) {
                        //Llamada al método que comprueba si es un usuario simple
                          return User::isUserSimple(Yii::$app->user->identity->id);
                      },
                   ],
                    [
                        //Los invitados tienen permisos sobre las siguientes acciones
                        'actions' => ['index', 'view', 'create', 'update', 'delete'],
                        //Esta propiedad establece que no tiene permiso
                        'allow' => false,
                        //Signo ? para invitados
                        'roles' => ['?'],
                        //Este método nos permite crear un filtro sobre la identidad del usuario
                        //y así establecer si tiene permisos o no
                        'matchCallback' => function ($rule, $action) {
                        //Llamada al método que comprueba si es un usuario simple
                          return Yii::$app->user->isGuest;
                        }
                   ]
                ],
            ],
        ];
    }

Any advice would be appreciated.

The array for 'actions' can contain only the action IDs. You can not specify the query parameter parts of the actions here.

Consider using access checking in the controller action:

public function actionView($id)
{
    if (User::isUserSimple(Yii::$app->user->identity->id)) {
        $user = Users::findOne(Yii::$app->user->identity->id);
        $alumno = Alumno::find()->where(['apoderado_id' => $user->id_apoderado])
            ->one();
        if ($id != $alumno->id) {
            throw new ForbiddenHttpException('Permission denied.');
        }
    }
    ...
}
1 Like

Thank you. Code works perfectly.
It also helped me to do this on CursoController

public function actionView($id)
    {
        if (User::isUserSimple(Yii::$app->user->identity->id)) {
            $user = Users::findOne(Yii::$app->user->identity->id);
            $alumno = Alumno::find()->where(['curso_id' => $user->apoderado->alumno->curso_id])->one();
                if ($id != $alumno->curso_id) {
                    throw new ForbiddenHttpException('Permission denied.');
                }
        }
        
        return $this->render('view', [
            'model' => $this->findModel($id),
        ]);
    }