权限:控制功能的使用
web中权限的利用:
1、1个功能对应1个或多个URL
2、对功能的控制就是对URL地址访问的控制
权限方案:
1、用户的权限就是用户的所有角色的权限的合集
2、1个功能是不是能被某用户使用,是判断用户权限中是不是有这个功能的使用许可。
步骤:
1、初始化权限
权限是不可变的,在第1次使用时就已肯定了。所以我们可以 insert into。。。。
Session session=sessionFactory.getCurrentSession();
//保存超级管理员用户
User user=new User();
user.setLoginName("admin");
user.setPassword(DigestUtils.md5Hex("admin"));
user.setName("超级管理员");
session.save(user);
//保存权限数据
Privilege menu,menu1,menu2,menu3;
menu=new Privilege("系统管理",null,null);
menu1=new Privilege("部门管理","/department_list",menu);
menu2=new Privilege("岗位管理","/role_list",menu);
menu3=new Privilege("用户管理","/user_list",menu);
session.save(menu);
session.save(menu1);
session.save(menu2);
session.save(menu3);
session.save(new Privilege("部门列表","/department_list",menu1));
session.save(new Privilege("部门删除","/department_delete",menu1));
session.save(new Privilege("部门添加","/department_add",menu1));
session.save(new Privilege("部门修改","/department_edit",menu1));
session.save(new Privilege("岗位列表","/role_list",menu2));
session.save(new Privilege("岗位删除","/role_delete",menu2));
session.save(new Privilege("岗位添加","/role_add",menu2));
session.save(new Privilege("岗位修改","/role_edit",menu2));
session.save(new Privilege("用户列表","user_list",menu3));
session.save(new Privilege("用户删除","user_delete",menu3));
session.save(new Privilege("用户添加","user_add",menu3));
session.save(new Privilege("用户修改","user_edit",menu3));
menu=new Privilege("网上交换",null,null);
menu1=new Privilege("论坛管理","/forumManage_list",menu);
menu2=new Privilege("论坛","/forum_list",menu);
session.save(menu);
session.save(menu1);
session.save(menu2);
2、分配权限
给角色分配权限,用户的权限就是用户的所有角色的权限的合集
分配权限类似于修改
public String setPrivilegeUI(){
//准备回显数据
Role role=roleService.find(model.getId());
ActionContext.getContext().getValueStack().push(role);
if(role.getPrivileges()!=null){
privilegeIds=new Long[role.getPrivileges().size()];
int index=0;
for(Privilege privilege : role.getPrivileges()){
privilegeIds[index++]=privilege.getId();
}
}
// List<Privilege> list=privilegeService.getAll();
// ActionContext.getContext().put("list", list);
return "setPrivilegeUI";
}
/**
* 分配权限
* @return
*/
public String setPrivilege(){
//1、从
数据库中获得修改对象
Role role=roleService.find(model.getId());
//2、设置修改数据
List<Privilege> list=privilegeService.getByIds(privilegeIds);
role.setPrivileges(new HashSet<Privilege>(list));
//3、更新到
数据库
roleService.save(role);
return "toList";
}
jsp页面-----显示树状结构
<%@ page language="java" import="java.util.*" pageEncoding="UTF⑻"%>
<%@include file="/WEB-INF/jsp/public/commons.jspf"%>
<html>
<head>
<title>配置权限</title>
<script language="javascript"
src="${pageContext.request.contextPath }/script/
jquery_treeview/
jquery.treeview.js"></script>
<link type="text/css" rel="stylesheet"
href="${pageContext.request.contextPath }/style/blue/file.css" />
<link type="text/css" rel="stylesheet"
href="${pageContext.request.contextPath }/script/
jquery_treeview/
jquery.treeview.css" />
<script type="text/javascript">
$(function(){
$("[name=privilegeIds]").click(function(){
//当选中或取消权限时,也同时选中或取消下级元素
$(this).siblings("ul").find("input").attr("checked",this.checked);
//当选中1个权限时,也同时选中直接上级
if(this.checked==true){
$(this).parents("li").children("input").attr("checked",true);
}
});
});
$(function() {
$("#tree").treeview();
});
</script>
</head>
<body>
<!-- 标题显示 -->
<div id="Title_bar">
<div id="Title_bar_Head">
<div id="Title_Head"></div>
<div id="Title">
<!--页面标题-->
<img border="0" width="13" height="13"
src="${pageContext.request.contextPath }/style/images/title_arrow.gif" />
配置权限
</div>
<div id="Title_End"></div>
</div>
</div>
<!--显示表单内容-->
<div id=MainArea>
<s:form action="role_setPrivilege">
<s:hidden name="id"></s:hidden>
<div class="ItemBlock_Title1">
<!-- 信息说明 -->
<div class="ItemBlock_Title1">
<img border="0" width="4" height="7"
src="${pageContext.request.contextPath }/style/blue/images/item_point.gif" />
正在为【${name } }】配置权限
</div>
</div>
<!-- 表单内容显示 -->
<div class="ItemBlockBorder">
<div class="ItemBlock">
<table cellpadding="0" cellspacing="0" class="mainForm">
<!--表头-->
<thead>
<tr align="LEFT" valign="MIDDLE" id="TableTitle">
<td width="300px" style="padding-left: 7px;">
<!-- 如果把全选元素的id指定为selectAll,并且有函数selectAll(),就会有错。由于有1种用法:可以直接用id援用元素 -->
<input type="CHECKBOX" id="cbSelectAll"
onClick="$('[name=privilegeIds]').attr('checked',this.checked)" />
<label for="cbSelectAll">全选</label>
</td>
</tr>
</thead>
<!--显示数据列表-->
<tbody id="TableData">
<tr class="TableDetail1">
<!-- 显示权限树 -->
<td>
<!--
<s:checkboxlist name="privilegeIds" list="#list"
listKey="id" listValue="name"></s:checkboxlist>
-->
<%--
<s:iterator value="#list">
<input type="checkbox" name="privilegeIds" value="${id }" id="lb_${id }"
<s:property value="%{id in privilegeIds ? 'checked' : '' }"/>
/>
<label for="lb_${id }">${name }</label>
<br/>
</s:iterator>
--%>
<ul id="tree">
<s:iterator value="#application.topPrivilegeList">
<li>
<input type="checkbox" name="privilegeIds" value="${id }" id="lb_${id }" <s:property value="%{id in privilegeIds ? 'checked' : '' }"/>/>
<label for="lb_${id }"><span class="folder">${name }</span></label>
<ul>
<s:iterator value="children">
<li>
<input type="checkbox" name="privilegeIds" value="${id }" id="lb_${id }" <s:property value="%{id in privilegeIds ? 'checked' : '' }"/>/>
<label for="lb_${id }"><span class="folder">${name }</span></label>
<ul>
<s:iterator value="children">
<li><input type="checkbox" name="privilegeIds" value="${id }" id="lb_${id }" <s:property value="%{id in privilegeIds ? 'checked' : '' }"/>/>
<label for="lb_${id }"><span class="folder">${name }</span></label></li>
</s:iterator>
</ul>
</li>
</s:iterator>
</ul>
</li>
</s:iterator>
</ul>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- 表单操作 -->
<div id="InputDetailBar">
<input type="image"
src="${pageContext.request.contextPath }/style/images/save.png" />
<a href="javascript:history.go(⑴);"><img
src="${pageContext.request.contextPath }/style/images/goBack.png" /></a>
</div>
</s:form>
</div>
<div class="Description">
说明:<br /> 1,选中1个权限时:<br /> a,应当选中 他的所有直系上级。<br />
b,应当选中他的所有直系下级。<br /> 2,取消选择1个权限时:<br />
a,应当取消选择 他的所有直系下级。<br />
b,如果同级的权限都是未选择状态,就应当取消选中他的直接上级,并递归向上做这个操作。<br />
3,全选/取消全选。<br /> 4,默许选中当前岗位已有的权限。<br />
</div>
</body>
</html>
3、根据权限显示菜单
<div id="Menu">
<ul id="MenuUl">
<%--显示1级菜单 --%>
<s:iterator value="#application.topPrivilegeList">
<s:if test="#session.user.hasPrivilegeByName(name)">
<li class="level1">
<div onClick="menuClick(this)" class="level1Style">
<img src="style/images/MenuIcon/${id }.gif" class="Icon" />${name }
</div>
<ul id="aa" class="MenuLevel2">
<%--显示2级菜单 --%>
<s:iterator value="children">
<s:if test="#session.user.hasPrivilegeByName(name)">
<li class="level2">
<div class="level2Style">
<img src="style/images/MenuIcon/menu_arrow_single.gif" />
<a target="body" href="${pageContext.request.contextPath }${url}.action">${name }</a>
</div>
</li>
</s:if>
</s:iterator>
</ul>
</li>
</s:if>
</s:iterator>
</ul>
</div>
4、根据权限显示链接
重写<s:a></s:a>标签
public int doEndTag() throws JspException {
User user=(User) pageContext.getSession().getAttribute("user");
String privUrl="/"+action;
if(user.hasPrivilegeByUrl(privUrl)){
return super.doEndTag();
}else{
return EVAL_PAGE;
}
}
5.拦截每个action要求,验证用户是不是有权限访问
用struts的 interceptor拦截
public String intercept(ActionInvocation invocation) throws Exception {
String result=null;
User user= (User) ActionContext.getContext().getSession().get("user");
String namespace=invocation.getProxy().getNamespace();
String actionName=invocation.getProxy().getActionName();
String privUrl=namespace+actionName;
//未登入,转到登入页面
if(user==null){
//如果是去登入,就放行
if(privUrl.startsWith("/user_login")){
return invocation.invoke();
}else{
//如果不是去登入,就转到登入页面
return "loginUI";
}
}
//已登入,判断是不是有权限
else{
if(user.hasPrivilegeByUrl(privUrl)){
//有,放行
return invocation.invoke();
}else{
//无,转到提示页面
return "noPrivilege";
}
}
}
补上怎样判断用户是不是有权限的代码
/**
* 判断本用户是不是有指定的名称权限
*
* @return
*/
public boolean hasPrivilegeByName(String name) {
// 超级管理员
if (isAdmin()) {
return true;
}
// 普通用户
for (Role role : roles) {
for (Privilege privilege : role.getPrivileges()) {
if (privilege.getName().equals(name)) {
return true;
}
}
}
return false;
}
/**
* 判断本用户是不是有指定的url权限
*
* @return
*/
public boolean hasPrivilegeByUrl(String privUrl) {
// 超级管理员
if (isAdmin()) {
return true;
}
int pos = privUrl.indexOf("?");
if (pos > ⑴) {
privUrl = privUrl.substring(0, pos);
if (privUrl.endsWith("UI")) {
privUrl = privUrl.substring(0, privUrl.length() - 2);
}
}
Collection<Privilege> allPrivilege = (Collection<Privilege>) ActionContext.getContext().getApplication().get("allPrivilege");
// 如果本url不需要控制,则登入用户就能够使用
if (!allPrivilege.contains(privUrl)) {
return true;
} else {
// 普通用户
for (Role role : roles) {
for (Privilege privilege : role.getPrivileges()) {
if (privUrl.equals(privilege.getUrl())) {
return true;
}
}
}
}
return false;
}
/**
* 判断本用户是否是超级用户
*
* @return
*/
private boolean isAdmin() {
return "admin".equals(loginName);
}