Hol*_*olo 3 authentication roles laravel laravel-routing
我从这里的人那里得到了建议并尝试了Laravel,我一直在尝试创建一个用户身份验证系统.我无法使用Eloquent将我熟悉的PHP工作翻译成Laravel.
我在这里要做的是识别用户,他们的角色,如果用户具有管理员的角色,他们可以访问路由/管理员
我知道我可以使用像Entrust这样的包,但这并不能帮助我学习.
我为用户和角色创建了模型.我还有一个名为role_user的查找表,其中包含user_id和role_id.
在User.php我有
public function roles(){
return $this->belongsToMany('Role', 'users_roles');
}
Run Code Online (Sandbox Code Playgroud)
在Role.php我有
public function users()
{
return $this->belongsToMany('User', 'users_roles');
}
Run Code Online (Sandbox Code Playgroud)
我知道我是否用过
$roles = user::find(1)->roles;
return ($roles);
Run Code Online (Sandbox Code Playgroud)
它将确实返回正确的用户ID(1)和分配给该用户的角色.现在我正在努力解决的问题是如何选择管理员角色,只有当用户拥有此权限时才会允许访问/ admin
路线应该基本上是
Route::get('admin', function()
{
return View::make('admin.index');
})->before('auth');
Run Code Online (Sandbox Code Playgroud)
我无法确定如何/在哪里/我应该首先检查管理员角色以及如何将其应用于auth检查以仅允许管理员访问该路由.
任何帮助赞赏.
背风处
您已使用auth过滤器,因此您应该检auth入app/filters.php文件中的过滤器:
Route::filter('auth', function($route, $request)
{
// Login check (Default)
if (Auth::guest()) return Redirect::guest('login');
// Admin check
if(!in_array('admin', Auth::user()->roles->toArray())) {
return Redirect::to('/'); // Redirect home page
}
});
Run Code Online (Sandbox Code Playgroud)
您可以使用不同的过滤器,例如:
Route::get('admin', function()
{
return View::make('admin.index');
})->before('isAdmin');
Run Code Online (Sandbox Code Playgroud)
在以下位置声明自定义isAdmin过滤器app/filters.php:
Route::filter('isAdmin', function($route, $request)
{
if(!Auth::check()) return Redirect::guest('login');
if( !in_array('admin', Auth::user()->roles->toArray()) ) {
return Redirect::to('/'); // Redirect home page
}
});
Run Code Online (Sandbox Code Playgroud)
对于Laravel 5,使用中间件:
创建新的中间件
# php artisan make:middleware RoleMiddleware
Run Code Online (Sandbox Code Playgroud)
检查用户角色 - 如果角色无效,则重定向
// app/Http/Middleware/RoleMiddleware.php
class RoleMiddleware
{
public function handle($request, Closure $next, $role)
{
if (! $request->user()->hasRole($role)) {
// Redirect...
}
return $next($request);
}
}
Run Code Online (Sandbox Code Playgroud)
添加键以分配路由 - 也可以创建全局
// app/Http/Kernel.php
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'role' => \App\Http\Middleware\RoleMiddleware::class, // new
];
Run Code Online (Sandbox Code Playgroud)
保护路线
// app/Http/routes.php
Route::put('post/{id}', ['middleware' => 'role:editor', function ($id) {
// routes for editor
}]);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6419 次 |
| 最近记录: |