java培训
搜索分类

java权限管理怎么实现?具体操作

赋能网 2023-05-09 68

系统安全一直是在系统开发中不可规避的问题,而权限控制又跟系统安全密不可分,那java权限管理怎么实现?接下来我们就来给大家讲解一下java实现权限管理的方法。

利用filter、xml文件和用户信息表配合使用来实现权限管理。第二种方式是利用专门的权限表来维护用户权限,根据登录的用户的权限信息判断谋个功能是否显示在页面上,来实现权限的控制。

第一种方式:利用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;

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,具体用户表的信息有以下内容,我用实体类来表示用户表的信息,因为没有表结构了。

private String id;

private String userId;

private String username;

private String password;

private int lever = 1;

private Date createDate;

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

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

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

private String id;

private String employeeid;

private String urlid;

private String urlname;

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

java实现权限管理的方法就是以上两种方法,大家可以参考任意一种,根据自己的具体需求去选择方法哦!最后大家如果想要了解更多java初识知识,敬请关注赋能网。


发表评论
0评