• 欢迎来到本博客,希望可以y一起学习与分享

laravel 登录与laravel-permission权限控制

PHP benz 8个月前 (02-04) 19次浏览 0个评论 扫描二维码
文章目录[隐藏]

登录

参考:[ Laravel 5.8 文档 ] 安全系列 —— 登录认证

在底层代码中,Laravel 的认证组件由“guards”和“providers”组成,Guard 定义了用户在每个请求中如何实现认证,例如,Laravel 通过 session guard 来维护 Session 存储的状态和 Cookie。

Provider 定义了如何从持久化存储中获取用户信息,Laravel 底层支持通过 Eloquent 和数据库查询构建器两种方式来获取用户,如果需要的话,你还可以定义额外的 Provider。

通俗点说,在进行登录认证的时候,要做两件事,一个是从数据库存取用户数据,一个是把用户登录状态保存起来,在 Laravel 的底层实现中,通过 Provider 存取数据,通过 Guard 存储用户认证信息,前者主要和数据库打交道,后者主要和 Session 打交道(API 例外)。

现在我要搭建一个后台。
假如,目前我有一张表,admins表(借用laravel已有的user表,改一下表名即可),用来存储用户。

先在.env中配置好数据库信息。顺便看一下APP_KEY有没有值,没有的话,在项目的根目录是用命令行生成:php artisan key:generate
创建admins表的model:php artisan make:model Models/Admin,注意的是Models文件夹是自己建立的,laravel取消了model文件夹。
admin的model默认是继承Model的,现在需要使用这个model来做权限验证,所以admin不是一般的Model,它需要继承laravel提供的带有权限验证的父类:Illuminate\Foundation\Auth\User

其它的和普通model没什么区别。
因为流程是在登录页面填写正确的账号密码,验证,成功转跳到首页,所以,views应该有两个页面文件,这个自己准备,登录的关键不涉及页面,而在登录的控制器以及配置。
转跳后的首页也要controller,很简单,我叫它为IndexController:php artisan make:controller Admin/IndexController

创建登录controller。
因为是后台,所以后台controller都用一个admin文件夹来保存。使用命令创建controller:php artisan make:controller Admin/LoginController

因为这是后台,我们想有前台和后台这两个角色,如果使用Auth::guard();默认使用的guard(守护)是web。这是由config/auth.php权限配置文件所决定的:

上面的代码,已经定义了admin的guard,以及provider。
现在开始写路由:
我现在需要一个独立的路由文件来管理后台路由,所以在routes文件夹下新建admin.php文件。

访问:http://你的域名/admin,按理来说应该会输出this is admin,但却是404。原来还需要到Providers文件夹的RouteServiceProvider.php注册一下自定得路由文件

这个问文件还有一个问题需要解决,那就是名字叫admin的middleware还没有。接着来到app/Http/Kernel.php文件,找到$middlewareGroups,新增有一个key为admin的数组,数组里面是各种middleware,因为和web差不多,所以可以复制web的配置,再进行加减。
回到路由文件,admin.php路由文件如下:

使用权限验证:
权限验证可以在控制器中,也可以在路由等其他地方使用,这里说的是路由验证。
在路由里添加middleware=>['auth']即可路由权限验证,这只是使用默认的guard进行路由验证,比如说,我这里是后台,也定义了admin的guard,那么可以在auth的冒号后面指定guard,即:middleware=>['auth:admin']

路由守护的转跳地址:

当没有登录,直接访问路由,会被重定向到指定的位置,那么这个位置可以在app\Http\Middleware\的 Authenticate.php文件中修改:

可以参考:Laravel 登陆认证 访问指定的 Guard 实例 Admin认证

laravel-permission的使用

参考:

安装

安装laravel-permission:

可选:provider将自动注册。或者,您可以在config/app.php文件中手动添加provider:

发布 migration:

migration发布后,您可以通过运行以下命令来创建角色和权限表:

迁移后会有 model_has_permissions(用户-权限表)、model_has_roles(用户-角色表)、role_has_permission(角色-权限表)、spermissions(权限表)、roles(角色表)还有一个users(用户表),laravel自带的。RBAC需要的6张表就齐了。

发布配置文件:

当发布了配置文件后,就可以看到 config/permission.php

配置看注释自己配置,一般不需要配置。配置可以改表名、改对应的model、缓存配置等等。

表说明

用户表(users):不用说了都是一些基本信息包括名字,邮箱什么的!
权限表(permissions): 权限表就是存放所有权限的一张表,权限可以是控制器访问权限,接口访问权限,model访问权限,在这里我们只讨论接口访问权限!
角色表(roles): 角色表就是存放你所有的角色,角色的名字为索引!
基本的表有了,那他们是怎么关联的呢?请继续往下看!
用户拥有权限表(model_has_permissions): 這张表记录的就是user_id,permission_id的多对多的关系表,用户直接获取权限。
用户拥有角色表(model_has_roles): 这张表记录的用户拥有的权限,表里有user_id,role_id这个也是记录用户和角色多对多的关系表,也可以理解为中间表!
角色拥有权限表(role_has_permissions): 這张表记录的是角色拥有哪些权限,表里就2个字段role_id,permission_id!也可以根据需要进行拓展!

修改users模型(model)

需要创建三个模型:用户,角色,权限。其中角色和权限模型laravel-permission已提供给我们,可以直接使用,分别是\Spatie\Permission\Models\Role\Spatie\Permission\Models\Permission,如果想使用自定义的角色和权限模型,那么需要分别继承对应的laravel-permission提供的模型。

最后,是用户模型了。

首先,添加 Spatie\Permission\Traits\HasRoles trait 到 用户 模型(我这里的用户模型是admin):

用户模型必须有,且要自己创建。

使用middle(中间件)或构造函数 做权限过滤

该软件包随附RoleMiddleware,PermissionMiddleware和RoleOrPermissionMiddleware中间件。您可以将它们添加到app/Http/Kernel.php文件中。

然后,您可以在路由配置中,使用中间件规则保护路由:

或者,您可以使用|(竖线)字符分隔多个角色或权限:

您可以通过在构造函数中设置所需的中间件来类似地保护控制器:

定义超级管理员

我们强烈建议通过设置检查所需角色的全局Gate::before或Gate::after规则来处理超级管理员。
Gate::before
如果希望“超级管理员”角色响应true所有权限,而无需将所有这些权限分配给角色,则可以使用Laravel的Gate::before()方法。例如:

注意:Gate::before规则需要返回null而不是返回false,否则将干扰正常的策略操作。
Gate::after
或者,您可能希望将超级管理员检查移到该Gate::after阶段,尤其是在不允许超级管理员执行您的应用不希望“任何人”执行的事情时,例如写超过1条评论或绕过退订规则等

Gate::beforeGate::after根据情况二选一即可,一般选Gate::before

seed(播种)超级管理员数据

生成seed(播种)文件:

写seed(播种)规则与数据:

执行seed(播种):

操作方法

新增角色/权限:

权限–角色:

其他相关查询:

使用HasRoles trait的模型,被赋予了名为role和permission的scope方法:

由于Role和Permission模型继承了Eloquent,可以Eloquent相关方法属性:

权限–用户:

角色–用户:

角色–权限

多字段登录

https://learnku.com/articles/18588(评论是正解)


文章 laravel 登录与laravel-permission权限控制 转载需要注明出处
喜欢 (0)

您必须 登录 才能发表评论!