網站後臺系統權限部分實現
基本上所有網站都有後臺管理系統。系統根據業務劃分成不同的系統角色。而每個角色肯定是擁有著不同的權限。這個權限就根據登錄後功能菜單的多少來體現。
那麽這是如何實現的呢?
在剛開始接觸這方面的時候,意識到權限問題,自己隨手寫的練手項目是將帳號表中設置一個權限字段。比如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圖
網站後臺系統權限部分實現