Laravel 5.6注册用户角色

时间:2018-04-27 20:19:08

标签: php mysql laravel eloquent

你好我正在学习本教程

https://www.5balloons.info/user-role-based-authentication-and-access-control-in-laravel/#comment-1889

我完成了一切正常并添加了一些规则,自定义错误页面,只有管理员可以注册新用户。在/ admin视图中,我可以看到所有用户都注册,管理员可以删除这些用户。

我还需要两个角色,供用户查看特定视图,我正在尝试在注册表单中定义角色 因此管理员可以定义谁可以看到特定页面。 执行用户的一个角色和高级用户的一个角色。

我能够做到这一点,但只能通过添加关系 database role_user表

任何想法如何通过注册表单完成此操作?无需输入数据库表

3 个答案:

答案 0 :(得分:1)

我假设你正在使用Blade模板。使用以下命令为Role select添加下拉列表。

<select name="role">
@foreach ( $roles as $role )
  <option value="${{role->id}}">{{ $role->name }}</option>
@endforeach
</select>

您需要提供当前可用的角色,从您的角色模型(ha)到视图。这可以在渲染视图时在控制器中完成。

// Part of your controller
$roles = Role::all();
return view('your-view', [ 'roles' => $roles ]);

这里的关键部分是return view('your-view', [ 'roles' => $roles ])view函数中的第二个参数是要传递给视图本身的数据。有关详细信息,请参阅the Blade docs

提交表单后,您可以在保存后将该角色“附加”到用户模型中。

$user = new User();
// Assign user info here
$user->save();
$user->roles()->attach($request->role);
  • ->roles()是我们要附加到的用户所属的模型。
  • ->attach($request->role) - $request->role是我们要附加到新创建的用户的角色的ID。

您可以read more in the docs关于附加和分配与他人的各种关系。

答案 1 :(得分:1)

see this the path

这是注册表格的路径

vendor > laravel > framework > src >Illuminate >Foundation > Auth > RegistersUsers.php

这是我的代码#example 这是注册表的控制人

  /**
 * Show the application registration form.
 *
 * @return \Illuminate\Http\Response
 */
public function showRegistrationForm()
{
    $show = model_rolepath::all();
    return view('auth.register')->with('roles',$show);
}

这是我的刀刃

 <div class="input-group mb-3 {{ $errors->has('role') ? ' has-error' : '' }}">
      <select type="text" class="form-control"  value="{{ old('role') }}" required autofocus id="role" name="role" placeholder="Role">
      @foreach($roles as $key=>$role)
          <option value="{{$role->rolepath}}">{{ $role->rolepath }}</option>
        @endforeach
      </select>
      @if ($errors->has('role'))
        <span class="help-block">
          <strong>{{ $errors->first('role') }}</strong>
        </span>
      @endif
      <div class="input-group-append">
        <div class="input-group-text">
          <span class="fas fa-tasks"></span>
        </div>
      </div>
    </div>

答案 2 :(得分:0)

自定义注册表格:

生成Laravel随附的身份验证支架。

php artisan make:auth

现在我们已经向用户模型添加了role列,我们还需要在视图中添加角色的输入,因此将选择标签输入添加到resources/views/auth/register.blade.php注册表单中。

<div class="form-group row">
    <label for="role" class="col-md-4 col-form-label text-md-right">Role</label>
    <div class="col-md-6">
        <select name="role" class="form-control" >
            <option value="admin">Admin</option>
            <option value="agent">Agent</option>
            <option value="customer">Customer</option>
        </select> 
    </div>
</div>

自定义用户模型和RegisterController:

将角色列添加到用户模型上的fillable属性,以便我们可以使用注册控制器中的create()方法。

//User.php
protected $fillable = [
    'name', 'email', 'password','role',
];

现在自定义RegisterController.php目录中的app/Http/Controllers/Auth,以在创建新用户时包含我们的role输入。

role字段添加验证规则:

protected function validator(array $data)
{
    return Validator::make($data, [
        'name' => 'required|string|max:255',
        'email' => 'required|string|email|max:255|unique:users',
        'password' => 'required|string|min:6|confirmed',
        'role' => 'required|in:admin,agent,customer', //validate role input
    ]);
}

将角色字段添加到create()方法中:

protected function create(array $data)
{
    return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => bcrypt($data['password']),
        'role' => $data['role'],
    ]);
}

现在,您应该能够注册具有不同角色的用户。我们将为每个角色至少创建一个用户,然后继续实施访问控制逻辑。

设置中间件:

Middleware提供了一种方便的机制,用于过滤进入我们应用程序的HTTP请求。例如,Laravel包含一个auth中间件,用于验证您的应用程序用户是否已登录。

我们将为我们的每个角色创建中间件。

php artisan make:middleware Admin
php artisan make:middleware Agent
php artisan make:middleware Customer

将以下代码添加到app/Http/Middleware文件夹中的各个中间件中:

use Auth; //at the top

function handle($request, Closure $next)
{
    if (Auth::check() && Auth::user()->role == 'admin') {
        return $next($request);
    }
    elseif (Auth::check() && Auth::user()->role == 'agent') {
        return redirect('/agent');
    }
    else {
        return redirect('/customer');
    }
}

Agent.php

use Auth; //at the top

function handle($request, Closure $next)
{
    if (Auth::check() && Auth::user()->role == 'agent') {
        return $next($request);
    }
    elseif (Auth::check() && Auth::user()->role == 'customer') {
        return redirect('/customer');
    }
    else {
        return redirect('/admin');
    }
}

Customer.php

use Auth; //at the top

function handle($request, Closure $next)
{
    if (Auth::check() && Auth::user()->role == 'customer') {
        return $next($request);
    }
    elseif (Auth::check() && Auth::user()->role == 'agent') {
        return redirect('/agent');
    }
    else {
        return redirect('/admin');
    }
}

现在让我们向Laravel注册我们的中间件。将中间件类添加到位于$routeMiddleware中的app/Http/Kernel.php属性中:

protected $routeMiddleware = [
    // ...
    'admin' => 'App\Http\Middleware\Admin',
    'agent' => 'App\Http\Middleware\Agent',
    'customer' => 'App\Http\Middleware\Customer',
];

现在您可以将这些中间件应用于路由或控制器本身:

web.php:

Route::get('/admin', function(){
    echo "Hello Admin";
})->middleware('admin');

Route::get('/agent', function(){
    echo "Hello Agent";
})->middleware('agent');

Route::get('/customer', function(){
    echo "Hello Customer";
})->middleware('customer');

或者您可以在控制器的构造函数中指定中间件,如下所示:

public function __construct()
{
    $this->middleware('auth');  
    $this->middleware('admin');
}

登录后重定向用户:

如果您使用Laravel的默认登录设置,则可能需要在用户登录后将用户重定向到其特定角色的页面。您可以通过覆盖LoginController.php中的redirectTo()方法来实现。确保从$redirectTo中删除LoginController.php属性。

将此添加到您的LoginController.php:

protected function redirectTo( ) {
    if (Auth::check() && Auth::user()->role == 'customer') {
        return('/customer');
    }
    elseif (Auth::check() && Auth::user()->role == 'agent') {
        return('/agent');
    }
    else {
        return('/admin');
    }
}

此解决方案由@kerneldev提供,有关github的更多信息