【问题标题】:How to assign default user role in entrust?如何在委托中分配默认用户角色?
【发布时间】:2015-08-22 18:14:22
【问题描述】:

我只想为新注册的用户分配一个角色。我如何通过 Entrust 在 Laravel 5 中实现这一目标?我将 Entrust 用于角色和权限。

上次我尝试在用户注册到供应商文件夹中的文件后触发事件。有没有办法在不修改供应商文件夹中的任何内容的情况下触发角色分配事件?

如果是,那么我应该在哪里触发事件?我不想修改供应商文件夹中的任何内容,例如 postRegister()AuthenticatesAndRegistersUsers.php 中的触发事件,因为新的更新会覆盖我的代码。

此链接上的代码看起来不错,但我不知道委托是否有注册事件。 http://laravel.io/forum/07-02-2014-entrust-assign-role-on-user-signup

这是我在 routes.php 中的代码:

// this event is firing on user login and i am getting user object
Event::listen('auth.login', function($user) {
   var_dump($user);
   die(__LINE__);
});

// this event is not firing on user registration
Event::listen('auth.register', function($user) {
   var_dump($user);
   die(__LINE__);
   //   $donor_role = DB::table('app_roles')->where('name', '=', 'donor')->pluck('id');
   //   $user->roles()->attach($donor_role);
   //   return false;
});

请帮帮我。

【问题讨论】:

    标签: php authentication web laravel-5


    【解决方案1】:

    应用\服务\注册器.php 这是我的方式:

    public function create(array $data)
        {
            $create = User::create([
                'username' => $data['username'],
                'email' => $data['email'],
                'password' => $data['password'],
            ]);
    
    
            $user = User::find($create->id);
    
            $role = Role::where('name', '=', 'user')->firstOrFail();
    
            $user->roles()->attach($role->id);
    
            return $create;
        }
    

    【讨论】:

      【解决方案2】:

      我自己想通了。以下是我的成就:

      我从 /vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesAndRegistersUsers.php 复制了 postRegister() 函数并在 /app/Http/Controllers/Auth/ 中覆盖AuthController.php 进行了一些修改。

      这里是AuthController.php中修改后的函数:

      public function postRegister(Request $request) {
          $validator = $this->registrar->validator($request->all());
          if ($validator->fails()) {
              $this->throwValidationException(
                      $request, $validator
              );
          }
          $this->auth->login($this->registrar->create($request->all()));
          // little modification :-)
          \Event::fire('auth.assign_default_role', $this->auth->user());
          return redirect($this->redirectPath());
      }
      

      这是 routes.php 中的事件监听器:

      Event::listen('auth.assign_default_role', function($user) {
          $donor_role = DB::table('app_roles')->where('name', '=', 'donor')- >pluck('id');
          $user->roles()->attach($donor_role);
          return false;
      });
      

      【讨论】:

      • 你的解决方案给了我Call to a member function roles() on nullroutes.php
      【解决方案3】:

      您可以从正在处理实际注册的控制器触发注册事件。

      Event::fire('auth.register', array($user));
      

      【讨论】:

        【解决方案4】:

        在 Laravel 5.7+ 中,您可以转到 RegisterController 并修改 create 函数:

        protected function create(array $data) {
            $user = User::create([
                'name' => $data['name'],
                'email' => $data['email'],
                'password' => Hash::make($data['password']),
            ]);
        
            $default_role = Role::where('name', 'DEFAULT_ROLE_NAME')->first();
            $user->attachRole($default_role);
        
            return $user;
        }
        

        别忘了在开头use App\Models\Role;

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-19
          • 1970-01-01
          • 2016-10-20
          • 1970-01-01
          • 2015-03-05
          • 2020-05-30
          • 2015-04-27
          • 2014-12-12
          相关资源
          最近更新 更多