ssh中关于权限管理的设计技巧
来源:互联网 发布:mac系统怎么升级 编辑:程序博客网 时间:2024/06/11 07:34
关于权限管理的设计技巧
首先是关于数据库的设计,一个是角色表,一个是权限表,因为一个角色可以对应多个权限,一个权限可以对应多个角色,所以,权限表和角色表示多对多的关系
(权限表的设计技巧,设计的url路径是具体的方法的路径)
权限分配的流程===》
1、首先是先进入登录界面,输入账号密码
2、进行身份验证
/**
* 登录
* @return
*/
public String login() throws Exception { System.out.println(model.getLoginName()); User user=userService.findByLoginNameAndPassward(model.getLoginName(),model.getPassword()); System.out.println(user); if(user==null) { //显示错误信息,然后返回loginUI addFieldError("login", "用户名和密码不正确"); return "loginUI"; }else{ //登录成功添加一个session、 ActionContext.getContext().getSession().put("user", user); return "toindex"; }}/** * 验证登录名和密码的方法 * @param name * @param password * @return */public User findByLoginNameAndPassward(String name, String password) { // TODO Auto-generated method stub return (User) getSession().createQuery(// "FROM User u WHERE u.loginName=? AND u.password=? ")// .setParameter(0, name)// .setParameter(1, password)// .uniqueResult();}
//用hql查询的结果是一个Collection的集合结果
3、登录成功之后保存当前的session //登录成功添加一个session、ActionContext.getContext().getSession().put("user", user);
、、、
4、登录成功之后进入index。jsp
然后重定向到action
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%response.sendRedirect(request.getContextPath()+"/home_index.action");String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>
4.获取所有权限的列表(展示的是顶级的列表)
//准备数据 List<Privilege> privilegeTopList=privilegeService.findTopList(); ActionContext.getContext().put("privilegeTopList",privilegeTopList); System.out.println("------------->已经准备数据<-----------------"); return "left";
<%-- 显示一级菜单 --%> <s:iterator value="#privilegeTopList"> <!-- 判断当前的用户是否有权限,有的话才显示相应的功能 #session.user是可以直接在Map里面获取当前的session #session.user.roles----》role.privilege ognl表达式里面可以实现方法--> <s:if test="#session.user.hasPrivilegeByName(name)"> <div onClick="menuClick(this);" class="level1Style"> <img src="style/images/MenuIcon/${id}.gif" class="Icon" /> ${name} </div> <ul style="" class="MenuLevel2" id="aa"> <%-- 显示二级菜单 --%> <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="right" href="${pageContext.request.contextPath}${url}.action"> ${name}</a> </div> </li> </s:if> </s:iterator> </ul> </li> </s:if> </s:iterator>
在Javabean中要添加相关的方法(对迭代的权限一个一个对比)
User.java
public boolean hasPrivilegeByName(String name){ //超级管理员拥有所有的权限 if(isAdmin()) { return true; } //普通用户判断是否有这一个权限 for(Role role:roles) { for(Privilege privilege:role.getPrivilege()) { if(privilege.getName().equals(name)) { return true; } } } return false; }//得到当前的登录名,判断是否问超级管理员public boolean isAdmin(){ return "admin".equals(loginName);}
=========================================
自定义拦截器,对没有登录的用户不允许访问(直接过滤)
//自定义拦截器(implements Interceptor 实现拦截器接口)
public class CheckPrivilegeIntercetor implements Interceptor {
public void destroy() {}public void init() {}
public String intercept(ActionInvocation invocation) throws Exception {
// System.out.println(“———> 之前”);
// String result = invocation.invoke(); // 放行
// System.out.println(“———> 之后”);
// return result;
// 从session里面获取用户信息User user = (User) ActionContext.getContext().getSession().get("user"); // 当前登录用户//得到根目录String namespace = invocation.getProxy().getNamespace(); String actionName = invocation.getProxy().getActionName(); String privUrl = namespace + actionName; // 对应的权限URL System.out.println("=========================================="); System.out.println(privUrl); // 在网址输入路径,如果未登录 if (user == null) { if (privUrl.startsWith("/user_login")) { // "/user_loginUI" // 如果是去登录,就放行 return invocation.invoke(); } else { // 如果不是去登录,就转到登录页面 return "loginUI"; } } // 如果已登录,就判断权限 else { if (user.hasPrivilegeByUrl(privUrl)) { // 如果有权限,就放行 return invocation.invoke(); } else { // 如果没有权限,就转到提示页面 return "noPrivilegeError"; } }}
}
/**
* 判断本用户是否有指定URL的权限
*
* @param privUrl
* @return
*/
public boolean hasPrivilegeByUrl(String privUrl) { // 超级管理有所有的权限 if (isAdmin()) { return true; } // >> 去掉后面的参数 int pos = privUrl.indexOf("?"); if (pos > -1) { //截取子字符串 privUrl = privUrl.substring(0, pos); } // >> 去掉UI后缀 if (privUrl.endsWith("UI")) { privUrl = privUrl.substring(0, privUrl.length() - 2); } //先找出所有不重复的权限,看看这些权限是否在集合里面 // 如果本URL不需要控制,则登录用户就可以使用 Collection<String> allPrivilegeUrls = (Collection<String>) ActionContext.getContext().getApplication().get("allPrivilegeUrls"); (判断集合中是否包含该字符串) if (!allPrivilegeUrls.contains(privUrl)) { return true; } else { // 普通用户要判断是否含有这个权限 for (Role role : roles) { for (Privilege priv : role.getPrivilege()) { if (privUrl.equals(priv.getUrl())) { return true; } } } return false; }}
======================================
在web.xml中配置拦截器
<interceptors> <!-- 声明拦截器 --> <interceptor name="checkPrivilege" class="com.itcast.oa.util.CheckPrivilegeIntercetor"></interceptor> <!-- 重新定义默认的拦截器栈(把自定义的拦截器放在默认拦截器的最外面) --> <interceptor-stack name="defaultStack"> <interceptor-ref name="checkPrivilege"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors>
- ssh中关于权限管理的设计技巧
- 关于权限管理设计收集的网址
- J2EE中关于权限设计的思考
- 权限管理的设计
- Hadoop集群中关于SSH认证权限的问题
- 关于spring-security权限管理的表设计
- 论后台管理项目中权限的设计思想
- 权限管理的数据库设计
- 权限管理设计的方法
- 关于权限管理的demo
- 关于系统的权限管理
- 关于权限管理的介绍
- 关于系统中权限和角色设计的问题
- 关于权限设计的探讨
- 关于权限设计的探讨
- 关于权限系统的设计
- 关于权限设计的探讨
- 关于权限设计的探讨
- Word Pattern
- 千万级到10亿+的疯涨,搜狗商业平台服务化体系实践之路
- ROS新手教程【四】构建工作空间
- "package restore..." 问题解决
- snprintf与sprintf的区别
- ssh中关于权限管理的设计技巧
- c文件操作
- 菜鸟好文推荐(二十三)——成为一名更好的程序员:如何阅读源代码
- 工业4.0
- NodeJS学习笔记(一)——异步I/O的理解
- 凹入表示法(C语言版)
- 学习安卓基础之android 拖动和拖动原理
- 动态修改UINavigationBar的背景色
- 【Leetcode】Single Number