持续填坑中。。。。
一、目的及需求
目的很简单,做一个权限管理模块。
需求就是小项目使用,实现权限分配,不同角色用户登录只能看到自己权限内的菜单按钮等。
数据库是MySQL,用springMVC实现,前端用到easyUI的tree(树)和combobox(下拉复选框)。
因为是小项目所以就手写了权限系统。没想到花了挺长时间,记录下来以供复习。
二、思路和视图
1,总体思路:
给用户分配角色->给角色分配权限,用session存储权限,用户登录后前端取session权限,实现不同用户显示不同菜单按钮。
2,视图说明:
(1)工号管理即用户管理,包含用户增删改查、角色增删改查、权限增删改查。
(2)用户列表增删改查,这里单独把分配角色放一个按钮,也可以放在修改信息中,修改信息的时候同时设置角色。
(3)点击分配角色按钮,弹框设置角色,因为一个用户可能有多个角色,所以这里是下拉多选。
(4)角色增删改查,也是单独把分配权限提出来,同理你也可以放在修改信息中。
(5)点击分配权限按钮,弹框配置权限,一个角色有多个权限,所以做成tree形式。
(6)权限增删改查,主要配置权限的请求地址、父子关系和标识等信息。
(7)点击详情按钮修改信息,同时加载父子关系。
三、数据库表
权限管理包括:用户表、角色表、用户-角色表、权限表、角色-权限表
四、关键点实现
1,前端取session判断是否显示菜单或按钮
(1)前端html页面判断,这里判断使用Thymeleaf模板引擎,也可以使用其他方式,jsp直接使用c:if就可以
<li id="auth" th:if="${session.user.hasPermissionByName('工号管理')==true}" onclick="clicktest()">
<a href="#">
<i class="fa fa-th-list fa-fw">
<div class="icon-bg bg-blue"></div>
</i>
<span class="menu-title" >工号管理</span>
</a>
</li>
(2)后台根据名称判断是否有权限
/**
* 判断用户是否有指定名称的权限
*/
public boolean hasPermissionByName(String name){
List pNameList = (List) ContextHolderUtils.getSession().getAttribute("pNameList");
//超级管理员有所有的权限
if(isAdmin()){
return true;
}
//判断普通用户是否有指定名称的权限
for(Object pNameVal:pNameList){
if(pNameVal.toString().equals(name)){
return true;
}
}
return false;
}
/**
* 判断本用户是否是超级管理员
*/
public boolean isAdmin(){
User u = (User)ContextHolderUtils.getSession().getAttribute("user");
return "admin".equals(u.getFdcLoginId());
}
2,SQL关联查询登录用户的权限
select ur.userid,ur.roleid,p.acl_value,p.moduleid,m.module_name,m.module_style,m.opt_value,m.orders,m.url,m.grade,m.parent_id from fx_user_role as ur,fx_permission as p,fx_module as m where ur.userid=?1 and ur.roleid=p.roleid and p.moduleid=m.id
其中?1为传入的用户id
,联合查询三个表的信息,我项目中使用单独vo对象List接收返回参数,如果不需要返回太多数据则只需用List接收就可以了。
五、总结
虽然现在权限大多都用shiro实现了,但是自己写的过程中学到了很多,从前端到后台到数据库查询,这是一个学习的过程。