cakephp3 entities relationship error when login (the error is going after refresh)

81 Views Asked by At

I am struggling with this issue for a few days. I've tried to debug step by step with Xdebug, but I cannot find where it is the problem. Basically when login into the cakephp3.9 I get this error:

   App\Model\Table\UsersTable association "Roles" of type "manyToMany" to "Slince\CakePermission\Model\Table\RolesTable" doesn't match the expected class "App\Model\Table\RolesTable". 
You can't have an association of the same name with a different target "className" option anywhere in your app.

As I mentioned above, I am using cakephp 3.9 and the slince package ("slince/cakephp-permission": "^1.0") to manage roles/permissions. After get this error if I refresh the browser evertyhing works as normal. The error only appears once, always after login.

Relations in UsersTable.php

  $this->belongsToMany('Roles', [
           'foreignKey' => 'user_id',
           'targetForeignKey' => 'role_id',
           'joinTable' => 'users_roles'
       ]);

UsersController.php

 public function login()
    {


        if ($this->request->is('post')) {
            $user = $this->Auth->identify();
          
            if ($user) {
                if (Configure::read('Options.status') == 2) {
                    $this->Flash->error('Please confirm your account - click on the validation link emailed to you');

                    return $this->redirect(['action' => 'login', 'controller' => 'Users']);
                }

                $UsersRoles = TableRegistry::getTableLocator()->get('UsersRoles');

                // Get User role_id
                $AuthRole = $UsersRoles
                    ->find()
                    ->select(['role_id'])
                    ->where(['user_id' => $user['id']])
                    ->first();

                // if the status of the user is false an error appears and it will be redirected back || check if is an admin role?
                if ($user['status'] != 1 || $AuthRole->role_id > 3) {
                    $this->Flash->error('Your account is not authorized to access this area. Contact the support team or check your inbox');

                    return $this->redirect(['action' => 'login', 'controller' => 'Users']);
                }  
              
                $Roles = TableRegistry::getTableLocator()->get('Roles');

                // Get Role name
                $AuthRoleName = $Roles
                    ->find()
                    ->select('name')
                    ->where(['id' => $AuthRole['role_id']])
                    ->first();
                    
                $user['role_id']   = $AuthRole['role_id'];
                $user['role_name'] = $AuthRoleName['name'];
  

                // Set the use into the session
                $this->Auth->setUser($user);

    // Save the previous login date to the session and enable tour vars
                $session = $this->getRequest()->getSession();

                if (empty($user['last_login'])) {
                    $session->write('Options.run', true);
                    $session->write('Options.player', true);
                }

                // Now update the actual login time
                $this->Users->updateLastLogin($this->Auth->user('id'));

                // Handle case where referrer is cleared/reset
                $nextUrl = $this->Auth->redirectUrl();
                if ($nextUrl === "/") {
                    return $this->redirect(['action' => 'index', 'controller' => 'Adminarea']);
                } else {
                    return $this->redirect($nextUrl);
                }
            }
            $this->Flash->error(__('Invalid username or password, please try again'));
        }

        $this->viewBuilder()->setLayout('admin_in');
    }
1

There are 1 best solutions below

0
On

The issue it is in the relationship "Roles", it already exists in the file "PermissionsTableTrait.php" from the slice package, and it seems that cannot be two relationships with the same name.