認證與授權一直以來都是很多人在討論的話題,之所以想這次談一談認證和授權,主要是因為最近看到許多文章都把認證和授權混為一談,把認證方式當作是授權方式。所以想寫篇文章談談我眼中的認證與授權
什麼是認證?認證是乙個嘗試解決我是誰的問題的過程。
以乙個 http 請求為例,認證就是嘗試從請求資訊中獲取使用者資訊的過程,
有一點需要特別注意:認證並不等於一定有使用者資訊,有些文章直接把認證等同於有使用者資訊,再次強調,認證就是認證,一定有使用者資訊就相當於是要授權了,有使用者資訊只能說明某種認證方式認證成功了,經過某種反射光hi認證之後,還是沒有使用者資訊,只能說明這種認證方式認證失敗,認證失敗並不代表授權失敗。
認證的方式可以多種多樣,而且我們可以同時使用多種認證方式:比如說 cookie 認證、jwt 認證 以及其他自定義 token 認證,之所以稱之為認證方式,是因為他們只提供解決我是誰的解決方案,比如 cookie 認證會嘗試從 http 請求攜帶的 cookie 資訊中獲取使用者資訊,而 jwt 則是從 authorization 請求頭中的 bearer token 獲取使用者的資訊,自定義的token 也類似。
甚至我們可以做一些擴充套件,做一些不一樣的認證,比如說根據 header/querystring authentication,我在我們的專案裡就是這麼做的,閘道器解析出使用者資訊之後**給下游服務的請求會把使用者資訊放在請求頭里,我們自定義了乙個headerauthentication
從請求頭中獲取使用者的資訊,我們下游服務就可以用headerauthentication
替換原來使用的 jwt 認證,這樣 jwt 只需要在閘道器處認證一次即可,下游服務不再需要驗證 token 的有效性以及解析這個 token。
之前提供了乙個開源版本的 header/querystring authentication 的實現,實現原始碼:
什麼是授權?授權顧名思義就是授予許可權,允許檢視或進行某種操作。
授權是嘗試對使用者授予訪問或操作許可權的過程
如果乙個資源是允許匿名訪問的,那麼無論認證成功與否,無論有沒有使用者資訊,都是可以授權訪問的
如果乙個資源是需要使用者有某個角色(manager)才能訪問的,那麼首先我們應該先通過認證獲取使用者的資訊,再判斷使用者是否有這個角色,如果有這個角色則允許授權,否則都不應授權訪問。
一點嘮叨:
允許匿名訪問、需要使用者登入才能訪問、需要某種角色才能訪問等這些都屬於授權,不屬於認證,就像允許匿名訪問,沒有使用者資訊也可以訪問,但是並不影響認證的過程,使用者認證成功還是有使用者資訊的。
認證是乙個嘗試解決我是誰的問題的過程。
授權是嘗試對使用者授予訪問或操作許可權的過程
最後安利一下,自己做的乙個關於授權的專案accesscontrolhelper
accesscontrolhelper
是乙個基於策略的授權解決方案,最早是基於 asp.net mvc 做的,實現了可以控制對 action 的訪問和頁面上某個元素的訪問(conditional server render),後來.netcore2.0 發布之後也支援了 .netcore,.netcore 下的支援更多一點,支援 .net core 下的taghelper
和policy
,現在的實現還有不太好,感興趣的可以上去看看,歡迎 issue/pr ...
github:
spring security 認證與授權
1 引入 spring security 模組 org.springframework.boot groupid spring boot starter security artifactid dependency role form class form div action login meth...
FluorineFx 認證與授權
對認證與授權沒啥概念的新同學,建議先看下 net中的認證 authentication 與授權 authorization 然後再繼續。flash flex在通過fluorinefx呼叫.net中的方法時,同樣也會遇到認證與授權問題,即 是否隨便乙個阿貓阿狗都能來呼叫我的方法?或者可以理解為 呼叫我...
Spring security認證與授權 四
在第三個例項基礎上我做了第四個例項,這個例項很簡單。預設情況下,角色名稱必須以role 開頭,否則spring security框架無法識別,有時這會讓人覺得很不爽。當然,這是可以改變的。第四個例項 就是這一行 property name roleprefix value auth 你可以將字首修改...