/ 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动态判断
/**
* Shiro身份认证+授权 重写
*
*/
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(',')
逗号分割。
推荐一套完整的Shiro Demo,免费的。
Shiro介绍文档:http://www.sojson.com/shiroDemo已经部署到线上,地址是http://shiro.itboy.net
管理员帐号:admin,密码:sojson.com 如果密码错误,请用sojson。PS:你可以注册自己的帐号,然后用管理员赋权限给你自己的帐号,但是,每20分钟会把数据初始化一次。建议自己下载源码,让Demo跑起来,然后跑的更快。
shiro自己实现了sessionDAO换言之就是他自己也存储了session,所以原理是一样的。shiro的主要作用还是权限的控制方面,标识登陆状态这个只是其中很小的一部分。
shiro的优点,个人认为他的优点在于
1、作为安全验证框架,使用起来比spring-security方便
2、提供web支持,可以在jsp中通过shiro标签方便的做到细粒度的权限管控
3、可以直接使用annotation对所使用的方法做权限管控,节省代码。
4、可扩展,可插拔。