1. 程式人生 > >Java for Web學習筆記(一四一)Spring security準備(2)授權

Java for Web學習筆記(一四一)Spring security準備(2)授權

訪問的範圍和許可權屬於授權。

Principals和Identities

就Java而言,很方便利用java.security.Principal。Principal至少會包含已被認證的使用者identity,例如使用者名稱,還可能有其他資訊。此外還可以保護使用者的授權資訊,這些資訊的表述應採用常量,例如列舉或者有限的字串,否者過多的授權會對記憶體有影響,進而影響效能。

Roles,Groups,Activities和Permissions

授權的表述沒有什麼約束,但需要仔細設計,修改會比較麻煩。

角色是否具備許可權。例如論壇的:

  • 發貼人:可以釋出訊息和回覆
  • 稽核員:具有發帖人的角色;外加可以刪除訊息和回覆
  • 管理員:具有稽核員的角色;外加可以刪除和禁言使用者;管理稽核員。
public void deleteReply(long id){
    if(security.userInRole("moderator")){
        ...
    }
}

如果需要對發表訊息和回貼有不同的稽核員,按上述的處理,就需要重新發布我們的應用。可以根據最小的顆粒度來進行授權。這就是基於活動。上面的例子中使用者的活動包括:發帖,回帖,修改自己的帖子,修改自己的回覆,刪除自己的帖子,刪除自己的回覆,刪除其他人的帖子,刪除其他人的回覆,臨時禁言使用者,永久禁言使用者,刪除使用者,設定使用者許可權。

在基於活動中,程式碼就變為

public void deleteReply(long id){
    if((security.userHasActivity("DELETE_OTHER_REPLY") ||
          isOwnReply() && security.userHasActivity("DELETE_OWN_REPLY")){
        ...
    }
}

當動作有上百的時候,我們為每個使用者來定義每個動作的許可權就存在困難。引入group的概念。使用者繼承了group的許可權,如果使用者修改其許可權,可以從一個group移動另一個group。和role不同,group可以在runtime中動態建立或者改變(對應的動作許可權的設定),而無需修改程式。

具體的實現方式很多,可以定義一個抽象的principal,裡面有各動作的許可權,group和使用者principal繼承之,又或者可以作為一個屬性等等。

基於宣告的授權

微軟的Active Directory為例,當你使用向某臺機器使用windows域憑證進行認證時,域控制器想改機器給出你的身份宣告以及授權宣告。你將繼承你所歸屬的域組的許可權。這是結合了基於宣告的認證和授權。如果僅使用其中的認證部分,我們需要根據認證返回的標記,在自己的系統中找到許可權分配。