<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          權(quán)限管理「基于角色的訪問控制(RBAC)」

          共 2746字,需瀏覽 6分鐘

           ·

          2020-01-10 23:22


          本文公眾號(hào)來源:編程新說作者:編程新說李新杰本文已收錄至我的GitHub
          很多時(shí)候,需要對(duì)一些事物進(jìn)行控制,如一個(gè)房間,為了不讓人隨便進(jìn),通常會(huì)裝一把鎖,如果要想進(jìn)入,你必須得有一把鑰匙,且還得和這個(gè)鎖匹配才行。

          基于此做一個(gè)抽象,其實(shí)包含三方面內(nèi)容:

          1)一個(gè)是被控制的事物,通常就算資源。

          2)一個(gè)是想訪問這些資源的人所必須擁有的東西,通常就算憑證。

          3)還有一個(gè)就是進(jìn)行憑證和資源的匹配。


          Web應(yīng)用中的資源


          網(wǎng)絡(luò)時(shí)代絕大多數(shù)都是web應(yīng)用。web應(yīng)用的一大特點(diǎn)就是Client和Server。客戶端發(fā)起一個(gè)請(qǐng)求,服務(wù)器就給出一個(gè)響應(yīng)。

          對(duì)客戶端的要求只有一個(gè),那就是要知道請(qǐng)求對(duì)應(yīng)的URL。客戶端請(qǐng)求不同的URL就可以得到不同的內(nèi)容,或者反過來說,客戶端為了得到不同的內(nèi)容只要請(qǐng)求不同的URL即可。

          這些內(nèi)容可以認(rèn)為是服務(wù)器開放給客戶端的資源,所以站在客戶端的角度,服務(wù)器上的資源就是由許多URL組成的,因?yàn)榭蛻舳酥荒芡ㄟ^URL的方式和服務(wù)器打交道。

          URL可以說是一個(gè)底層本質(zhì)的東西,它的上面會(huì)有很多不同的展現(xiàn)形式:

          菜單可以對(duì)應(yīng)URL

          頁(yè)面可以對(duì)應(yīng)URL

          按鈕可以對(duì)應(yīng)URL

          Ajax可以對(duì)應(yīng)URL

          服務(wù)API可以對(duì)應(yīng)URL

          文件下載可以對(duì)應(yīng)URL

          靜態(tài)文件css、js、images可以對(duì)應(yīng)URL

          這些就是通常我們見到的資源,它們就是要被控制訪問的事物。


          把憑證授給用戶


          憑證這個(gè)東西的作用,大家都很熟悉,就是可以用來證明一個(gè)事物的合法性。比如一個(gè)身份證可以證明你是一個(gè)合法公民。一張車票可以證明你是一個(gè)合法乘客。

          但是對(duì)憑證的存在形式,其實(shí)并沒有什么硬性規(guī)定,因?yàn)殡S著時(shí)間的推移,它是會(huì)變的,也就是說具有階段性。

          就拿鎖來說,它的憑證以前是一把鑰匙,后來變成一串?dāng)?shù)字密碼,再后來變成一個(gè)指紋,現(xiàn)在又變成一張人臉或一個(gè)聲紋,再往未來發(fā)展,可能就是一種意念了。

          web應(yīng)用中的資源就是URL,我們可以把這個(gè)URL直接作為憑證授予用戶,只需把這些授予關(guān)系存儲(chǔ)起來即可,說白了就是,哪個(gè)用戶可以訪問哪些URL。

          或者也可以把這些URL進(jìn)行等價(jià)變形,把變形后的產(chǎn)物授予用戶,總之,只要能建立起合理的映射關(guān)系就行了。


          角色出現(xiàn)的必然性


          假如有一個(gè)新聞系統(tǒng),為了讓某人能順利的發(fā)新聞,需要由技術(shù)人員授予她一大堆的URL。這樣一個(gè)“簡(jiǎn)單”的事情中,就存在兩個(gè)潛在的弊端。

          一個(gè)是必須由技術(shù)人員來做,因?yàn)榉羌夹g(shù)人員可能連URL這個(gè)詞都不知道是什么。一個(gè)是一大堆的URL,太多了,操作麻煩,還可能漏掉某個(gè)。

          究竟由誰(shuí)發(fā)新聞,這是業(yè)務(wù)和管理上的事情,不應(yīng)該由技術(shù)來做,他們不做的原因是因?yàn)殚T檻太高,所以技術(shù)應(yīng)該想辦法來降低工作的門檻。

          可能領(lǐng)導(dǎo)覺得現(xiàn)在的新聞發(fā)布人員工作很認(rèn)真,于是讓她去審核新聞了,又來了一個(gè)新的新聞發(fā)布人員。這下又要“折騰”技術(shù)人員了。

          技術(shù)需要先把她的發(fā)布新聞URL去掉,授給她審核新聞的URL,然后再把發(fā)布新聞的URL授給新來的人員。可能過兩天又來了一個(gè)新聞發(fā)布人員。

          這可簡(jiǎn)直要了技術(shù)人員的“命”了,所以技術(shù)應(yīng)該想辦法來降低工作的繁瑣性,絕對(duì)是利人又利己。

          在計(jì)算機(jī)里,解決此類問題的一個(gè)“標(biāo)準(zhǔn)指導(dǎo)方針”就是,抽象和封裝。抽象出一層來,把復(fù)雜的東西封裝起來。

          就是讓不該看的人看不到他不該看的東西,只讓他看到他該看到的東西。就像同一個(gè)事物在不同人眼里是不一樣的。

          一棟大樓,在設(shè)計(jì)人員眼里就是一堆圖紙,在工程人員眼里就是一堆結(jié)構(gòu)和承重計(jì)算的公式,在建筑工人眼里就是一堆鋼筋和混凝土,在裝修人員眼里就是毛坯房,在業(yè)主眼里就是他自己未來的家。

          最終角色這個(gè)東西就是被抽象出來的一層,它起到過渡的作用,從這一層向下是技術(shù)人員負(fù)責(zé)的,從這一層向上是業(yè)務(wù)管理人員負(fù)責(zé)的。

          技術(shù)人員預(yù)定義好一些角色,比如新聞發(fā)布員、新聞審核員,然后把和發(fā)布相關(guān)的所有URL授予發(fā)布員這個(gè)角色,把和審核相關(guān)的所有URL授予審核員這個(gè)角色。

          剩下的工作就交給業(yè)務(wù)管理人員來做,他們把角色授予某個(gè)人,只需一步即可,也不涉及什么技術(shù)知識(shí)。這真是各管各的,兩全其美。

          其實(shí)這個(gè)角色就是上面提到的一堆URL的等價(jià)變形,最終起到的也是一個(gè)傳遞映射關(guān)系的橋梁作用。


          憑證和資源的匹配方式


          在持有憑證去訪問資源的時(shí)候需要進(jìn)行憑證和資源的匹配。就像進(jìn)考場(chǎng)要看準(zhǔn)考證、上車前要驗(yàn)票一樣。

          憑證的存在形式不同,匹配的方式也不同,如果是鑰匙,需要機(jī)械匹配。如果是密碼,需要相等性匹配。

          如果是指紋、圖像、聲紋,需要的是概率性匹配,因?yàn)檫@些東西貌似無(wú)法相等,只有一個(gè)匹配度。

          對(duì)于web應(yīng)用的URL,只有用戶訪問時(shí)才需要匹配,我們就在請(qǐng)求必經(jīng)的路上設(shè)置一到多道關(guān)卡進(jìn)行攔截,常用的就是過濾器和攔截器。

          在被攔截以后,從請(qǐng)求中解析出本次訪問的URL,從當(dāng)前登陸用戶信息中拿到具有的角色和能訪問的URL,然后按自己設(shè)定的一套邏輯去匹配。

          如果匹配成功就放行,會(huì)自動(dòng)進(jìn)行后續(xù)處理。匹配不成功就禁止通行,告訴他不能通行的原因,結(jié)束本次訪問。


          基于角色的訪問控制


          其實(shí)上面講的就是基于角色的訪問控制的原理。原理很簡(jiǎn)單,如果沒有特殊要求的話,實(shí)現(xiàn)也不難。

          就是經(jīng)典的五張表:

          1)權(quán)限表,也稱資源表,記錄所有的資源URL。

          2)角色表,記錄所有的角色。

          3)角色權(quán)限表,記錄每個(gè)角色都能訪問哪些權(quán)限。

          4)用戶表,記錄所有用戶。

          5)用戶角色表,記錄每個(gè)用戶被授予的角色。

          按實(shí)際需求決定的部分:

          1)一個(gè)用戶是只能有一個(gè)角色,還是可以有多個(gè),這個(gè)依托用戶角色表即可實(shí)現(xiàn)。

          2)角色之間是否可以繼承,是單繼承還是多繼承,這個(gè)需要一個(gè)單獨(dú)的角色繼承表來存儲(chǔ)。

          兩個(gè)特殊的事物:

          1)一個(gè)是沒有任何限制的公共資源,如js、css、images等,可以設(shè)置一個(gè)白名單,把它們放入其中,這些URL相當(dāng)于“免檢”。

          2)一個(gè)特殊的用戶,如超級(jí)管理員,這個(gè)需要在用戶表進(jìn)行標(biāo)識(shí),遇到它后直接放行,因?yàn)樗彩恰懊鈾z”。


          是否選擇現(xiàn)成的框架


          常用的現(xiàn)成的框架就是Spring SecurityApache Shiro。它們屬于上手不難,想用好卻不簡(jiǎn)單的那種。

          我覺得可以按以下情況來選擇:

          1)有專門團(tuán)隊(duì)或人員維護(hù)的,可以選擇從零研發(fā)或基于框架的深度擴(kuò)展。

          2)沒有專人負(fù)責(zé),也不想麻煩的,建議不要用框架,應(yīng)該自己寫代碼簡(jiǎn)單實(shí)現(xiàn)。

          3)不怕麻煩的,愛研究的,可以選擇框架,掌握使用方式,明白運(yùn)行原理,看看底層源碼。

          總之,一定要做到可控,特別是自身或團(tuán)隊(duì)在條件不允許的情況下,千萬(wàn)別去捅馬蜂窩。


          歡迎加入交流群學(xué)習(xí),備注加群說實(shí)話在這個(gè)群,哪怕您不說話,光看聊天記錄,都能學(xué)到東西

          兩年嘔心瀝血的文章「面試題」「基礎(chǔ)」「進(jìn)階」這里全都有!

          300多篇原創(chuàng)技術(shù)文章加入交流群學(xué)習(xí)海量視頻資源精美腦圖面試題

          長(zhǎng)按掃碼可關(guān)注獲取?

          在看和分享對(duì)我非常重要!

          瀏覽 28
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本少妇无码精品18p | 岛国免费小电影在线 | XA片一级日本 | 欧洲操逼 | 韩国美女操逼 |