国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Laravel學(xué)習(xí)筆記六-權(quán)限管理與中間件Middleware

RobinTang / 2225人閱讀

摘要:而日志中間件則可以記錄所有傳入應(yīng)用程序的請求。框架已經(jīng)內(nèi)置了一些中間件,包括維護(hù)身份驗(yàn)證保護(hù),等等。所有的中間件都放在目錄內(nèi)。在中可以使用授權(quán)策略來對用戶的操作權(quán)限進(jìn)行驗(yàn)證,在用戶未經(jīng)授權(quán)進(jìn)行操作時(shí)將返回異常。

這一節(jié)我們將給相關(guān)的動(dòng)作頁面添加權(quán)限,如已經(jīng)登錄的用戶將不會(huì)看到注冊、登錄按鈕,更不會(huì)對別人的個(gè)人資料進(jìn)行編輯操作,除非是管理員,這里我們將借助Laravel提供的中間件Middleware快速實(shí)現(xiàn)。

一、HTTP 中間件

HTTP 中間件提供了一個(gè)方便的機(jī)制來過濾進(jìn)入應(yīng)用程序的 HTTP 請求,例如,Laravel 本身使用中間件來驗(yàn)證用戶的身份,如果用戶未通過身份驗(yàn)證,中間件將會(huì)把用戶導(dǎo)向登錄頁面,反之,當(dāng)用戶通過了身份驗(yàn)證,中間件將會(huì)通過此請求并接著往下執(zhí)行。

當(dāng)然,除了身份驗(yàn)證之外,中間件也可以被用來運(yùn)行各式各樣的任務(wù),CORS 中間件負(fù)責(zé)替所有即將離開程序的響應(yīng)加入適當(dāng)?shù)臉?biāo)頭。而日志中間件則可以記錄所有傳入應(yīng)用程序的請求。

Laravel 框架已經(jīng)內(nèi)置了一些中間件,包括維護(hù)、身份驗(yàn)證、CSRF 保護(hù),等等。所有的中間件都放在app/Http/Middleware?目錄內(nèi)。

若是希望每個(gè) HTTP 請求都經(jīng)過一個(gè)中間件,只要將中間件的類加入到?app/Http/Kernel.php?的?$middleware?屬性清單列表中。

// 在 AppHttpKernel 類內(nèi)...
protected $routeMiddleware = [
    "auth" => AppHttpMiddlewareAuthenticate::class,
    "auth.basic" => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
    "guest" => AppHttpMiddlewareRedirectIfAuthenticated::class,];

Laravel 提供的 Auth 中間件在過濾指定動(dòng)作時(shí),如果該用戶未通過身份驗(yàn)證,默認(rèn)將會(huì)被重定向到 auth/login 登錄頁面,但我們在應(yīng)用中使用的登錄頁面地址是 /login,因此我們需要對 Auth 中間件默認(rèn)的重定向地址進(jìn)行更改。

app/Http/Middleware/Authenticate.php

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

        return $next($request);
    }
}

通過閱讀 Auth 中間件的源碼可知,Auth 中間件會(huì)先判斷當(dāng)前用戶是否為游客(未登錄狀態(tài)的用戶),當(dāng)用戶為游客且請求方式是 ajax 時(shí),則拋出一個(gè) 401 響應(yīng)信息,如果不是通過 ajax 的方式請求,則重定向到登錄頁面。最后,如果用戶為已登錄狀態(tài),則接著執(zhí)行下一個(gè)請求。

現(xiàn)在退出登錄,再次嘗試訪問 http://sample.app/users/1/edit 頁面將會(huì)被重定向到登錄頁面。

二、授權(quán)策略 (Policy)

在完成對用戶未登錄限制之后,我們來研究下已登錄用戶的權(quán)限驗(yàn)證,即只有用戶自己才能編輯自己的個(gè)人信息,其他用戶無權(quán)編輯。
在 Laravel 中可以使用 授權(quán)策略(Policy) 來對用戶的操作權(quán)限進(jìn)行驗(yàn)證,在用戶未經(jīng)授權(quán)進(jìn)行操作時(shí)將返回 403 異常。

