zoukankan      html  css  js  c++  java
  • Laravel-权限系统

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

    找到需要过滤动作的控制器,以中间件形式写入该类的构造方法中(或可在路由定义,在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属性中定义授权策略与模型关联 ,
    AppModelsUser::class => AppPoliciesUserPolicy::class,
    在控制器中调用$this->authorize('update',$user)
    第一 个参数对应的是授权类方法中定义的方法名。
    第二个参数$user对应的是update授权方法的第二个参数(进行授权的用户实例)
    简介
    Laravel内置了一个中间件来验证用户的身份认证。如果用户没有通过身份认证,中间件会重定向到登录页面。但如果通过认证,则允许该请求更进一步进入。

    可以将中间件想象为一系列HTTP请求必须经过才能触发应用的层。每一层都会检查请求(是否符合某些条件),如果不符合,甚至可以在请求访问之前完全拒绝。

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

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

    middleware方法接收两个参数:

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

    except设定指定动作,数组中的动作将不使用Auth中间件的过滤方法。相当于除了数组中指定动作以外,所有其他的动作都必须登录用户才能访问
    only白名单,只允许访问数组中的动作
    2.用户只能编辑自己的资料
    当用户1尝试更新用户2的资料时,应弹出403 forbidden禁止访问异常。
    在lara中可以使用policy对用户操作权限进行验证,未经授权进行的操作将会返回403

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

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


    下面创建一个策略类

    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属性中添加

    AppModelsUser::class=>AppPoliciesUserPolicy::class

    授权完毕后,可在控制器中使用authorize方法验证用户授权策略。默认的AppHttpControllersController类包含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('/'); //默认重定向的页面

    有需要交流的小伙伴可以点击这里加本人QQ:luke

  • 相关阅读:
    MyBatis的几种使用形式。
    laradock开发环境搭建笔记
    前端如何引入vConsole
    技术更迭,一往无前
    博客园使用markdown
    python telnetlib 模块实现功能端口扫描
    kubernetes之ingress部署
    kubernetes之ingress error: endpoints "default-http-backend" not found
    mvc 查询条件回显
    BootStrap 下来菜单点击两次才弹框问题
  • 原文地址:https://www.cnblogs.com/starluke/p/11828529.html
Copyright © 2011-2022 走看看