java web实现用户权限管理

最近在做一个网站类型项目,主要负责后台,ui框架选型为jquery easy ui,项目架构为spring mvc + spring jdbc,简单易用好上手!搭建好框架后开始了第一个任务,设计并实现一套简单的权限管理功能。

一套最基本的权限管理包括用户、角色、资源

实现效果:

数据库设计,设计如下:

用户:user

角色:role

用户-角色:user_role

资源:resource(包括上级菜单、子菜单、按钮等资源)

角色-资源:role_resource

标准的权限管理系统设计为以上5张表。

注:用户、用户-角色我就不做说明了,这两个是很简单的两块,用户的crud,以及为用户分配角色(多对多的关系)稍微琢磨一下就清楚了,下面都是针对为角色分配权限的实现

后台实现
展示层采用ztree树

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实现用户权限管理的功能,希望对大家的学习有所帮助。

(0)

相关推荐

  • JavaWeb开发之JSTL标签库的使用、 自定义EL函数、自定义标签(带属性的、带标签体的)

    JSTL  JSTL简介: JSTL的全称:JSP Standard Tag Library,JSP标准标签库 JSTL的作用: 提供给Java Web开发人员一个标准通用的标签函数库 和EL来取代传统直接在页面上嵌入Java程序(Scripting)的做法,以提高程序可读性.维护性和方便性 JSTL的版本: JSTL的主要版本是1.0.1.1和1.2(区别不大) 1.0版本EL表达式还没有纳入官方规范 1.1和1.2版本EL表达式已经纳入了官方规范 JSTL1.1 下载相应的jar包 JSTL

  • JAVAWEB实现简单的商城项目(一)实例代码解析

     一.项目功能结构 1.功能 2.实体 3.对应sql语句 CREATE DATABASE shop; use shop; create table user( id int(11) primary key auto_increment, username varchar(100), password varchar(100), nickname varchar(100), type int(5) ); INSERT INTO user VALUES (null,'admin','7946521

  • JavaWeb编程 Servlet的基本配置

    学习JavaWeb的人没有不知道Servlet的吧,而要用Servlet就需要在web.xml中进行配置.相信有很多初学者跟我当初一样,对于一些配置参数不是很理解.下面是一个最基本的Servlet配置: 复制代码 代码如下: <servlet>      <servlet-name>MyServlet</servlet-name>      <servlet-class>com.Servlet.MyServlet</servlet-class> 

  • java web开发之实现购物车功能

    为了方便自己以后复习,所以写的比较仔细,记录下自己的成长.  既然是做购物车,那么前提条件是首先需要一系列商品,也就是要建一个实体,这里建了一个商品表. 通过查询在浏览器上显示 基本显示已经做好了,现在进入我们的重头戏,Servlet  点击放入购物车时,将访问Servlet 购物车代码 package com.servlet; import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; im

  • Java Web项目中实现文件下载功能的实例教程

    需求:实现一个具有文件下载功能的网页,主要下载压缩包和图片 两种实现方法: 一:通过超链接实现下载 在HTML网页中,通过超链接链接到要下载的文件的地址 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>通过链接下载文件&

  • java web项目实现文件下载实例代码

    复制代码 代码如下: File file = new File(path);// path是根据日志路径和文件名拼接出来的    String filename = file.getName();// 获取日志文件名称    InputStream fis = new BufferedInputStream(new FileInputStream(path));    byte[] buffer = new byte[fis.available()];    fis.read(buffer); 

  • Java Web项目中连接Access数据库的配置方法

    老师决定期末考试采用access数据库实现增删改查,我认为现在的我已经没有问题了,但是以前都是在JSP页面中连接access数据库,无论是以下的那种方式都进行了连接的练习,但是现在我想让我的项目中的访问access数据库的java代码,封装到DAO中,在DAO中连接数据库,没有和Servlet API有任何的关系.对于大多数人都会优先选择使用ODBC数据源的方式或者是使用绝对路径的方式连接access数据库,但是我个人认为,这样做不太好,如果采用这样的方式,项目做好后,放到他人的服务器上是无法运

  • 学习javaweb如何配置Tomcat的热启动

    (1)我们初学者在学习javaweb的时候每次更改项目都需要重新部署项目,这样的二话太麻烦 (2)使用tomcat的热启动就可以解决这个问题: 在tomcat目录下:找到 conf ----context.xml 打开 填写圈中的 就好了! (3)如果你的tomcat是自己的myeclipse中自带的话 就需要在自己的项目中找到 是在自己的工作区间下: 这是我的工作区间 就是第一个 点进去 有一个 .me_tcat 看到了conf 其他的过程和上述一样!

  • javaWeb自定义标签用法实例详解

    本文实例讲述了javaWeb自定义标签用法.分享给大家供大家参考,具体如下: 自定义标签创建 自定义标签主要用于移除Jsp页面中的Java代码. 移除jsp页面中的java代码,只需要完成两个步骤: - 编写一个继承TagSupport的Java类,并覆盖doStartTag方法,把jsp页面中的java代码写到doStartTag方法中. - 编写标签库描述符(tld)文件,在tld文件中对自定义标签进行描述. 完成以上操作,即可在JSP页面中导入和使用自定义标签. 标签处理类:HelloTa

  • JavaWeb实现文件上传下载功能实例解析

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

  • javaweb中静态文件的常用处理方法汇总

    本文实例汇总了javaweb中静态文件的常用处理方法,在Javaweb程序开发中很有实用价值,具体方法汇总如下: 方法一:激活Tomcat的defaultServlet来处理静态文件 在web.xml中添加: <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <ser

  • Java中常见的5种WEB服务器介绍

    Web服务器是运行及发布Web应用的容器,只有将开发的Web项目放置到该容器中,才能使网络中的所有用户通过浏览器进行访问.开发Java Web应用所采用的服务器主要是与JSP/Servlet兼容的Web服务器,比较常用的有Tomcat.Resin.JBoss.WebSphere 和 WebLogic 等,下面将分别进行介绍. Tomcat 服务器 目前最为流行的Tomcat服务器是Apache-Jarkarta开源项目中的一个子项目,是一个小型.轻量级的支持JSP和Servlet 技术的Web服

  • Java Web 简单的分页显示实例代码

    本文通过两个方法:(1)计算总的页数. (2)查询指定页数据,实现简单的分页效果. 思路:首先得在 DAO 对象中提供分页查询的方法,在控制层调用该方法查到指定页的数据,在表示层通过 EL 表达式和 JSTL 将该页数据显示出来. 先给大家展示下效果图: 题外话:该分页显示是用 "表示层-控制层-DAO层-数据库"的设计思想实现的,有什么需要改进的地方大家提出来,共同学习进步.废话不多说了,开始进入主题,详细步骤如下所示: 1.DAO层-数据库 JDBCUtils 类用于打开和关闭数据

随机推荐