我們可以使用以下命令來生成一個(gè)名為 UserPolicy 的授權(quán)策略類文件,用于管理用戶模型的授權(quán)。

$ php artisan make:policy UserPolicy

什么是授權(quán)策略呢?我們一般在個(gè)人資料編輯時(shí),需要驗(yàn)證是否為用戶自己,這樣才有權(quán)限修改,先查出用戶的個(gè)人信息,然后再和登錄的用戶ID判斷是否為同一個(gè)人,而Laravel為我們提供了一套授權(quán)機(jī)制,只需新建一個(gè)授權(quán)策略,然后將其直接調(diào)用:

$ php artisan make:policy UserPolicy

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

update 方法接收兩個(gè)參數(shù),第一個(gè)參數(shù)默認(rèn)為當(dāng)前登錄用戶實(shí)例,第二個(gè)參數(shù)則為要進(jìn)行授權(quán)的用戶實(shí)例。當(dāng)兩個(gè) id 相同時(shí),則代表兩個(gè)用戶是相同用戶,用戶通過授權(quán),可以接著進(jìn)行下一個(gè)操作。如果 id 不相同的話,將拋出 403 異常信息來拒絕訪問。

使用授權(quán)策略需要注意以下兩點(diǎn):

我們并不需要檢查 $currentUser 是不是 NULL。未登錄用戶,框架會(huì)自動(dòng)為其 所有權(quán)限 返回 false;
調(diào)用時(shí),默認(rèn)情況下,我們 不需要 傳遞當(dāng)前登錄用戶至該方法內(nèi),因?yàn)榭蚣軙?huì)自動(dòng)加載當(dāng)前登錄用戶(接著看下去,后面有例子);
接下來我們還需要在 AuthServiceProvider 類中對授權(quán)策略進(jìn)行設(shè)置。AuthServiceProvider 包含了一個(gè) policies 屬性,該屬性用于將各種模型對應(yīng)到管理它們的授權(quán)策略上。我們需要為用戶模型 User 指定授權(quán)策略 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);

        //
    }
}

授權(quán)策略定義完成之后,我們便可以通過在用戶控制器中使用 authorize 方法來驗(yàn)證用戶授權(quán)策略。默認(rèn)的 AppHttpControllersController 類包含了 Laravel 的 AuthorizesRequests trait。此 trait 提供了 authorize 方法,它可以被用于快速授權(quán)一個(gè)指定的行為,當(dāng)無權(quán)限運(yùn)行該行為時(shí)會(huì)拋出 HttpException。authorize 方法接收兩個(gè)參數(shù),第一個(gè)為授權(quán)策略的名稱,第二個(gè)為進(jìn)行授權(quán)驗(yàn)證的數(shù)據(jù)。

我們需要為 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);
        
         // 授權(quán)策略判斷
        $this->authorize("update", $user);

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

        session()->flash("success", "個(gè)人資料更新成功!");

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

現(xiàn)在,如果你使用 id 為 1 的用戶去訪問 id 為 2 的用戶編輯頁面,將拋出 403 異常信息。

三、PHP中的Trait 特性及作用

PHP中的Trait 特性及作用

Traits 是一種為類似 PHP 的單繼承語言而準(zhǔn)備的代碼復(fù)用機(jī)制。Trait 為了減少單繼承語言的限制,使開發(fā)人員能夠自由地在不同層次結(jié)構(gòu)內(nèi)獨(dú)立的類中復(fù)用方法集

簡單使用
首先,當(dāng)然是聲明個(gè) Trait,PHP5.4 增加了 trait 關(guān)鍵字

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

同時(shí),如果要在 Class 中使用該 Trait,那么使用 use 關(guān)鍵字

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.使用多個(gè) 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 中聲明需要實(shí)現(xiàn)的抽象方法,這樣能使使用它的 Class 必須實(shí)現(xiàn)它

trait first_trait {
function first_method() { echo "method"; }
// 這里可以加入修飾符,說明調(diào)用類必須實(shí)現(xiàn)它
abstract public function second_method();
}
class first_method {
use first_trait;
function second_method() {
/* Code Here */
}
}

Laravel中也應(yīng)用了許多Trait方法


Laravel中使用上邊定義好的Trait方法:
AppPoliciesUserPolicy

