你好我正在学习本教程
我完成了一切正常并添加了一些规则,自定义错误页面,只有管理员可以注册新用户。在/ admin视图中,我可以看到所有用户都注册,管理员可以删除这些用户。
我还需要两个角色,供用户查看特定视图,我正在尝试在注册表单中定义角色 因此管理员可以定义谁可以看到特定页面。 执行用户的一个角色和高级用户的一个角色。
我能够做到这一点,但只能通过添加关系 database role_user表
任何想法如何通过注册表单完成此操作?无需输入数据库表
答案 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)
这是注册表格的路径
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的更多信息