[转]java web简单权限管理设计
原文地址:http://blog.csdn.net/zwx19921215/article/details/44467099
最近在做一个网站类型项目,主要负责后台,ui框架选型为jquery easy ui,项目架构为spring mvc + spring jdbc,简单易用好上手!搭建好框架后开始了第一个任务,设计并实现一套简单的权限管理功能。
一套最基本的权限管理包括用户、角色、资源。
数据库设计
我的设计如下:
用户:user
角色:role
用户-角色:user_role
资源:resource(包括上级菜单、子菜单、按钮等资源)
角色-资源:role_resource
标准的权限管理系统设计为以上5张表。
注:用户、用户-角色我就不做说明了,这两个是很简单的两块,用户的crud,以及为用户分配角色(多对多的关系)稍微琢磨一下就清楚了,下面都是针对为角色分配权限的实现
后台实现
role.jsp
- <%@ page contentType="text/html;charset=UTF-8"%>
- <%@ include file="/views/back/include/taglib.jsp"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta name="decorator" content="back" />
- <script type="text/javaScript">
- //打开菜单窗口
- function openMenuDialog(){
- var selected = $("#list").datagrid('getSelected');
- if (selected != null) {
- $("#id").val(selected.id);
- queryMenus(selected.id);
- $("#menuWindow").window("open");
- } else {
- $.messager.alert('提示', "未选择数据!");
- }
- }
- //角色-菜单信息入库
- function ajaxSubmit(rid,idstr){
- $.post("${ctx}/roleMenu/save.jhtml",{"roleId":rid,"ids":idstr},function(obj){
- $.messager.alert('提示',obj.msg);
- $("#menuWindow").window('close');
- },'json');
- }
- </script>
- <!-- ztree -->
- <script type="text/javascript">
- var tree = "";
- var setting = {
- check : {
- chkboxType:{"Y":"ps","N":"s"},//勾选checkbox对于父子节点的关联关系,取消勾选时不关联父
- chkStyle:"checkbox",
- enable : true //是否复选框
- },
- //数据
- data : {
- simpleData : {
- enable : true
- }
- }
- };
- //查询菜单信息
- function queryMenus(roleId){
- $.post('${ctx}/role/treedata.jhtml', {'roleId':roleId}, function(zNodes) {
- for (var i = 0; i < zNodes.length; i++) {
- if (zNodes[i].isParent) {
- } else {
- //zNodes[i].icon = "${ctxStatic}/images/532.ico";//设置图标
- }
- }
- tree = $.fn.zTree.init($("#tree"), setting, zNodes);
- tree.expandAll(true);//全部展开
- //var nodes = treeObj.getNodes();
- }, 'json');
- }
- //获取选中节点
- function onCheck(){
- var rid = $("#id").val();
- var treeObj=$.fn.zTree.getZTreeObj("tree");
- var nodes=treeObj.getCheckedNodes(true);
- var ids = new Array();
- for(var i=0;i<nodes.length;i++){
- //获取选中节点的值
- ids.push(nodes[i].id);
- // v+=nodes[i].id + ",";
- //alert(nodes[i].id);
- }
- ajaxSubmit(rid,ids);
- }
- </script>
- </head>
- <body>
- <!-- 数据表格 -->
- <table id="list" url='${ctx}/role/list/page.jhtml' method='post'
- class="easyui-datagrid" style="width:100%;" fitcolumns="true"
- toolbar='#tb' pagination='true' rownumbers='true' singleSelect='true'>
- <thead>
- <tr>
- <th field='name' sortable='true' width='100'>角色名称</th>
- <th field='description' width='200' align='right'>描述</th>
- <th field='createTimeFormat' width='150' align='center'>创建时间</th>
- </tr>
- </thead>
- </table>
- <!-- 编辑栏 -->
- <div id="tb" style="padding:5px 5px;">
- <div>
- <p2p:permission module="role" code="add"><a href="#" class="easyui-linkbutton" iconCls="icon-add" onclick="openCreateDialog();">新增</a></p2p:permission>
- <p2p:permission module="role" code="edit"><a href="#" class="easyui-linkbutton" iconCls="icon-edit" onclick="openUpdateDialog();">编辑</a></p2p:permission>
- <p2p:permission module="role" code="delete"><a href="#" class="easyui-linkbutton" iconCls="icon-remove" onclick="del();">删除</a></p2p:permission>
- <p2p:permission module="role" code="authority"><a href="#" class="easyui-linkbutton" iconCls="icon-edit" onclick="openMenuDialog();">设置权限</a></p2p:permission>
- </div>
- <!-- 搜索项 -->
- <div style="margin-top:5px;padding-left:5px">
- 用户名: <input id="query_name" class="easyui-textbox" type="text" style="width:110px" />
- 创建日期: <input id="query_startDate" class="easyui-datebox" style="width:110px">
- 至: <input id="query_endDate" class="easyui-datebox" style="width:110px">
- <a onclick="reload();" href="#" class="easyui-linkbutton" iconCls="icon-search">查询</a>
- </div>
- </div>
- <!-- 权限窗口 -->
- <div id="menuWindow" class="easyui-window" title="配置权限" data-options="modal:true,iconCls:'icon-save',footer:'#menuWindowfooter'" style="width:350px;height:420px;padding:10px">
- <div id="tree" class="ztree" style="padding: 10px 20px;"></div>
- </div>
- <div id="menuWindowfooter" style="padding:5px;text-align:right;">
- <a href="#" onclick="onCheck();" class="easyui-linkbutton" data-options="iconCls:'icon-save'">提交</a>
- </div>
- </body>
- </html>
action层
RoleAction.java
- @RequestMapping(value = "/treedata.jhtml")
- @ResponseBody
- public String treedata(HttpServletRequest request, Model model) {
- DynamicParams params = new DynamicParams(request);
- List<Map<String, Object>> mapList = Lists.newArrayList();
- params.put("allMenu", "allMenu");
- List<Menu> list = authManager.findMenuList(params);
- List<RoleMenu> roleMenus = authManager.findRoleMenuList(params);
- for (int i = 0; i < list.size(); i++) {
- Menu e = list.get(i);
- Map<String, Object> map = Maps.newHashMap();
- map.put("id", e.getId());
- map.put("pId", e.getParentId() != null ? e.getParentId() : 0);
- map.put("name", e.getName());
- for (RoleMenu roleMenu : roleMenus) {
- if (roleMenu.getMenuId() == e.getId()) {
- map.put("checked", true);
- }
- }
- mapList.add(map);
- }
- return toJson(mapList);
- }
service层
AuthManager.java
- // 菜单管理
- public List<Menu> findMenuList(DynamicParams params) {
- List<Menu> menus = new ArrayList<Menu>();
- if ("allMenu".equals(params.getString("allMenu"))) {
- menus = menuDao.findList(params);
- } else {
- // 通过用户查询角色
- List<UserRole> userRoles = userRoleDao.findList(params);
- // 通过角色查询菜单
- List<RoleMenu> roleMenus = new ArrayList<RoleMenu>();
- if (userRoles != null && userRoles.size() > 0) {
- for (UserRole userRole : userRoles) {
- params = new DynamicParams();
- if (userRole != null) {
- if (userRole.getRoleId().equals(params.getString("rid"))) {
- break;
- }
- params.put("roleId", userRole.getRoleId().toString());
- List<RoleMenu> rms = roleMenuDao.findList(params);
- for (RoleMenu roleMenu : rms) {
- roleMenus.add(roleMenu);
- }
- }
- }
- }
- // 查询菜单信息
- for (RoleMenu roleMenu : roleMenus) {
- if (roleMenu != null) {
- Menu menu = menuDao.find(roleMenu.getMenuId());
- if (menu != null) {
- menus.add(menu);
- }
- }
- }
- menus = removeDuplicate(menus);
- Collections.sort(menus);
- }
- return menus;
- }
- /**
- * 去除菜单中重复项
- *
- * @param list
- * @return
- */
- private List<Menu> removeDuplicate(List<Menu> list) {
- List<Menu> result = new ArrayList<Menu>();
- Set<Long> menuIds = new HashSet<Long>();
- for (int i = 0; i < list.size(); i++) {
- Menu m = list.get(i);
- if (m != null && menuIds.add(m.getId())) {
- result.add(m);
- }
- }
- return result;
- }
- public List<RoleMenu> findRoleMenuList(DynamicParams params) {
- List<RoleMenu> roleMenus = roleMenuDao.findList(params);
- return roleMenus;
- }
Dao层
menuDao
- @Override
- protected void createQuery(DynamicParams params, StringBuffer sql, List<Object> args) {
- sql.append("select s.* from sys_menu s where 1=1 ");
- String parentId = params.getString("parentId");
- if (StringUtils.isNotBlank(parentId)) {
- sql.append(" and parent_id = ? ");
- args.add(parentId);
- }
- String sort = params.getString("sort");
- String order = params.getString("order");
- if (StringUtils.isNotBlank(sort)) {
- sql.append(" order by ").append(hump2underline(sort));
- if (StringUtils.isNotBlank(order)) {
- sql.append(" " + order);
- } else {
- sql.append(" desc ");
- }
- } else {
- sql.append("order by sort asc,id desc ");
- }
- }
userRoleDao
- @Override
- protected void createQuery(DynamicParams params, StringBuffer sql, List<Object> args) {
- sql.append("select s.* from sys_user_role s where 1=1 ");
- Long adminId = params.getLong("adminId");
- if (adminId != null) {
- sql.append(" and s.user_id = ?");
- args.add(adminId);
- }
- }
roleMenuDao
- @Override
- protected void createQuery(DynamicParams params, StringBuffer sql, List<Object> args) {
- sql.append("select s.* from ").append("sys_role_menu").append(" s where 1=1 ");
- Long adminId = params.getLong("roleId");
- if (adminId != null) {
- sql.append(" and s.role_id = ?");
- args.add(adminId);
- }
- }
在WEB-INF目录下建立文件夹tlds 建立自定义标签文件shiros.tld,我们通过自定义标签实现页面按钮的控制。
- <span style="color:#333333;"><?xml version="1.0" encoding="UTF-8" ?>
- <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
- version="2.0">
- <description>p2p permission taglib</description>
- <display-name>permission taglib</display-name>
- <tlib-version>1.0</tlib-version>
- <short-name>p2p_back</short-name>
- <uri>http://vanfon.p2p.cn/</uri>
- <tag>
- <description>权限校验标签,有权限就显示标签体的内容,否则不显示</description>
- <name>permission</name>
- <tag-class>com.vanfon.p2p.back.tag.PermissionTag</tag-class>
- <body-content>JSP</body-content>
- <attribute>
- <description></description>
- <name>module</name>
- <required>true</required>
- <rtexprvalue>false</rtexprvalue>
- </attribute>
- <attribute>
- <description></description>
- <name>code</name>
- <required>true</required>
- <rtexprvalue>false</rtexprvalue>
- </attribute>
- </tag>
- </taglib></span>
自定义标签类
- package com.vanfon.p2p.back.tag;
- import java.util.List;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.jsp.JspException;
- import javax.servlet.jsp.tagext.TagSupport;
- import com.vanfon.p2p.entity.system.Admin;
- import com.vanfon.p2p.entity.system.Menu;
- import com.vanfon.p2p.manager.system.AuthManager;
- import com.vanfon.p2p.utils.DynamicParams;
- import com.vanfon.p2p.utils.SpringContextHolder;
- /**
- * 权限控制标签
- *
- * @author zhangwx
- * @date 2015-2-5
- */
- public class PermissionTag extends TagSupport {
- /**
- *
- */
- private static final long serialVersionUID = 4592227792811389132L;
- private String module;// 属性名必须与JSP自定义标签的属性名一样
- private String code;
- public String getModule() {
- return module;
- }
- public void setModule(String module) {
- this.module = module;
- }
- public String getCode() {
- return code;
- }
- public void setCode(String code) {
- this.code = code;
- }
- @Override
- public int doStartTag() throws JspException {
- boolean result = false;
- HttpServletRequest request = (HttpServletRequest) this.pageContext.getRequest();// 通过成员变量获取HttpServletRequest对象
- Admin admin = (Admin) request.getSession().getAttribute("admin");// 获取登录到系统的用户
- if (admin != null) {
- if ("1".equals(String.valueOf(admin.getIfsuper()))) {// 超级管理员
- result = true;
- } else {
- DynamicParams params = new DynamicParams();
- params.put("id", String.valueOf(admin.getId()));
- params.put("module", this.module);
- params.put("code", this.code);
- AuthManager authManager = SpringContextHolder.getBean(AuthManager.class);
- List<Menu> userRoleAuths = authManager.findUserRoleAuthList(params);
- if (userRoleAuths != null && userRoleAuths.size() > 0) {
- result = true;
- }
- }
- }
- return result ? EVAL_BODY_INCLUDE : SKIP_BODY;
- }
- }
以上就是该权限管理中权限树(为角色分配权限)的大体实现。
[转]java web简单权限管理设计的更多相关文章
- java web简单权限管理设计
一套最基本的权限管理包括用户.角色.资源. 数据库设计 我的设计如下: 用户:user 角色:role 用户-角色:user_role 资源:resource(包括上级菜单.子菜单.按钮等资源) 角色 ...
- java中通用权限管理设计(转)
原文地址:http://www.cnblogs.com/a7345678/archive/2008/09/25/1298838.html 转自博客园暗夜精灵-鬼才阁 实现业务系统中的用户权限管理 B/ ...
- java web 简单的权限管理
spring ,springMvc ,mybatis 简单权限管理 其实只需要3张表..admin_group ,function,group 表
- Web端权限管理新增实用功能:批量增加操作,简单方便快速!
扩展了吉日嘎拉的Web端权限管理功能后,每次添加菜单倒没啥问题,毕竟菜单的数量有限,可是每增加一个模块.功能或者说权限控制点,就得针对各种常规操作,新增很多遍. 浪费时间,还容易出错.新增了一个字典表 ...
- 基于Spring Security2与 Ext 的权限管理设计与兑现
基于Spring Security2与 Ext 的权限管理设计与实现 一.Spring Security介绍 Spring Security的前身Acegi,其配置及使用相对来说复杂一些,因为要配置的 ...
- SQL Server:OA权限管理设计的实现 下
SQL Server:OA权限管理设计的实现 下 OA系统权限管理设计方案 不同职责的人员,对于系统操作的权限应该是不同的.优秀的业务系统,这是最基本的功能. 可以对“组”进行权限 ...
- MyEclipse创建SSH项目(Java web由maven管理)
JavaEE后台开发,MyEclipse创建SSH项目,MyEclipse创建Java web 由maven管理的SSH项目. Demo工程源码github地址 1.创建SSH项目 1.创建web工程 ...
- asp.net mvc的权限管理设计
现在集中展示用户-角色-权限管理的功能,因此,所有数据表一律简化处理. 1 后台管理效果 (1)角色管理 (2)权限管理 2 数据库设计(MSSQL) (1)用户表dbo.Users 项 类型 ...
- 【Java】JavaWeb权限管理
权限管理分析 每个网站都涉及到访问权限的控制.每个站点资源都需要被管理起来,用户只有具有访问某个资源的特定权限,才能够访问,否则拒绝访问.网站的访问权限控制,一种方法从 URI 入手,站点的每个资源都 ...
随机推荐
- 有评论就是我最大的动力~MySQL基础篇完结(存储引擎和图形化管理工具)
hi 今天登上来,发现竟然有了3个评论~~加油吧! 这周的计划其实远远没有达到,然后下周还有一大堆事情...那么...周末好好玩吧~ 今天试图完结MySQL的基础篇知识,小白变为大白? 1.MySQL ...
- 连载《一个程序猿的生命周期》-28、被忽悠来的单身HR(女同志)
一个程序猿的生命周期 微信平台 口 号:职业交流,职业规划:面对现实,用心去交流.感悟. 公众号:iterlifetime 百木-ITer职业交流奋斗 群:141588103 微 博:h ...
- 自学一个月的java了
不知道这篇博文有不有朋友看到.先自我介绍一下,硕士一年级下学期. 对编程感兴趣,硕士一年级下学期转学计算机专业,目前刚好一个月的时间.接触计算机也是刚好一个月的时间. 学习了java,javaweb. ...
- 最短路径问题的Dijkstra和SPFA算法总结
Dijkstra算法: 解决带非负权重图的单元最短路径问题.时间复杂度为O(V*V+E) 算法精髓:维持一组节点集合S,从源节点到该集合中的点的最短路径已被找到,算法重复从剩余的节点集V-S中选择最短 ...
- AngularJs学习总结-了解基本特性(-)
现在的前端项目中基本上都会用到angularjs框架,之前并不了解这个框架,也是因为最近接手的项目,所以打算好好的学习下它.之前都是搞pc端,现在接手的是移动端的项目,移动端UI框架用的是ionic+ ...
- NOIP1999邮票面值设计[搜索|DP]
题目描述 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤40)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1-MAX之间的每一个邮资值都能得到 ...
- Sublime3安装过程及常用插件安装及常用快捷键
1 先去http://www.sublimetext.com/官网下载软件,然后网上找一个验证码,注册完成. 2 安装Package Control ,Package Control 插件是一个方 ...
- QuickFix/J 源代码
三). 客户化FIX解析 基础知识:以下文章内容描述的前提是已经根据自己的业务规则,生成了符合要求的数据字典,并且使用QuickFix/J自带的 ant 的 jar target生成了客户化的协议解析 ...
- vmware打开出错,需要打开虚拟化的设置
- TFS命令tf:undo(强制签入签出文件)
由于修改计算机名称或不同电脑上操作忘记签入,则需要强制签入文件 具体步骤如下: 1.在命令行中输入"cd C:\Program Files\Microsoft Visual Studio ...