Java 实现权限管理的两种方式


第一种方式:利用filter、xml文件和用户信息表配合使用来实现权限管理。

1.过滤器filter

package cn.com.aaa.bbb.filter;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import cn.com.aaa.bbb.domain.User;
import cn.com.aaa.bbb.util.HttpUtils;

/**
* 过滤:后台管理的模块授权。根据:配置文件xml,根据当前session中用的管理员信息。
* 注:不用再访问数据库。也不需要再使用什么 bean 去判断。直接在这个类里就可以判断。
* @author cuiguangqiang
*
*/

public class ManagerAuthFilter implements Filter {
protected static final Log logger = LogFactory.getLog(ManagerAuthFilter.class);

public static final String MAPPING_FILE = "/WEB-INF/managerauthmapping.xml";

private ServletContext context = null;

private Map actions = new HashMap();

public void init(FilterConfig filterConfig) throws ServletException {
   context = filterConfig.getServletContext();
   if(context==null){
    logger.error("unable to init as servlet context is null");
    return;
   }
   loadConf();
   logger.info("ManagerAuthFilter configure success."); 
}

private void loadConf() {
   InputStream inputStream = context.getResourceAsStream(MAPPING_FILE);
   if (inputStream == null) {
    logger.info("unable find auth mapping file " + MAPPING_FILE);
   } else {
    actions = parseConf(inputStream);
   }
}

private Map parseConf(InputStream inputStream) {
   try {
    SAXReader reader = new SAXReader();
    Document document = reader.read(inputStream);
    return createActionMap(document);

   } catch (Exception e) {
    logger.info(e.getMessage());
    e.printStackTrace();
   }
   return new HashMap();
}

private Map createActionMap(Document document) {
   Map map = new HashMap();
   Element root = document.getRootElement();
   //处理XML,读入JAVA Object对象中。
   List actionList = root.elements();
   for (Iterator it = actionList.iterator(); it.hasNext();) {
    Element e = (Element) it.next();

    String actionName = e.attributeValue("name");
  
    String auth_value = e.element("auth-value").getTextTrim();
    map.put(actionName,auth_value);
    logger.info(actionName + " is " + auth_value);
   }
   return map;
}

public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain) throws IOException, ServletException {
   //处理某次提交的Action,是否在权限定义范围内
   //权限共有:1:站长;2:编辑;0:Admin ; all 代表所有人都可以。(均需要登录)
 
   HttpServletRequest req = (HttpServletRequest) request;
   HttpServletResponse resp = (HttpServletResponse) response;
   //(1)得到此次用户的提交请求
 
   String url = req.getServletPath();
   //(2)只有在配置文件中存在的 action 才进行处理
   String method = req.getParameter("method");
   if(method!=null){
    url = url + "?method=" + method;
   }
   String auth_value = (String)actions.get(url);
 
   if(auth_value==null){
    logger.info("action is not in Manager Auth xml.");
    chain.doFilter(request, response);
    return;
   }
   //第一,必须要登录 
   // 取得当前用户;
   User manager = (User) HttpUtils.getAdminUserSession(req);
   // 检查管理用户是否登录
   if (manager == null) {
    resp.sendRedirect(req.getContextPath()+"/sessionLost.do");
    return;
   }
 
   //第二,必须在权限定义范围内
   if(auth_value.indexOf("all")>=0){
    chain.doFilter(request, response);//必须返回给上一层。
    return ;
   }
   else{
//     String currUserAuth = ","+Integer.toString( manager.getLever())+",";
    String currUserAuth = Integer.toString( manager.getLever());
    if(auth_value.indexOf(currUserAuth)>=0){
     chain.doFilter(request, response);//必须返回给上一层。
     return ;
    }
    else{
     resp.sendRedirect(req.getContextPath()+"/accessdenied.do");
     return ;
    }
   } 
}

public void destroy() {
   logger.info("in authfilter destroy");

}

}
2.xml文件

xml只给出了部分内容,不过所有的内容都包括了。

<?xml version="1.0" encoding="UTF-8"?>
<!--
权限共有:0:Admin 具有所有权限包括增删改用户; 1:站长 ;2:编辑;
-->
<mapping>
    <!--xxxx管理模块xx列表,报名选手和历史比赛查询部分-->
    <action name="/listallmatch.do"><auth-value>0,1</auth-value></action>
    <action name="/matchManager.do"><auth-value>0,</auth-value></action>
    <action name="/rewrite.do"><auth-value>0,1</auth-value></action>
 
    <action name="/leftHome.do"><auth-value>all,</auth-value></action>
    <action name="/login.do"><auth-value>all,</auth-value></action>
</mapping>

3.用户表里面有一个用来保存用户级别的字段level,具体用户表的信息有以下内容,我用实体类来表示用户表的信息,因为没有表结构了。

/** The composite primary key value.*/
    private String id;
   
    /**
     * 用户编号
     */
    private String userId;

    /** The value of the simple username property. */
    private String username;

    /** The value of the simple password property. */
    private String password;
    /**
     * 0:Admin;1:站长;2:编辑;
     */
    private int lever=1;
    /**
     * 创建用户的日期
     */
    private Date createDate;

所有的操作都显示在页面上,当点击该操作时,才进行权限控制,抛出是否该用户有没有该功能的权限。

第二种方式:利用专门的权限表来维护用户权限,根据登录的用户的权限信息判断谋个功能是否显示在页面上,来实现权限的控制。

1.不用数据库表了,我用实体类的属性来表示。

private String id;
/**
* 管理员id
*/
private String employeeid;
/**
*管理功能id
*/
private String urlid;
/**
* 功能名称
*/
private String urlname;

超级管理员给每一个用户分配权限,然后添加到该张表中。登录用户根据自己的权限可以判断是否显示该功能。

相关内容