iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 15
0
Modern Web

BeeGo系列 第 15

Middleware / Filter(1)

Django 有 middleware,可以處理在進 View 之前的 HTTP Request,而在 BeeGo 裡,是稱做 Filter。在上篇裡,我們也有看到這部份。BeeGo 官方文件對這部份蠻匱乏的,Filter 裡有帶到一點點,Session module 也有帶到一點點。

BeeGo 原始碼的 plugins 目錄下,則是有實作了 auth (Basic authentication)、authz (Casbin)、apiauth (Token) 以及 CORS 。剛好可以拿來參考一下,做出自己的 Authentication。

Basic authentication

先看一下 plugins/auth.go 裡的 Basic authentication 怎麼使用。

開啟 routers/router.go,在 import 加入

"github.com/astaxie/beego/plugins/auth"

然後再加入 Filter

// 略
beego.InsertFilter("/myuser/*", beego.BeforeRouter, auth.Basic("foobar", "pass"))
beego.Router("/myuser", &controllers.MyUserController{}, "get:GetAll")
// 略

重新編譯,在瀏覽器的網址列輸入 http://localhost:8080/myuser/ 時,就會跳出瀏覽器的 HTTP基本認証對話視窗了。

Django 裡的作法

那如果我們要使用 Session 搭配 ORM 的話,該怎麼做呢?我們先看一下 Django 怎麼做。

Django 這部份主要是在 contrib/auth 裡,主要有幾個部份

  1. login():做登入時,都會呼叫此函式,這個函式會做這幾件事情:
    1. 檢查使用者,如果是空的,會使用 request 預設的 user,這個 user 是由 AuthenticationMiddleware 所安插進去的。
    2. 檢查 session 是否過期
    3. 取得 backend ,預設是 ModelBackend
    4. 將 user 相關資訊與 backend 資訊放到 session 裡。
    5. 發送通知給 user_logged_in 這個 signal
  2. AuthenticationMiddlware
    1. 這個 middleware 會在安插 user 的 attribute 給 request ,實際上會呼叫 contrib.auth 的 get_user() 來取得。
    2. get_user() 會使用 session 裡的資訊,來載入 backend 並且找到對應的使用者,如果沒找到,會回傳 Anoymous User。
  3. login_required / LoginRequiredMixin:檢查 user.is_authenticated ,確定使用者是否已經驗證過。如果沒有驗證過,會導向到 login url。

小結

了解 Django 怎麼做之後,下一篇我們就來試著實作看看,可能會改動不少程式。


上一篇
Session(2)
下一篇
Middleware / Filter(2)
系列文
BeeGo30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言