在之前的博客中已經實現了Shiro的登陸認證功能——《SSM+Shiro實現登陸認證》
今天利用Shiro實現一個頁面細粒化權限的控制功能。
爲什麼說是細粒化呢?因爲它可以精準到頁面上的每一個按鈕,把控每一個按鈕的訪問權限,可以說是非常強大了,而且簡單~
想實現頁面的授權功能首先要在頁面導入一個shiro的標籤:
<%@ taglib uri="http://shiro.apache.org/tags" prefix="shiro"%>
然後用以下標籤包裹
<shiro:hasPermission name=""></shiro:hasPermission>
實現權限的控制!
我現在要對後臺的一個菜單中的 “發佈商品” 進行權限控制
在頁面的代碼中加上Shiro的標籤(這兩個標籤對應着頁面上的雲市場與發佈商品)
<li class="layui-nav-item"><a href="">雲市場</a></li>
<shiro:hasPermission name="push">
<li class="layui-nav-item"><a href="">發佈商品</a></li>
</shiro:hasPermission>
在發佈商品的標籤上包裹了一層shiro的標籤,那麼登陸的用戶必須要有shiro標籤中 “name” 對應的權限!
可以看到,加上這個標籤以後再次訪問頁面,“發佈商品” 菜單不見了
那麼這個時候如果我們想看到它,就只需要在realm的授權方法中給他對應的權限即可!
/**
* 授權的時候回調
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.addStringPermission("push");//這裏添加進去的“push” 對應着前端頁面的name值
//"*"代表所有權限
return info;
}
這樣以後頁面的 發佈商品 又回來了!
其實Shiro權限控制原理大致就是如此,當然啦,這裏只是一個簡單的小例子,如果要做到根據角色分配權限,只是在數據庫裏多建幾張表關聯起來而已,根據對應的角色查詢它所擁有的權限,然後循環遍歷add到info裏即可!
這裏舉個簡單例子,實現通過遍歷數據庫來獲得權限(這裏只是簡單的例子,就不用中間表啦)
爲了更好的演示,在前端頁面給 “雲市場” 也加上Shiro的標籤,name設置爲"shop"
<shiro:hasPermission name="shop">
<li class="layui-nav-item"><a href="">雲市場</a></li>
</shiro:hasPermission>
<shiro:hasPermission name="push">
<li class="layui-nav-item"><a href="">發佈商品</a></li>
</shiro:hasPermission>
首先是用戶表
權限表:
pid:權限對應的一個編號,在用戶表上給對應的用戶添加pid來獲得對應的權限~
這裏給用戶“萌”的pid(權限編碼)爲2,2在權限表對應的是push與shop權限,也就是說用戶 “萌”有訪問“雲市場”與“發佈商品” 的權限!!!
授權的回調方法如下:
/**
* 授權的時候回調
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
User user = (User) principalCollection.getPrimaryPrincipal();//獲取到登陸的對象
if(user.getPid()==1){//如果權限編碼爲1就是超級管理員
info.addStringPermission("*");//賦予管理員所有權限
}else {
List<Permission> list = loginService.QueryAllPermission(user.getPid());//如果是普通用戶就根據權限編號pid去數據庫查詢
for (Permission permission:
list) {
info.addStringPermission(permission.getPermission());//遍歷添加權限
}
}
return info;
}
然後用用戶“萌” 的賬號密碼登陸~
可以看到她已經擁有了訪問這兩個菜單的權限~
The end!!!