项目:管理员系统
功能:用户登录后左侧菜单加载
问题:用户登录后由于每个人所拥有的权限不同,所展示出的菜单也不同
效果:用户登录后跳转欢迎页面(无法指定用户跳转地址,因为每个用户的权限均不同),需要刷新后才能看到自己所拥护的访问权限
(注释:由于页面调用VELOCITY中的宏,而宏中定义VELOCITY的自定义函数,且velocity.properties 配置文件中 auto.reload 属性配置为false ,即进入该页面后未能进行velocity的加载,需手动刷新完成对velocity函数的加载)
实现:
1.LOGINACTION -> INDEXACTION -> welcome.vm
若用户登录成功,跳转indexaction ,进行信息定位,指向页面
欢迎页面 通过调用 #displayLeftMenu() 宏 来加载菜单
2.#displayLeftMenu()
宏定义在 VM_global_library.vm 中
#set($menuList = $!UserUtils.menuList()) #foreach($info in $menuList) #if($info.parentId == 0) <li class="b-li" s1="$base"> <a href="javascript:void(0)" class="t"><i></i>$info.name</a> <ul class="box clearfix"> #foreach($info2 in $menuList) #if($info2.parentId == $info.id) <li class="sub-li"><a href="$base/$info2.url">$info2.name</a></li> #end #end </ul> </li> #end #end
逻辑解析:
双层遍历:
一层,遍历所有父节点为0 的二级权限,
二层,编辑相应的二级权限下所属的三级权限
3.$!UserUtils.menuList() Veloctiy自定义授命函数
通过 tools.xml 中配置进行配置
4.tools.xml
<tools> <toolbox scope="request"> <tool class="org.apache.velocity.tools.generic.ResourceTool" bundles="resources" locale="en_US"/> </toolbox> <toolbox scope="application"> <tool key="tokenHelper" class="org.apache.struts2.util.TokenHelper" /> <tool class="org.apache.velocity.tools.generic.NumberTool"/> <tool key="UserUtils" class="user.util.UserUtils"></tool> <!-- 指向被调用的函数实体 --> </tool> </toolbox> </tools>
5.user.util.UserUtils 中方法 menuList
public static List<Permission> menuList(){ Subject currentUser = SecurityUtils.getSubject(); @SuppressWarnings("unchecked") List<Permission> menuList = (List<Permission>)currentUser.getSession().getAttribute("menuList"); if(menuList == null){ try { menuList = ServiceUtil.permissionsManagementService.findmenuByUserId(getLoginUser()); currentUser.getSession().setAttribute("menuList", menuList); } catch (Exception e) { logger.error(e.getMessage(), e); } } logger.info("menuList :"+menuList); return menuList; }
说明:
(1)UserUtils 类为final
不允许继承
final声明的类、方法、成员变量
(2)查询该用户所有权限:
用户拥有权限分为通过两种途径:通过分配角色间接获取角色所授权的权限
通过特殊授权直接获取的权限
说明:特殊授权是为分配角色的补充,即用户只希望有这个角色所拥有的权限中的某几个而非全部时的补充措施
(3)在获取权限的同时以去掉所有类型为按钮的权限
说明:按钮级别的权限理论上是下一级别的权限,其是页面上的按钮权限,先有页面而后有按钮,故其不必显示在左侧菜单上
(4)动态控制权限
- 通过权限管理功能,添加/修改某权限的状态:是否有效,屏蔽展示失效菜单
- 通过角色管理功能,为某个角色添加权限
- 通过用户管理功能,为某个用户分配角色(批量赋予权限),特殊授权(直接关联权限)