我开始学习Laravel 5.1,到目前为止我很喜欢它!但有一点我还没有得到。
在我之前的项目中,我有2个特定的控制器(例如:“正常”,“扩展”),在成功登录后,根据数据库中的用户user_group
调用。
如果“Foo.Bar”输入其有效凭据并且具有组normal
,则会将其重定向到NormalControler
。由于我没有使用任何框架,因此通过在组中设置$_SESSION
并检查它来限制对其他组的访问。因此,如果另一个组试图访问该控制器,他就会被重定向。
如何在Laravel 5中实现这一目标?到目前为止,我有一个可以在没有身份验证的情况下调用的控制器,以及routes.php
中此代码限制的控制器:
// All routes in the group are protected, only authed user are allowed to access them
Route::group(array('before' => 'auth'), function() {
// TO-DO : Seperate Controller access
});
登录看起来像这样:
public function performLogin()
{
$logindata = array(
'username' => Input::get('user_name'),
'password' => Input::get('user_pass')
);
if( Auth::attempt( $logindata ) ){
// return \Redirect::to( check group and access this controller based on it);
}
else {
// TO-DO : Redirect back and show error message
dd('Login failed!');
}
}
----- 编辑 -----
我按照你的建议运行了artisan命令并制作了这个中间件:
namespace App\Http\Middleware;
use Closure;
use Request;
class GroupPermissions
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next, $group)
{
// Check User Group Permissions
if( $request->user()->group === $group ){
// Continue the request
return $next($request);
}
// Redirect
return redirect('restricted');
}
}
并将此行编辑为Kernel.php
到$routeMiddleware
:
'group.perm' => \App\Http\Middleware\GroupPermissions::class
我认为到目前为止这是正确的,如果我错了,请纠正我!我可以做这样的事情来限制控制器吗?
Route::group(array('before' => 'auth'), function() {
Route::group( ['middleware' => 'group.perm', 'group' => 'normal'], function(){
Route::get('/normal/index', 'DummyNormalController@index');
});
Route::group( ['middleware' => 'group.perm', 'group' => 'extended'], function(){
Route::get('/extended/index', 'DummyExtendedController@index');
});
});
答案 0 :(得分:3)
好的,这是你可能会做的。一旦用户登录,您将检查他的凭据,获取他的user_group
并确定应该将哪个控制器重定向到。
if( Auth::attempt( $logindata ) ){
$user = Auth::user();
if ($user->inGroup('normal')) {
return redirect()->route('normal_controllers_named_route');
}
return redirect()->route('extended_controllers_named_route');
}
return redirect()->back()->withFlashMessage('don\'t get me wrong');
这将在登录后处理正确的路由。
使用中间件可以实现您需要保护路由免受不需要的用户组的下一部分。
php artisan make:middleware ShouldBeInGroup
app/http/Kernel.php
并将新的中间件添加到routeMiddleware
阵列。该项目的关键可能是您喜欢的任何内容。让我们来inGroup
。所以:'inGroup' => 'App\Http\Middleware\ShouldBeInGroup'
$this->middleware('inGroup:extended'); //we also passing the name of the group
最后,研究我们的中间件。打开新创建的ShouldBeInGroup
类并编辑句柄方法。
public function handle($request, Closure $next, $groupName)
{
if (Auth::check() && Auth::user()->inGroup($groupName)) {
return $next($request);
}
return redirect('/');
}
最后,您应该使用inGroup
方法,该方法应返回true
false
。我假设你的用户表有user_group
字段。然后在您的User
雄辩模型中添加方法
public function inGroup($groupName) {
return $this->user_group == $groupName;
}
如果您想在路线中使用此中间件,可以执行以下操作
Route::group(array('before' => 'auth'), function() {
Route::get('/normal/index', ['middleware' => 'group.perm:normal', 'uses' =>'DummyNormalController@index']);
}
但通常情况下,将所有中间件放入Controller的构造函数中会更好
public function __construct(){
$this->middleware('group.perm:normal'); // you can also pass in second argument to limit the methods this middleware is applied to : ['only' => ['store', 'update']];
}
此外,Laravel还提供内置的auth
中间件,您可以使用
public function __construct(){
$this->middleware('auth');
$this->middleware('group.perm:normal');
}
那么你的路线会变得更加清洁,只是:
Route::get('normal/index', 'DummyNormalController@index');
答案 1 :(得分:2)
我认为最好的方法是使用中间件。 See the doc here
您可以使用以下artisan命令轻松创建中间件:
php artisan make:middleware ExtendedMiddleware
如果您不能或不想使用工匠,则需要在App/Http/Middleware
文件夹中创建一个类。
在这个类中,您需要以下方法来处理请求。在该方法中,您可以检查用户组。
public function handle($request, Closure $next)
{
// check user group
if( user_group_ok )
return $next($request); // Continue the request
return redirect('restricted'); // Redidrect
}
然后,您可以在route.php
文件中使用此中间件:
Route::group(['middleware' => 'auth'], function()
{
// Logged-in user with the extended group
Route::group(['middleware' => 'extended'], function()
{
// Restricted routes here
});
// Normal routes here
});
答案 2 :(得分:0)
您可以创建一个名为:PermissionFilter
的中间件在PermissionFilter中,检查请求用户是否在组中。
我暂时无法提供演示,但如果您愿意,我可以稍后进行演示。