權限的理解
權限的話,權限做起來就是5張表;用戶表、角色表、用戶角色表、權限表、權限角色表。給用戶授角色給角色授權限;我認為權限,就是不同用戶登錄看到的菜單按鈕不同這是一個表面的權限,真正做的好在于它內部的攔截,我每點擊一個url我就知道它有沒有權限,就比如新增按鈕,我頁面上沒有新增按鈕,我非法拿到了新增按鈕是url,我是否能夠操作?,這就需要內部攔截,頁面顯示不難,比如左側菜單完全可以用樹的形式,通過用戶登錄拿到用戶id,根據用戶id查到一組角色id,根據一組角色id查到一組權限,然后把權限顯示到頁面上。但是頁面沒有這個按鈕,如果我非法拿到按鈕的url進行訪問時,這樣如何去進行攔截,才是重點,具體怎么做其實有很多方法,我簡單總結了以下有兩種,是運用了Shiro,因為我每一個url都會有一個對比,去判斷它是否有權限,那么我就會設置一個權限標記,比如說我頁面上有個按鈕,我給按鈕做一個權限標記,然后存到數據庫中,當我登錄后,需要攔截的時候把這些權限標記拿出來,那么問題是怎么根據url得到一組權限標記和取出來的一組權限標記進行對比,判斷是否有權限吶?我總結的有兩種,一種就是,我們現在用的是springmvc,我直接在方法上面指定一個權限標記,這個url對應的就是這個權限標記,這樣的話當我請求的時候就會把url和權限標記進行對比,看他是否有權限;還有一種就是,通過url進行規則化,然后通過url算出一組權限標記,然后寫一個Realm.java攔截器,然后把這個url算出權限標記跟Shrio里面存的一組權限標記進行對比,如果有就攔截上,沒有就攔截不了。
其實權限做的更好就是做到數據權限,數據權限就是頁面上 的按鈕菜單都一樣,但是不同身份的人點擊同樣的按鈕或菜單它顯示的數據是不同的。比如有一個菜單叫,工資管理,普通員工點擊顯示自己的工資信息,而總經理點擊看到的是整個部門的工資信息,這就是數據權限。做數據權限就是看這個數據的范圍是有什么決定的,一般數據的范圍是根據部門決定的,就是在我給角色授權的時候我可以決定它可以訪問到那些部門,所以就要表結構的改變,在用戶角色表中再添加一個字段,部門 id或你要訪問的數據范圍,將來查詢的時候結果是一個權限的id對應一個部門的id,當我在頁面點擊的時候,就會向后臺傳一個部門的id,查詢的時候就根據部門id查出數據,這樣就做到了數據權限!
Shiro控制權限的執行流程
在pom.xml中配置Shiro依賴(shiro-spring1.2.4、shiro-ehcache1.2.4等)
Web.xml(shiroFilter)和Spring-Service.xml中配置攔截器(shiroFilter)綁定Realm.java實體類在 LoginAction.java當用戶登錄的時候去查用戶信息,然后存在cache里,(使用用戶的登錄信息創建Token來new UsernamePasswordToken(username, password) 驗證客戶身份是否合法)
合法的話在Realm.java類中對客戶認證并授權,有兩個方法第一個認證方法一、AuthenticationInfo:認證
//得到用戶Subject
Subject currentUser=SecurityUtils.getSubject();
currentUser.getSession().setAttribute("user", user);//將用戶對象存入Subject(SecurityUtils安全工具)
查詢數據庫,取用戶名密碼
AuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user.getName(), user.getPassword(), this.getName());
return authenticationInfo;
二、AuthorizationInfo :授權
1.根據用戶名查詢當前用戶擁有的角色(存入集合中后遍歷)
1.1將角色名稱提供給info
authorizationInfo.setRoles(角色集合set);
2.根據角色查詢當前權限按鈕標記名稱(存入集合中后遍歷)
2.1? 將權限名稱提供給info
authorizationInfo.setStringPermissions(權限標記集合set);
return authorizationInfo;
在jsp中使<shiro:haspermission. name="權限標記">標簽包按鈕;控制顯示