JSP中直接引用Shiro标簽比較簡單可以參考JSP / GSP 标簽庫-Shiro權限學習1:http://blog.csdn.net/ahou2468/article/details/71130582
JS中引用Shiro的标簽不起作用的問題解決方法:
1.第一種情況假如js中生成标簽代碼是固定死的解決起來比較容易,直接在需要權限判斷标簽前和後加上權限控制标簽,即可以起作用
<divid="leftnav"class="site-text"lay-filter="left">
</div>
<scripttype="text/javascript">
var ulHtml;
ulHtml += '<shiro:hasRole name="999999">'
ulHtml += '<i class="layui-icon" data-icon="' + data[i].children[j].icon +'">' + data[i].children[j].icon + '</i>';
ulHtml +='</shiro:hasRole>'
$('#leftnav').html(ulHtml);
</script>
,但是假如Shiro标簽name參數使動态傳進去的則Shiro标簽作用失效了,會導緻是Shiro标簽中所的html标簽不管有沒有權限都不顯示,事例:
<div id="leftnav" class="site-text" lay-filter="left">
</div>
<script type="text/javascript">
var ulHtml;
var name = "999999";
ulHtml += '<shiro:hasRole name="'+name+'">'
ulHtml += '<i class="layui-icon" data-icon="' + data[i].children[j].icon + '">' + data[i].children[j].icon + '</i>';
ulHtml +='</shiro:hasRole>'
$('#leftnav').html(ulHtml);
</script>
這種情況我的解決方案是,在背景查詢到使用者的權限資料時直接放到Session中,js中不通過Shiro标簽判斷而是自己通過擷取權限的url動态判斷
public class SampleRealm extends AuthorizingRealm{
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollectionprincipals) {
Long userId = TokenManager.getUserId();
SimpleAuthorizationInfoinfo = new SimpleAuthorizationInfo();
//根據使用者ID查詢角色和權限,放入到Authorization裡。
Set<String> roles = roleService.findRoleByUserId(userId);
info.setRoles(roles);
//根據使用者ID查詢權限(permission),放入到Authorization裡
Set<String> permissions = permissionService.findPermissionByUserId(userId);
info.setStringPermissions(permissions);
//權限資料時直接放到Session中
TokenManager.setVal2Session("permissions", permissions);
returninfo;
}
JS中可以通過Session中擷取權限資料
var pers = '<%=session.getAttribute("permissions")%>';
//将權限資料數組進行分割轉為字元串數組,然後循環判斷是否你通路的url元素在授權中,若在授權中動态生成html标簽則顯示,否則則隐藏掉
var resultpers = pers.replace('[','').replace(']','').split(',');