Web2py - 訪問控制



身份驗證

幾乎每個應用程式都需要能夠對使用者進行身份驗證並設定許可權。web2py 帶有一個廣泛且可自定義的基於角色的訪問控制機制。它還支援 CAS、OpenID、OAuth 1.0、LDAP、PAM、X509 等協議。

web2py 包含一個稱為基於角色的訪問控制機制 (RBAC) 的機制,這是一種將系統訪問許可權限制為授權使用者的策略。實現 RBAC 的 web2py 類稱為 Auth。

請檢視以下架構。

Auth

Auth 定義了以下表格 -

序號 表名 & 描述
1

auth_user

儲存使用者的姓名、電子郵件地址、密碼和狀態。

2

auth_group

以多對多結構儲存使用者的組或角色

3

auth_membership

以多對多結構儲存使用者和組連結的資訊

4

auth_permission

該錶鏈接組和許可權。

5

auth_event

記錄其他表中的更改和成功訪問

6

auth_cas

用於中央認證服務

自定義 Auth

有兩種方法可以自定義 Auth。

  • 從頭開始定義自定義db.auth_user表。

  • 讓 web2py 定義auth表。

讓我們看看定義auth表的最後一種方法。在db.py模型中,替換以下行 -

auth.define_tables()

將其替換為以下程式碼 -

auth.settings.extra_fields['auth_user'] = [
   Field('phone_number',requires = IS_MATCH('\d{3}\-\d{3}\-\d{4}')),
   Field('address','text')
]

auth.define_tables(username = True)

假設每個使用者都包含電話號碼、使用者名稱和地址。

auth.settings.extra_fields是一個額外欄位的字典。鍵是要向其新增額外欄位的 auth 表的名稱。值為額外欄位列表。在這裡,我們添加了兩個額外欄位,phone_number 和 address

username必須以特殊方式處理,因為它參與了身份驗證過程,該過程通常基於電子郵件欄位。透過將 username 引數傳遞到以下行,它會通知 web2py 我們想要 username 欄位,並且我們希望將其用於登入而不是電子郵件欄位。它充當主鍵。

auth.define_tables(username = True)

使用者名稱被視為唯一值。在註冊發生在正常登錄檔單之外的情況下可能會出現這種情況。同樣,新使用者也可能被迫登入以完成註冊。

這可以透過使用一個虛擬欄位complete_registration來完成,該欄位預設設定為False,並在使用者更新其個人資料時設定為True

auth.settings.extra_fields['auth_user'] = [
   Field('phone_number',requires = IS_MATCH('\d{3}\-\d{3}\-\d{4}'),
   comment = "i.e. 123-123-1234"),
   Field('address','text'),
   Field('complete_registration',default = False,update = True,
   writable = False, readable = False)
]

auth.define_tables(username = True)

這種情況可能希望新使用者在登入後完成其註冊。

db.py中,在 models 資料夾中,我們可以追加以下程式碼 -

if auth.user and not auth.user.complete_registration:
if not (request.controller,request.function) == ('default','user'):
   redirect(URL('default','user/profile'))

這將強制新使用者根據要求編輯其個人資料。

授權

它是授予某些訪問許可權或向用戶授予某些許可權的過程。

在 web2py 中,一旦建立或註冊了新使用者,就會建立一個新組來包含該使用者。新使用者的角色通常稱為“user_[id]”,其中 id 是使用者的唯一標識。

建立新組的預設值為 -

auth.settings.create_user_groups = "user_%(id)s"

可以透過以下方式停用使用者之間組的建立 -

auth.settings.create_user_groups = None

建立、授予特定成員的訪問許可權和許可權可以透過 appadmin 的幫助以程式設計方式實現。

一些實現列出如下 -

序號 命令 & 用法
1

auth.add_group('role', 'description')

返回新建立組的 id。

2

auth.del_group(group_id)

刪除指定 id 的組

3

auth.del_group(auth.id_group('user_7'))

刪除具有給定標識的使用者組。

4

auth.user_group(user_id)

返回與給定使用者唯一關聯的組的 id 值。

5

auth.add_membership(group_id, user_id)

返回給定 group_id 的 user_id 值

6

auth.del_membership(group_id, user_id)

撤銷給定 member_id 即 user_id 從給定組的訪問許可權。

7

auth.has_membership(group_id, user_id, role)

檢查 user_id 是否屬於給定組。

中央認證服務 (CAS)

web2py 提供了一個行業標準,即客戶端認證服務 - CAS,用於在 web2py 中構建的客戶端和伺服器。它是一個第三方身份驗證工具。

它是一種用於分散式身份驗證的開放協議。CAS 的工作原理如下 -

  • 如果使用者訪問網站,該協議會檢查使用者是否已透過身份驗證。

  • 如果使用者未透過應用程式的身份驗證,則該協議會重定向到使用者可以在其中註冊或登入應用程式的頁面。

  • 如果註冊完成,使用者會收到一封電子郵件。除非使用者驗證電子郵件,否則註冊不完整。

  • 註冊成功後,使用者將使用 CAS 裝置使用的金鑰進行身份驗證。

  • 該金鑰用於透過在後臺設定的 HTTP 請求獲取使用者的憑據。

廣告

© . All rights reserved.