【发布时间】:2015-05-17 15:05:25
【问题描述】:
我遵循本教程:https://www.youtube.com/watch?v=kmJYVhG6UzM 目前,如果用户是管理员,我可以检查我的刀片:
{{ Auth::user()->roles->toArray()[0]['role'] }}
HI ADMIN
@endif
我怎样才能让我的路由只对管理员用户可用?
【问题讨论】:
我遵循本教程:https://www.youtube.com/watch?v=kmJYVhG6UzM 目前,如果用户是管理员,我可以检查我的刀片:
{{ Auth::user()->roles->toArray()[0]['role'] }}
HI ADMIN
@endif
我怎样才能让我的路由只对管理员用户可用?
【问题讨论】:
您需要为您的路由创建一个中间件。
使用:php artisan make:middleware AdminMiddleware。
您会在中间件文件夹中找到一个具有此名称的新文件。
将你的逻辑放在你的中间件中,例如
public function handle($request, Closure $next)
{
if(Auth::check())
{
return $next($request);
}
else
{
return view('auth.login')->withErrors('You are not logged in');
}
}
在中间件中完成逻辑后,您可以在路由中调用它或使中间件应用于所有路由。
如果要将其添加到所有路由,请转到 Kernel.php 并将其添加到 $middleware 数组中,例如
protected $middleware = [
'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode',
'Illuminate\Cookie\Middleware\EncryptCookies',
'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
'Illuminate\Session\Middleware\StartSession',
'Illuminate\View\Middleware\ShareErrorsFromSession',
'App\Http\Middleware\VerifyCsrfToken',
'App\Http\Middleware\AdminMiddleware',
];
如果您只想将其添加到特定路由,请将其添加到 $routeMiddleware 变量并将别名添加到路由。例如
protected $routeMiddleware = [
'auth' => 'App\Http\Middleware\Authenticate',
'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth',
'guest' => 'App\Http\Middleware\RedirectIfAuthenticated',
'admin' => 'App\Http\Middleware\AdminMiddleware',
];
然后您可以将其添加到路由中,作为过滤器,例如
Route::get('admin/profile', ['middleware' => 'admin', function()
{
}]);
有关更多信息,请访问文档:
http://laravel.com/docs/master/middleware
编辑
对此的改进是使用 PHP 5.6 中引入的可变参数函数
http://php.net/manual/en/migration56.new-features.php
您可以执行以下操作,而不必为每个权限集制作中间件
权限中间件
namespace App\Http\Middleware;
use Closure;
use \App\Models\Role;
class PermissionMiddleware
{
// Pass parameters to this middleware
public function handle($request, Closure $next, ...$permitted_roles)
{
//Get a users role
$role = new Role;
$role_name = $role->getUserRoleByName();
foreach($permitted_roles as $permitted_role) {
if($permitted_role == $role_name) {
return $next($request);
}
}
return redirect()->back()->withErrors('You do not have the required permission');
}
}
注意 ...$permitted_roles
Route::get('admin/profile', ['middleware' => 'PermissionMiddleware:Admin,Marketing', function()
{
}]);
您现在可以为一个中间件指定任意数量的角色,而不是使用中间件参数创建多个角色
文档 https://laravel.com/docs/5.3/middleware#middleware-parameters
【讨论】:
假设您的 users 表中有一个名为 isAdmin 的列,其默认值为 0 (false)
您可以使用 laravel 中的中间件授予特殊访问权限,就像您在 laravel 中使用 auth 中间件授予登录用户访问权限一样。
现在您需要使用以下命令创建一个中间件:
php artisan make:middleware AdminMiddleware
在您的 Kernel.php 中,您需要将此行添加到 protected $routeMiddleware
'admin' => \App\Http\Middleware\AdminMiddleware::class,
在您的中间件文件夹中,您有 AdminMiddleware 文件。
在那你需要把你的逻辑
在这种情况下,这可能取决于您的外观
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class RoleMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(Auth::user()->isAdmin == '1') // is an admin
{
return $next($request); // pass the admin
}
return redirect('/'); // not admin. redirect whereever you like
}
}
现在在您的路由中,您必须使用此中间件传递 url 这是它的样子
Route::get('/iamanadmin', ['middleware' => 'admin', function() {
return view('iamanadmin');
}]);
【讨论】:
使用中间件并检查管理员用户。
Route::get('admin', ['middleware' => 'checkadmin', function()
{
}]);
现在创建中间件并验证管理员用户。
【讨论】: