资讯专栏INFORMATION COLUMN

Laravel学习笔记六-权限管理与中间件Middleware

RobinTang / 2192人阅读

摘要:而日志中间件则可以记录所有传入应用程序的请求。框架已经内置了一些中间件,包括维护身份验证保护,等等。所有的中间件都放在目录内。在中可以使用授权策略来对用户的操作权限进行验证,在用户未经授权进行操作时将返回异常。

这一节我们将给相关的动作页面添加权限,如已经登录的用户将不会看到注册、登录按钮,更不会对别人的个人资料进行编辑操作,除非是管理员,这里我们将借助Laravel提供的中间件Middleware快速实现。

一、HTTP 中间件

HTTP 中间件提供了一个方便的机制来过滤进入应用程序的 HTTP 请求,例如,Laravel 本身使用中间件来验证用户的身份,如果用户未通过身份验证,中间件将会把用户导向登录页面,反之,当用户通过了身份验证,中间件将会通过此请求并接着往下执行。

当然,除了身份验证之外,中间件也可以被用来运行各式各样的任务,CORS 中间件负责替所有即将离开程序的响应加入适当的标头。而日志中间件则可以记录所有传入应用程序的请求。

Laravel 框架已经内置了一些中间件,包括维护、身份验证、CSRF 保护,等等。所有的中间件都放在app/Http/Middleware 目录内。

若是希望每个 HTTP 请求都经过一个中间件,只要将中间件的类加入到 app/Http/Kernel.php 的 $middleware 属性清单列表中。

// 在 AppHttpKernel 类内...
protected $routeMiddleware = [
    "auth" => AppHttpMiddlewareAuthenticate::class,
    "auth.basic" => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
    "guest" => AppHttpMiddlewareRedirectIfAuthenticated::class,];

Laravel 提供的 Auth 中间件在过滤指定动作时,如果该用户未通过身份验证,默认将会被重定向到 auth/login 登录页面,但我们在应用中使用的登录页面地址是 /login,因此我们需要对 Auth 中间件默认的重定向地址进行更改。

app/Http/Middleware/Authenticate.php

auth->guest()) {
            if ($request->ajax()) {
                return response("Unauthorized.", 401);
            } else {
                return redirect()->guest("login");
            }
        }

        return $next($request);
    }
}

通过阅读 Auth 中间件的源码可知,Auth 中间件会先判断当前用户是否为游客(未登录状态的用户),当用户为游客且请求方式是 ajax 时,则抛出一个 401 响应信息,如果不是通过 ajax 的方式请求,则重定向到登录页面。最后,如果用户为已登录状态,则接着执行下一个请求。

现在退出登录,再次尝试访问 http://sample.app/users/1/edit 页面将会被重定向到登录页面。

二、授权策略 (Policy)

在完成对用户未登录限制之后,我们来研究下已登录用户的权限验证,即只有用户自己才能编辑自己的个人信息,其他用户无权编辑。
在 Laravel 中可以使用 授权策略(Policy) 来对用户的操作权限进行验证,在用户未经授权进行操作时将返回 403 异常。

我们可以使用以下命令来生成一个名为 UserPolicy 的授权策略类文件,用于管理用户模型的授权。

$ php artisan make:policy UserPolicy

什么是授权策略呢?我们一般在个人资料编辑时,需要验证是否为用户自己,这样才有权限修改,先查出用户的个人信息,然后再和登录的用户ID判断是否为同一个人,而Laravel为我们提供了一套授权机制,只需新建一个授权策略,然后将其直接调用:

$ php artisan make:policy UserPolicy

id === $user->id;
    }
}

update 方法接收两个参数,第一个参数默认为当前登录用户实例,第二个参数则为要进行授权的用户实例。当两个 id 相同时,则代表两个用户是相同用户,用户通过授权,可以接着进行下一个操作。如果 id 不相同的话,将抛出 403 异常信息来拒绝访问。

使用授权策略需要注意以下两点:

我们并不需要检查 $currentUser 是不是 NULL。未登录用户,框架会自动为其 所有权限 返回 false;
调用时,默认情况下,我们 不需要 传递当前登录用户至该方法内,因为框架会自动加载当前登录用户(接着看下去,后面有例子);
接下来我们还需要在 AuthServiceProvider 类中对授权策略进行设置。AuthServiceProvider 包含了一个 policies 属性,该属性用于将各种模型对应到管理它们的授权策略上。我们需要为用户模型 User 指定授权策略 UserPolicy。

app/Providers/AuthServiceProvider.php

 "AppPoliciesModelPolicy",
        User::class  => UserPolicy::class,
    ];

    /**
     * Register any application authentication / authorization services.
     *
     * @param  IlluminateContractsAuthAccessGate  $gate
     * @return void
     */
    public function boot(GateContract $gate)
    {
        $this->registerPolicies($gate);

        //
    }
}

授权策略定义完成之后,我们便可以通过在用户控制器中使用 authorize 方法来验证用户授权策略。默认的 AppHttpControllersController 类包含了 Laravel 的 AuthorizesRequests trait。此 trait 提供了 authorize 方法,它可以被用于快速授权一个指定的行为,当无权限运行该行为时会抛出 HttpException。authorize 方法接收两个参数,第一个为授权策略的名称,第二个为进行授权验证的数据。

我们需要为 edit 和 update 方法加上这行:

$this->authorize("update", $user);

书写的位置如下:

app/Http/Controllers/UsersController.php

authorize("update", $user);
        return view("users.edit", compact("user"));
    }

    public function update($id, Request $request)
    {
        $this->validate($request, [
            "name" => "required|max:50",
            "password" => "confirmed|min:6"
        ]);

        $user = User::findOrFail($id);
        
         // 授权策略判断
        $this->authorize("update", $user);

        $data = array_filter([
            "name" => $request->name,
            "password" => $request->password,
        ]);
        $user->update($data);

        session()->flash("success", "个人资料更新成功!");

        return redirect()->route("users.show", $id);
    }
}

现在,如果你使用 id 为 1 的用户去访问 id 为 2 的用户编辑页面,将抛出 403 异常信息。

三、PHP中的Trait 特性及作用

PHP中的Trait 特性及作用

Traits 是一种为类似 PHP 的单继承语言而准备的代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集

简单使用
首先,当然是声明个 Trait,PHP5.4 增加了 trait 关键字

trait first_trait {
function first_method() { /* Code Here */ }
function second_method() { /* Code Here */ }
}

同时,如果要在 Class 中使用该 Trait,那么使用 use 关键字

class first_class {
// 注意这行,声明使用 first_trait
use first_trait;
}
$obj = new first_class();
// Executing the method from trait
$obj->first_method(); // valid
$obj->second_method(); // valid
1.使用多个 Trait
trait first_trait
{
function first_method() { echo "method"; }
}
trait second_trait {
function second_method() { echo "method"; }
}
class first_class {
// now using more than one trait
use first_trait, second_trait;
}
$obj= new first_class();
// Valid
$obj->first_method(); // Print : method
// Valid
$obj->second_method(); // Print : method
2. Trait 中声明抽象方法

我们可以在 Trait 中声明需要实现的抽象方法,这样能使使用它的 Class 必须实现它

trait first_trait {
function first_method() { echo "method"; }
// 这里可以加入修饰符,说明调用类必须实现它
abstract public function second_method();
}
class first_method {
use first_trait;
function second_method() {
/* Code Here */
}
}

Laravel中也应用了许多Trait方法


Laravel中使用上边定义好的Trait方法:
AppPoliciesUserPolicy

id === $user->id;

    }
}

相关文章:
我所理解的 PHP Trait

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22289.html

相关文章

  • Laravel学习笔记Middleware源码解析

    摘要:学习笔记之已经聊过使用了来设计,看源码发现其巧妙用了和的一些数组函数来设计。开发环境内置函数和看源码之前,先看下这几个内置函数的使用。学习笔记之实例化源码解析已经聊过的实例化,得到中的变量,即的实例化对象。后面再学习下的源码,到时见。 说明:本文主要学习Laravel的Middleware的源码设计思想,并将学习心得分享出来,希望对别人有所帮助。Laravel学习笔记之Decorato...

    _Dreams 评论0 收藏0
  • Laravel学习笔记之Route,Middleware和Controller参数传递

    摘要:本文主要学习总结下间参数传递。开发时经常碰到类似场景有时需要在中读取中设置的和,有时也需要在中读取中设置的参数。总结下这几个知识点,便于查阅。 本文主要学习总结下Route,Middleware,Controller间参数传递。开发时经常碰到类似场景:有时需要在Middleware中读取Route中设置的middleware parameter和route parameter,有时也需...

    zhangyucha0 评论0 收藏0
  • Laravel学习笔记之Two-Factor Authentication神器——Duo

    摘要:在登录后台时也是必须认证才行。使用这种总比粗暴的限制访问来保护安全要高效的多,一切都是为了自动化,为了提高生产率。总结本文主要学习使用这个神器来做,并学习了如何使用集成进程序中。我司最近需要一名伙伴一起共同航海去,有兴趣速来。 说明:本文主要研究利用Duo来实现双重认证,Two-Factor Authentication就是除了username-password这种登录认证之外,还使用...

    hoohack 评论0 收藏0
  • Laravel学习笔记之Session源码解析(上)

    摘要:然后中间件使用方法来启动获取实例,使用类来管理主要分为两步获取实例,主要步骤是通过该实例从存储介质中读取该次请求所需要的数据,主要步骤是。 说明:本文主要通过学习Laravel的session源码学习Laravel是如何设计session的,将自己的学习心得分享出来,希望对别人有所帮助。Laravel在web middleware中定义了session中间件IlluminateSess...

    NervosNetwork 评论0 收藏0
  • Laravel使用JWT来创建用户认证API

    摘要:本文来自原文链接欢迎作客我们的学习群这个例子将引导你在中使用来创建用户登录和注册的。是的简称,可以帮助我们创建用户认证,以此连接前后端。 本文来自pilishen.com----原文链接; 欢迎作客我们的php&Laravel学习群:109256050 这个例子将引导你在laravel中使用JWT来创建用户登录和注册的API。JWT是Json Web Token的简称,可以帮助我们创建...

    zzbo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<