最佳實(shí)踐?用戶登錄模塊設(shè)計(jì)

0 評(píng)論 8185 瀏覽 57 收藏 16 分鐘

任何系統(tǒng)都少不了用戶登錄模塊。一個(gè)安全、方便的登錄模塊可以成為系統(tǒng)與用戶交互的良好開端。本文結(jié)合筆者的實(shí)際工作經(jīng)驗(yàn),以及相關(guān)知識(shí)的學(xué)習(xí),旨在對(duì)登錄模塊的一般原理和設(shè)計(jì)方法進(jìn)行一個(gè)系統(tǒng)性的闡述和總結(jié),希望能夠拋磚引玉,進(jìn)一步深化自己對(duì)這一模塊的認(rèn)知。

一、生活中的登錄場(chǎng)景

我們?nèi)粘I钪幸呀?jīng)習(xí)慣了這樣的場(chǎng)景:訪問一個(gè)系統(tǒng),系統(tǒng)會(huì)要求我們輸入用戶名、密碼(或者驗(yàn)證碼等方式),如果正確,我們就登錄進(jìn)入這個(gè)系統(tǒng)了。接著系統(tǒng)會(huì)顯示跟我們有關(guān)的信息,比如我們登錄淘寶,就可以看到自己的購(gòu)物車信息、歷史購(gòu)物記錄等。

在這個(gè)簡(jiǎn)單的場(chǎng)景里,登錄模塊做了哪些處理呢?如何確保操作賬號(hào)的人是賬號(hào)真正的持有人呢?為什么只能看到自己的購(gòu)物記錄而不能看到別人的呢?要回答這些問題,可以借助4A統(tǒng)一安全管理平臺(tái)解決方案這個(gè)框架來幫助我們思考。

二、4A安全管理框架——系統(tǒng)安全管理的最佳實(shí)踐

在系統(tǒng)構(gòu)成的虛擬世界里,用戶相關(guān)的全部資源都以數(shù)字形式存在。登錄模塊是現(xiàn)實(shí)中的人進(jìn)入虛擬世界的“門戶”,其本質(zhì)目的是實(shí)現(xiàn)安全管理,讓擁有正確“鑰匙”的人“進(jìn)門”,并阻擋“非法入侵”。1995年,國(guó)際網(wǎng)安界最早提出了4A(認(rèn)證Authentication、授權(quán)Authorization、記賬Accounting、審計(jì)Audit)的概念,后為國(guó)內(nèi)運(yùn)營(yíng)商所發(fā)展,形成了4A (賬號(hào)Account、認(rèn)證Authentication、授權(quán)Authorization、審計(jì)Audit)統(tǒng)一安全管理平臺(tái)解決方案這一最佳實(shí)踐:

1. 賬號(hào)

賬號(hào)可以看作是我們?cè)谶@個(gè)虛擬世界里的一間房子,房子里放著所有我們?cè)谶@個(gè)虛擬世界的資產(chǎn),比如“身份證”(個(gè)人信息)、“存折”(銀行卡信息)等。我們希望自己在虛擬世界中的資產(chǎn)得到保護(hù),也希望離開這個(gè)虛擬世界后這些資產(chǎn)得到妥善的處置。隨著歐盟的《GDPR》,我國(guó)的《數(shù)據(jù)安全法》、《個(gè)人信息保護(hù)法》等法規(guī)的出臺(tái),作為系統(tǒng)設(shè)計(jì)者,不單要考慮賬號(hào)的注冊(cè)場(chǎng)景,賬號(hào)的刪除場(chǎng)景也同樣重要,一個(gè)設(shè)計(jì)良好的系統(tǒng)需要有完善的賬號(hào)生命周期管理機(jī)制。

2. 認(rèn)證

認(rèn)證是門上的鎖,沒有鎖的門別人是可以自由出入的,有了鎖就可以確保只有我們自己才有鑰匙可以進(jìn)入。鎖的形式多種多樣,比如上面例子中提到的用戶名+密碼。鎖非常關(guān)鍵,很多黑產(chǎn)的攻擊目標(biāo)就是這個(gè)環(huán)節(jié),圍繞認(rèn)證的網(wǎng)絡(luò)安全技術(shù)也在不斷發(fā)展,比如多因素認(rèn)證、登錄加密、異地登錄識(shí)別、設(shè)備更換識(shí)別、密碼最大錯(cuò)誤次數(shù)鎖定、自動(dòng)登出、多端登錄提醒等。

