dynamicparams java_权限管理

权限管理简单设计,原创文章地址

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

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

数据库设计

我的设计如下:

用户:user

角色:role

用户-角色:user_role

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

角色-资源:role_resource

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

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

后台实现

展示层采用ztree树

role.jsp

[html]

html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

//打开菜单窗口

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');

}

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 

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

//获取选中节点的值

ids.push(nodes[i].id);

// v+=nodes[i].id + ",";

//alert(nodes[i].id);

}

ajaxSubmit(rid,ids);

}

class="easyui-datagrid" style="width:100%;" fitcolumns="true"

toolbar='#tb' pagination='true' rownumbers='true' singleSelect='true'>

角色名称描述创建时间

新增

编辑

删除

设置权限

用户名:   

创建日期: 

至:     

查询

提交

action层

RoleAction.java

[java]

@RequestMapping(value = "/treedata.jhtml")

@ResponseBody

public String treedata(HttpServletRequest request, Model model) {

DynamicParams params = new DynamicParams(request);

List> mapList = Lists.newArrayList();

params.put("allMenu", "allMenu");

List

List roleMenus = authManager.findRoleMenuList(params);

for (int i = 0; i 

Menu e = list.get(i);

Map 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

[java]

// 菜单管理

public List

List

if ("allMenu".equals(params.getString("allMenu"))) {

menus = menuDao.findList(params);

} else {

// 通过用户查询角色

List userRoles = userRoleDao.findList(params);

// 通过角色查询菜单

List roleMenus = new ArrayList();

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 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;

}

[java]

/**

* 去除菜单中重复项

*

* @param list

* @return

*/

private List

List

Set menuIds = new HashSet();

for (int i = 0; i 

Menu m = list.get(i);

if (m != null && menuIds.add(m.getId())) {

result.add(m);

}

}

return result;

}

[java]

public List findRoleMenuList(DynamicParams params) {

List roleMenus = roleMenuDao.findList(params);

return roleMenus;

}

Dao层

menuDao

[java]

@Override

protected void createQuery(DynamicParams params, StringBuffer sql, List 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

[java]

@Override

protected void createQuery(DynamicParams params, StringBuffer sql, List 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

[java]

@Override

protected void createQuery(DynamicParams params, StringBuffer sql, List 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,我们通过自定义标签实现页面按钮的控制。

[html]

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"

version="2.0">

p2p permission taglib

permission taglib

1.0

p2p_back

http://vanfon.p2p.cn/

权限校验标签,有权限就显示标签体的内容,否则不显示

permission

com.vanfon.p2p.back.tag.PermissionTag

JSP

module

true

false

code

true

false

自定义标签类

[java]

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

if (userRoleAuths != null && userRoleAuths.size() > 0) {

result = true;

}

}

}

return result ? EVAL_BODY_INCLUDE : SKIP_BODY;

}

}

以上就是该权限管理中权限树(为角色分配权限)的大体实现。

835e1da73a266c654417e3b1993adbb8.png

9c691fb04520b6c11ca05f7d55294d3f.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值