Laravel-权限系统

总结
Auth中间件用于定义未登陆用户只能操做哪些权限
policy受权策略定义了当前用户实例与进行受权的用户是否匹配,一致才能进一步操做,不然返回403禁止访问异常
场景:用户登陆
Auth步骤php

找到须要过滤动做的控制器,以中间件形式写入该类的构造方法中(或可在路由定义,在group by语句前)
except:未登陆用户只能操做数组中的动做,其余均须要登陆用户方可操做
only:未登陆用户只能操做数组中的动做,其余均须要验证,常与guest搭配。例只容许guest未登陆用户访问注册页,至关于已登陆用户没法访问注册页。
友好转向:用户访问中间件动做中权限受阻时,会自动跳转到设定页面。可在RedirectIfAuthenticated.php设定redirect()跳转的页面
场景:用户只能编辑本身
Policy步骤数组

artisan生成 xxxxPolicy 策略文件
lara约定了 Policy字眼前的前缀名字为关联模型的命名,并自动引入该模型类命名空间。例如生成 UserPolicy策略, 类中会自动引入User模型类的命名空间
在app/policies中定义策略方法
定义方法,形参依赖注入 当前登陆模型实例和进行受权用户实例的两个参数 例如 (User $$currentUser, User $user)
方法体写入断定条件 如 当前登陆模型实例与受权用户实例的ID比较
在Providers/Auth/serviceProvider.php的$policies属性中定义受权策略与模型关联 ,
\App\Models\User::class => \App\Policies\UserPolicy::class,
在控制器中调用$this->authorize('update',$user)
第一 个参数对应的是受权类方法中定义的方法名。
第二个参数$user对应的是update受权方法的第二个参数(进行受权的用户实例)
简介
Laravel内置了一个中间件来验证用户的身份认证。若是用户没有经过身份认证,中间件会重定向到登陆页面。但若是经过认证,则容许该请求更进一步进入。session

能够将中间件想象为一系列HTTP请求必须通过才能触发应用的层。每一层都会检查请求(是否符合某些条件),若是不符合,甚至能够在请求访问以前彻底拒绝。app

1.必须先登陆
在用户控制器中使用构造方法。框架

$this->middleware('auth',[
'except'=>['show','create','store']
]);

middleware方法接收两个参数:ide

第一个:中间件名称
第二个:要进行过滤的动做
其中该中间件还有两个动做this

except设定指定动做,数组中的动做将不使用Auth中间件的过滤方法。至关于除了数组中指定动做之外,全部其余的动做都必须登陆用户才能访问
only白名单,只容许访问数组中的动做
2.用户只能编辑本身的资料
当用户1尝试更新用户2的资料时,应弹出403 forbidden禁止访问异常。
在lara中可使用policy对用户操做权限进行验证,未经受权进行的操做将会返回403spa

2.1新建一个受权策略类
$ php artisan make:polcy UserPolicy

新建的策略类将会安置在app/Policiies文件夹下。此处体现了【约定优于配置】 中间件


下面建立一个策略类ci

public function update(User $currentUser,User $user){
return $currentUser->id===$user->id;
}

update方法接收两个参数,第一个参数默认为当前登陆用户实例,第二参数则为要进行受权的用户实例。当两个id相同时,则表明两个用户是相同用户。若不一样则抛除403异常信息拒绝访问。

使用受权时须要注意两个地方

并不须要检查$currentUser(当前登陆用户实例)是否为null。框架会自动为其全部权限返回false
调用时,默认状况下,不须要传递当前登陆用户到该方法内。框架会自动加载当前登陆用户。
2.2受权关联
在AuthServiceProvider类中对受权策略进行设置。该文件包含一个policies属性,用于将各类模型对应到管理它们的受权策略上(至关于关联)。此处须要为模型指定UserPolicy

接下来,在protected 的policies属性中添加

\App\Models\User::class=>\App\Policies\UserPolicy::class

受权完毕后,可在控制器中使用authorize方法验证用户受权策略。默认的App\Http\Controllers\Controller类包含AuthorizesRequeststrait。该trait提供authorize方法,能够被用于快速受权指定行为。当无权限运行该行为时,会抛出HttpException。

authorize方法接收两个参数

第一个:受权策略名称(UserPolicy中的受权的update方法)
第二个:进行受权验证的数据(用户模型实例,即数据表中指定的字段)
//此处的update对应 UserPolicy的update受权方法
//$user对应的是update受权方法的第二参数。
$this->authorize('update',$user)

调用policy中的update方法时,默认状况下不须要传递第一个参数。当前登陆用户($currentUser)登陆时,框架会自动加载当前登陆用户

在如下两处地方分别添加上受权策略验证

edit:当前登陆用户尝试编辑时,调用策略类中的update,判断当前登陆用户的id是否与模型实例中进行受权的id相同,若不是则无权访问
update同上
2.3友好转向
未登陆用户尝试编辑资料,将会跳转到登陆页面,若是用户再进行登陆,则会重定向到我的中心页面上。
更好的体验,应该是将用户重定向到他以前尝试访问的页面。

redirect()实例提供了一个intended方法(尝试之意,用户尝试访问的域名).可将页面重定向到上一次请求尝试访问的页面上,并接收一个默认跳转地址参数,当上一次请求记录为空时,跳转到默认地址上。

常见场景,可在会话管理(登陆管理)中添加intended方法,

2.4注册于登陆页面访问限制
只让未登陆用户访问登陆页面和注册页面

sessionController:登陆管理相关,只容许访客登陆create(登陆界面),至关设置已登陆的用户没法访问登陆页权限(此时会跳转到默认页,需调整)
UsersController:用户管理相关,只容许访客登陆create(注册界面),
登陆控制器/用户控制器:

$this->middleware('guest',[
//guest指未登陆用户,访客
//only:可理解为白名单,指定一些只容许未登陆用户访问的动做
'only'=>['create']
]);
2.5访问权限受阻返回页面
访问Auth定义的中间件权限受阻时,会被跳转到默认/home页面。此处须要修改中间件中的redirect()方法并加上友好提醒

文件:app/Http/Middleware/RedirectIfAuthenticated.php,此处的Auth关联Users控制器(中间件引入了该类)

session()->flash('info', '您已登陆,无需再次操做。');return redirect('/'); //默认重定向的页面

相关文章
相关标签/搜索