3. 授權(quán)

授權(quán)就是定義每個(gè)人的房子里裝哪些數(shù)據(jù)資產(chǎn),我們的“身份證”不會(huì)放在別人房子里,別人的“存折”也不會(huì)放在我們的房子里,我們對(duì)自己房子里的資產(chǎn)擁有控制權(quán)限。C端場(chǎng)景下,通常用戶的權(quán)限是統(tǒng)一的,有些產(chǎn)品有VIP的設(shè)定,其權(quán)限和普通用戶不同,但也是有限的幾類,因此權(quán)限管理相對(duì)簡(jiǎn)單。B端系統(tǒng)一般都是為了滿足特定的管理目的而存在,管理職責(zé)因人而異,無法統(tǒng)一,自然權(quán)限管理就相對(duì)復(fù)雜。在設(shè)計(jì)B端系統(tǒng)前,應(yīng)該先確定關(guān)鍵用戶,了解他們的工作職責(zé),從而對(duì)系統(tǒng)應(yīng)該實(shí)現(xiàn)怎樣顆粒度的權(quán)限管理形成認(rèn)知。

4. 審計(jì)

審計(jì)相當(dāng)于房子里的監(jiān)控裝置。即使鎖再好,也不可避免被攻破,房子里裝了監(jiān)控,我們就可以在一些非法入侵事件發(fā)生之后去查看當(dāng)時(shí)的情況,挽回?fù)p失或者避免損失擴(kuò)大。所以我們需要對(duì)登錄、密碼修改等敏感操作生成日志,并對(duì)這些日志進(jìn)行定期審閱。

通過上面的分析,我們就知道一個(gè)系統(tǒng)的登錄模塊需要包含的主要功能就是賬號(hào)管理、認(rèn)證管理、權(quán)限管理、日志管理幾部分,下面就來介紹具體如何設(shè)計(jì)。

三、登錄模塊的設(shè)計(jì)要點(diǎn)

1. 賬號(hào)與密碼

設(shè)計(jì)賬號(hào)表,最關(guān)鍵的問題是主鍵的選擇(就是以什么作為一個(gè)賬號(hào)的唯一標(biāo)識(shí))。在一個(gè)系統(tǒng)內(nèi),用戶名、郵箱、手機(jī)號(hào)都是唯一的,理論上都可以作為主鍵,但實(shí)際上并不好用。

假如把用戶名作為主鍵,下游的業(yè)務(wù)數(shù)據(jù)表中可能記錄了用戶名,例如一個(gè)電商平臺(tái)記錄一筆訂單的創(chuàng)建人為用戶名。這樣的話修改用戶名的場(chǎng)景就難以實(shí)現(xiàn)了,因?yàn)橛脩裘坏└?,用戶將無法找回自己以前創(chuàng)建的訂單。手機(jī)號(hào)、郵箱也存在同樣的問題。

更好的做法是系統(tǒng)按照某種規(guī)則自動(dòng)生成一串唯一字符作為一個(gè)賬號(hào)的唯一標(biāo)識(shí),即賬號(hào)表的主鍵,我們命名為UserId。

由于其沒有任何業(yè)務(wù)意義,不存在修改的場(chǎng)景,因此可以保持穩(wěn)定。用戶名、手機(jī)號(hào)、郵箱等信息作為賬號(hào)相關(guān)的屬性,變更的場(chǎng)景就容易實(shí)現(xiàn)了。同時(shí)需要注意,在開發(fā)各類業(yè)務(wù)場(chǎng)景時(shí),當(dāng)需要記錄操作人身份時(shí),應(yīng)該統(tǒng)一使用UserId。

大多數(shù)系統(tǒng)都提供了用戶名+密碼這一登錄方式,管理密碼最主要考慮的是安全問題。密碼不可明文存儲(chǔ),否則當(dāng)數(shù)據(jù)庫(kù)被人惡意訪問時(shí),所有用戶的密碼都會(huì)被泄露。解決密碼存儲(chǔ)安全性問題,比較常用的方式是加鹽哈希。

