天天看點

JS中處理Shiro的權限标簽問題

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(',');

繼續閱讀