1. 程式人生 > >網站後臺系統權限部分實現

網站後臺系統權限部分實現

介紹 user HR 註解 ont 規則 java dex mep

  基本上所有網站都有後臺管理系統。系統根據業務劃分成不同的系統角色。而每個角色肯定是擁有著不同的權限。這個權限就根據登錄後功能菜單的多少來體現。

  那麽這是如何實現的呢?

  在剛開始接觸這方面的時候,意識到權限問題,自己隨手寫的練手項目是將帳號表中設置一個權限字段。比如1代表超級管理員,2代表普通用戶種種。用戶登錄進來的時候,頁面裏用jstl標簽判斷權限類型,渲染不同的靜態頁面。這種方法確實是可行的。但是如果後期需要增加菜單,那麽就需要更改代碼,或者是增加角色,也需要更改代碼。如果後期有一點點變動,都需要重新對代碼進行更改。

  後來,看到了另一個項目,權限是這麽實現的。

  用於角色權限的一般設計有五張表,權限表、角色表、用戶表、用戶角色表、角色權限表。

  1.權限表 一般設計有 id pid name code zindex page description generatemenu 字段,用來生成菜單樹結構。

  2.角色表 用於存儲角色類型,如 超級管理員角色、普通用戶等。

  3.用戶表 實際上就是User表,用於存儲用戶信息。

  4.用戶角色表 是角色表和用戶表的關聯表,多對多的關系。一個角色可對應於多個用戶,一個用戶也可以對應於多個角色。

  5.角色權限表 是角色表和權限表的關聯表,多對多的關系。一個角色擁有多個權限,一個權限也可以被多個角色擁有。

  如果存在資源表 則 再加 資源表和資源角色表共七張表,不過一般是上述五表。

  系統菜單一般是怎麽實現的呢?

_____________________________________________

  這裏涉及到apache shiro框架。

  //apache shiro簡要介紹  

  它的核心功能有:認證、授權、會話管理、加密。

  l shiro框架認證流程

技術分享圖片

Application Code:應用程序代碼,由開發人員負責開發的

Subject:框架提供的接口,代表當前用戶對象

SecurityManager:框架提供的接口,代表安全管理器對象

Realm:可以開發人員編寫,框架也提供一些,類似於DAO,用於訪問權限數據

  使用過程:

1.maven工程的話,導入依賴

2.web.xml中配置spring整合的過濾器shiroFilter  對應的class為DelegatingFilterProxy

3.spring中配置bean id為shiroFilter

技術分享圖片

技術分享圖片

4.配置安全管理器

技術分享圖片

5.login方法進行登錄認證

技術分享圖片

6.自定義Realm,並註入給安全管理器

public class BOSRealm extends AuthorizingRealm{

@Autowired

private IUserDao userDao;

//認證方法

protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

System.out.println("realm中的認證方法執行了。。。。");

UsernamePasswordToken mytoken = (UsernamePasswordToken)token;

String username = mytoken.getUsername();

//根據用戶名查詢數據庫中的密碼

User user = userDao.findUserByUserName(username);

if(user == null){

//用戶名不存在

return null;

}

//如果能查詢到,再由框架比對數據庫中查詢到的密碼和頁面提交的密碼是否一致

AuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), this.getName());

return info;

}

//授權方法

protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

// TODO Auto-generated method stub

return null;

}

技術分享圖片

以上是登錄認證(參考黑馬視頻bos項目文檔)

_____________________________________________

而授權是怎麽完成的呢?

權限攔截一般有幾種方法,上述在spring中根據規則過濾是一種,還有方法註解是一種,頁面shiro標簽庫攔截也是一種。一般使用spring過濾。

路徑是這樣:用戶登錄進來後,ztree會根據用戶角色查詢角色權限表,生成功能菜單樹。當進入某一頁面時,頁面有刪除按鈕,如果前臺頁面沒有進行判斷是否顯示,那麽點擊之後,系統會根據applicationContext.xml配置的過濾規則進行攔截,如果是perms攔截,進入到自定義Realm中,執行授權方法

技術分享圖片

授權方法是給用戶授予權限,執行完畢後。shiro會自動判斷該用戶是否擁有 配置的權限,若沒有則拋出未授權異常。

——————————————————————————————————————————

但是每次訪問都會執行授權方法,產生效率問題。

這裏采用 ehcache 來緩存權限數據

ehcache是專門緩存插件,可以緩存Java對象,提高系統性能。

使用方法:

1.導入依賴

2.提供ehcache配置文件。

技術分享圖片

3.spring配置緩存管理器對象,並註入給安全管理器。

技術分享圖片

——————————————————————————————————————

補張shiro圖

技術分享圖片

網站後臺系統權限部分實現