滿足創(chuàng)建賬號(hào)、設(shè)置密碼、用戶名+密碼登錄這些基本功能,賬號(hào)表至少需要包含以下字段:

注:本文提到的表單字段僅為業(yè)務(wù)邏輯類字段,并非數(shù)據(jù)庫(kù)建表實(shí)際字段。開發(fā)過程中一般都需要添加代碼邏輯所必須的字段,如邏輯主鍵、創(chuàng)建時(shí)間、創(chuàng)建人、更新時(shí)間、更新人等,上文提及的加鹽哈希需要額外存儲(chǔ)密碼鹽值,為了保持登錄會(huì)話可能需要添加字段保存token等,這些用于技術(shù)實(shí)現(xiàn)所必須的字段不在本文的討論范圍內(nèi)。

用戶注冊(cè)、密碼登錄流程示例如下:

2. 手機(jī)號(hào)/郵箱登錄

對(duì)于用戶來說,記憶密碼是不方便的,而且也存在安全隱患。手機(jī)號(hào)+驗(yàn)證碼登錄操作簡(jiǎn)單,用戶接受度高,是國(guó)內(nèi)普遍采用的注冊(cè)、登錄方式。在海外市場(chǎng)中,郵箱+驗(yàn)證碼也是很常見的。為了實(shí)現(xiàn)手機(jī)號(hào)/郵箱的綁定/換綁、驗(yàn)證碼登錄功能,我們需要擴(kuò)展賬號(hào)表字段,至少需要添加手機(jī)號(hào)、郵箱2個(gè)字段:

手機(jī)號(hào)/郵箱的綁定/換綁、驗(yàn)證碼登錄流程基本相同,可以合并表示,具體見下圖:

3. 第三方登錄

為了簡(jiǎn)化用戶注冊(cè)流程,降低用戶的注冊(cè)成本,不少應(yīng)用都提供了第三方登錄方式,國(guó)內(nèi)常見的有通過微信、QQ、微博等賬號(hào)登錄,海外常見的有通過Google、Facebook、Twitter等賬號(hào)登錄。例如下面這個(gè)登錄頁,底部提供了3種第三方登錄方式:

第三方登錄使用的主流授權(quán)流程是OAuth,各大第三方平臺(tái)的開發(fā)者文檔都有接入方式的詳細(xì)說明。為了實(shí)現(xiàn)第三方登錄,我們需要進(jìn)一步擴(kuò)展賬號(hào)表字段。考慮到第三方平臺(tái)有多個(gè),可能會(huì)陸續(xù)接入,為了方便系統(tǒng)擴(kuò)展,應(yīng)該添加第三方平臺(tái)類型字段,表示登錄來源。用戶通過第三方平臺(tái)登錄后,第三方平臺(tái)會(huì)返回表示用戶身份的唯一ID,我們需要將這個(gè)ID和自建系統(tǒng)的UserId進(jìn)行關(guān)聯(lián),因此也需要一個(gè)字段記錄。具體如下:

由于登錄過程引入了第三方平臺(tái),登錄流程更加復(fù)雜了,可以參考下面這個(gè)時(shí)序圖來理解整個(gè)第三方登錄的過程:

4. 權(quán)限管理

用戶成功登錄系統(tǒng)后,接下來就需要知道這個(gè)用戶可以訪問哪些資源、可以執(zhí)行哪些功能。例如在一個(gè)組織的HR系統(tǒng)內(nèi),每個(gè)人只能看到本人及下屬的考勤記錄,這就是一種對(duì)數(shù)據(jù)的權(quán)限控制;又如系統(tǒng)管理員可以修改員工信息,普通用戶只能查看員工信息,這就是一種對(duì)操作的權(quán)限控制。

在訪問控制領(lǐng)域,廣泛采用的權(quán)限模型有RBAC(基于角色的訪問控制)和ABAC(基于屬性的訪問控制),二者也可以結(jié)合使用。RBAC是通過把一組權(quán)限封裝在一個(gè)角色中,再把角色授予用戶,以此來實(shí)現(xiàn)靈活的權(quán)限控制。

