Java——SSM+Shiro實現JSP頁面授權功能(面向小白)
阿新 • • 發佈:2018-11-14
在之前的部落格中已經實現了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!!!