- Web2py 教程
- Web2py - 首頁
- Web2py - 簡介
- Web2py - Python 語言
- Web2py - 框架概述
- Web2py - 核心
- Web2py - 檢視
- Web2py - 資料庫抽象層
- Web2py - 表單 & 驗證器
- Web2py - 郵件 & 簡訊
- Web2py - 訪問控制
- Web2py - 服務
- Web2py - 新增 Ajax 效果
- Web2py - 元件
- Web2py - 部署
- Web2py - 安全性
- Web2py 有用資源
- Web2py - 快速指南
- Web2py - 有用資源
- Web2py - 討論
Web2py - 訪問控制
身份驗證
幾乎每個應用程式都需要能夠對使用者進行身份驗證並設定許可權。web2py 帶有一個廣泛且可自定義的基於角色的訪問控制機制。它還支援 CAS、OpenID、OAuth 1.0、LDAP、PAM、X509 等協議。
web2py 包含一個稱為基於角色的訪問控制機制 (RBAC) 的機制,這是一種將系統訪問許可權限制為授權使用者的策略。實現 RBAC 的 web2py 類稱為 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 請求獲取使用者的憑據。