RBAC的優(yōu)點(diǎn)是操作簡(jiǎn)單,并能滿足大部分場(chǎng)景下的訪問控制要求。在RBAC模型中,用戶與角色是一對(duì)多的關(guān)系。ABAC的控制規(guī)則是建立在一組“屬性”上的。比如可以定義一個(gè)規(guī)則,僅允許人力資源部門的員工在9:30至18:30之間查看員工簡(jiǎn)歷,“人力資源部的員工”是用戶屬性,“9:30至18:30”是環(huán)境屬性。ABAC的優(yōu)點(diǎn)是具有更多維度的控制變量,從而實(shí)現(xiàn)叫RBAC顆粒度更細(xì)的訪問控制,但建立規(guī)則的過程也更加復(fù)雜。

本文以RBAC為例。在RBAC模型中,一個(gè)角色內(nèi)包括多個(gè)權(quán)限項(xiàng),一個(gè)用戶可以有多個(gè)角色,結(jié)構(gòu)如下圖:

我們至少需要增加4張表來表示上述結(jié)構(gòu):

首先是用戶角色表(user_role),用來表示用戶和角色的關(guān)聯(lián)關(guān)系,通過UserId與賬號(hào)表(user_account)進(jìn)行外鍵鏈接,用戶登錄后,可以在此表查找其擁有的角色。

然后是角色權(quán)限表(role_permission),用來表示角色和權(quán)限的關(guān)聯(lián)關(guān)系,通過RoleId與用戶角色表(user_role)進(jìn)行外鍵鏈接,找到用戶擁有的角色后,可以在此表查找這些角色內(nèi)包含的權(quán)限。

另外還需要角色表(role_info)和權(quán)限表(permission_info),用于記錄角色和權(quán)限的基本信息。

整體的數(shù)據(jù)結(jié)構(gòu)如下:

5. 日志

在內(nèi)部控制領(lǐng)域,控制分為預(yù)防性控制、檢查性控制、糾正性控制3類。賬號(hào)管理、認(rèn)證管理、權(quán)限管理都屬于預(yù)防性控制,即通過事先建立這些機(jī)制,可以保護(hù)用戶數(shù)字資產(chǎn)的安全。而日志管理則是一種檢查性控制,是一種事后的控制。當(dāng)我們需要排查、診斷系統(tǒng)問題,追溯入侵事件時(shí),有日志的幫助,可以大大提高分析效率。

對(duì)于登錄模塊,最基礎(chǔ)的日志需要記錄賬號(hào)、登錄時(shí)間、登錄IP、登錄設(shè)備等信息。登錄后的操作日志,則需要根據(jù)不同的業(yè)務(wù)場(chǎng)景設(shè)計(jì)。為了平衡成本和收益,通常需要對(duì)敏感操作生成日志,而不是事無巨細(xì)地記錄。比如某個(gè)表單中含有關(guān)鍵的數(shù)據(jù),可以對(duì)這個(gè)表單中的新增、刪除、編輯操作生成日志,編輯類操作還可以進(jìn)一步記錄編輯前、編輯后的信息。

6. 延伸思考

一般情況下,用戶注冊(cè)賬號(hào)之后,系統(tǒng)還需要收集用戶個(gè)人信息,例如頭像、性別、生日、興趣愛好、從事的行業(yè)、教育背景等,這些信息是否適合記錄在賬號(hào)表中呢?出于系統(tǒng)擴(kuò)展性考慮以及解耦的思想,筆者認(rèn)為另建一個(gè)用戶信息表存儲(chǔ)這些信息更好,雖然它和賬號(hào)表是一對(duì)一的關(guān)系。賬號(hào)表只負(fù)責(zé)賬號(hào)、登錄、認(rèn)證功能。當(dāng)然這個(gè)問題沒有標(biāo)準(zhǔn)答案,合理即可。

本文由@武林 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)作者許可,禁止轉(zhuǎn)載。

題圖來自Unsplash,基于CC0協(xié)議。

該文觀點(diǎn)僅代表作者本人,人人都是產(chǎn)品經(jīng)理平臺(tái)僅提供信息存儲(chǔ)空間服務(wù)。

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. 目前還沒評(píng)論,等你發(fā)揮!