我想自定义Laravel身份验证。我想区分管理员和用户。在默认用户表中,我添加了带有两个选项的列角色:admin和user。根据手册,我正在定义redirectTo
方法。
class LoginController extends Controller
{
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*/
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
protected function redirectTo()
{
if (Auth::user()->role == 'admin') {
return 'admin/home';
} else {
return '/main';
}
}
protected function show_admin_homepage()
{
return view('auth.admin_h');
}
protected function show_user_homepage()
{
return view('auth.user_h');
}
}
路线
Route::get('main', 'Auth\LoginController@show_user_homepage')->name('show_user_homepage');
Route::get('admin/home', 'Auth\LoginController@show_admin_homepage')->name('show_admin_homepage');
问题是,当我以用户或管理员身份登录时,我总是重定向到默认的laravel主视图。我在做什么错了?
答案 0 :(得分:1)
您应该使用handle
文件中的RedirectIfAuthenticated.php
文件的App/Http/Middleware
方法来更改重定向
该方法如下:
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
return redirect('/home');
}
return $next($request);
}
答案 1 :(得分:0)
我想区分管理员和用户...
不是尝试重新创建轮子并修改Auth,而是为什么不使用已构建且易于使用的东西呢?
Spatie/Laravel-Permission可以在这里帮助您很多。
例如,要创建“管理员”角色,只需执行以下操作:
$role = Role::create(['name' => 'admin']);
然后给它一些权限:
$permission = Permission::create(['name' => 'super power']);
$role->givePermissionTo($permission);
并在控制器中为用户模型分配角色
$user->assignRole('admin');
从那里您可以查询用户在控制器中是否具有特定角色:
if( $user->hasRole('admin') )
{
// The user has the admin role
return view('admin-page');
} else {
// This is a generic user
return view('main');
}
在刀片中OR
@role('admin')
I took the red pill!
@else
I took the blue pill..
@endrole
我建议这样做是因为它具有可伸缩性并且易于集成到您的项目中。随着项目的不断发展,如果您需要为角色添加新权限,则只需一行代码。
答案 2 :(得分:0)
默认的登录控制器使用 AuthenticatesUsers 特征。在特征中,有一个名为 authenticated 的受保护方法,在登录控制器中将其覆盖。
下面是已认证方法
的实现protected function authenticated($request, $user)
{
if($user->role == 'admin')
{
return redirect('/admin/dashboard');
}
else if($user->role == 'user')
{
return redirect('/dashboard');
}
}