id === $user->id;

    }
}

相關(guān)文章:
我所理解的 PHP Trait

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/22289.html

相關(guān)文章

  • Laravel學(xué)習(xí)筆記Middleware源碼解析

    摘要:學(xué)習(xí)筆記之已經(jīng)聊過使用了來設(shè)計(jì),看源碼發(fā)現(xiàn)其巧妙用了和的一些數(shù)組函數(shù)來設(shè)計(jì)。開發(fā)環(huán)境內(nèi)置函數(shù)和看源碼之前,先看下這幾個(gè)內(nèi)置函數(shù)的使用。學(xué)習(xí)筆記之實(shí)例化源碼解析已經(jīng)聊過的實(shí)例化,得到中的變量,即的實(shí)例化對象。后面再學(xué)習(xí)下的源碼,到時(shí)見。 說明:本文主要學(xué)習(xí)Laravel的Middleware的源碼設(shè)計(jì)思想,并將學(xué)習(xí)心得分享出來,希望對別人有所幫助。Laravel學(xué)習(xí)筆記之Decorato...

    _Dreams 評論0 收藏0
  • Laravel學(xué)習(xí)筆記之Route,Middleware和Controller參數(shù)傳遞

    摘要:本文主要學(xué)習(xí)總結(jié)下間參數(shù)傳遞。開發(fā)時(shí)經(jīng)常碰到類似場景有時(shí)需要在中讀取中設(shè)置的和,有時(shí)也需要在中讀取中設(shè)置的參數(shù)。總結(jié)下這幾個(gè)知識點(diǎn),便于查閱。 本文主要學(xué)習(xí)總結(jié)下Route,Middleware,Controller間參數(shù)傳遞。開發(fā)時(shí)經(jīng)常碰到類似場景:有時(shí)需要在Middleware中讀取Route中設(shè)置的middleware parameter和route parameter,有時(shí)也需...

    zhangyucha0 評論0 收藏0
  • Laravel學(xué)習(xí)筆記之Two-Factor Authentication神器——Duo

    摘要:在登錄后臺時(shí)也是必須認(rèn)證才行。使用這種總比粗暴的限制訪問來保護(hù)安全要高效的多,一切都是為了自動(dòng)化,為了提高生產(chǎn)率。總結(jié)本文主要學(xué)習(xí)使用這個(gè)神器來做,并學(xué)習(xí)了如何使用集成進(jìn)程序中。我司最近需要一名伙伴一起共同航海去,有興趣速來。 說明:本文主要研究利用Duo來實(shí)現(xiàn)雙重認(rèn)證,Two-Factor Authentication就是除了username-password這種登錄認(rèn)證之外,還使用...

    hoohack 評論0 收藏0
  • Laravel學(xué)習(xí)筆記之Session源碼解析(上)

    摘要:然后中間件使用方法來啟動(dòng)獲取實(shí)例,使用類來管理主要分為兩步獲取實(shí)例,主要步驟是通過該實(shí)例從存儲(chǔ)介質(zhì)中讀取該次請求所需要的數(shù)據(jù),主要步驟是。 說明:本文主要通過學(xué)習(xí)Laravel的session源碼學(xué)習(xí)Laravel是如何設(shè)計(jì)session的,將自己的學(xué)習(xí)心得分享出來,希望對別人有所幫助。Laravel在web middleware中定義了session中間件IlluminateSess...

    NervosNetwork 評論0 收藏0
  • Laravel使用JWT來創(chuàng)建用戶認(rèn)證API

    摘要:本文來自原文鏈接歡迎作客我們的學(xué)習(xí)群這個(gè)例子將引導(dǎo)你在中使用來創(chuàng)建用戶登錄和注冊的。是的簡稱,可以幫助我們創(chuàng)建用戶認(rèn)證,以此連接前后端。 本文來自pilishen.com----原文鏈接; 歡迎作客我們的php&Laravel學(xué)習(xí)群:109256050 這個(gè)例子將引導(dǎo)你在laravel中使用JWT來創(chuàng)建用戶登錄和注冊的API。JWT是Json Web Token的簡稱,可以幫助我們創(chuàng)建...

    zzbo 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<