`
anranran
  • 浏览: 29086 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

权限控制(转)

阅读更多
用的是通过filter过滤来管理权限的方法, 很简单,但也很实用。 这个项目并不小,但这么一个类就已经可以满足其权限管理的需要了,所以其实很多时候,权限管理大家并不必要想得那么复杂, 对于不少系统,简单通过filter来管理就ok了, simple 也是一种美^_^ 在web.xml里加入



<!--================权限 设置================-->     
<filter>     
  
    <filter-name>Authentication</filter-name>     
  
<filter-class>com.springside.demo.security.UrlFilter</filter-class>     
  
    <init-param>     
  
        <param-name>onError</param-name>     
  
        <param-value>/login.jsp</param-value>     
  
    </init-param>     
  
</filter>     
  
<filter-mapping>     
  
    <filter-name>Authentication</filter-name>     
  
    <!-- 只过滤 .jsp 结尾的url, 其余的如 .do, .html, .jpg, .css 等不作过滤-->     
  
    <url-pattern>*.jsp</url-pattern>     
  
</filter-mapping>
public class UrlFilter implements Filter {       
  
    private FilterConfig filterConfig;      
  
     
  
    private FilterChain chain;      
  
     
  
    private HttpServletRequest request;      
  
     
  
    private HttpServletResponse response;      
  
     
  
    public void destroy() {      
  
        this.filterConfig = null;      
  
    }      
  
     
  
    public void init(FilterConfig filterConfig) throws ServletException {      
  
        this.filterConfig = filterConfig;      
  
    }      
  
     
  
    public void doFilter(ServletRequest servletRequest,      
  
            ServletResponse servletResponse, FilterChain chain)      
  
            throws IOException, ServletException {      
  
        this.chain = chain;      
  
        this.request = (HttpServletRequest) servletRequest;      
  
        this.response = ((HttpServletResponse) servletResponse);      
  
     
  
        String url = request.getServletPath();      
  
        if (url == null)      
  
            url = "";      
  
     
  
        // 获取session中的loginuser对象      
  
        HttpSession session = request.getSession();      
  
        LoginUser loginuser = (LoginUser) session.getAttribute("loginuser");      
  
     
  
        if (baseUrl(url, request)) {      
  
            // 如果是登陆界面等无须权限访问的的公用界面则跳过      
  
            chain.doFilter(request, response);      
  
        } else if (loginuser == null) {      
  
            checkLogin(url);      
  
        } else {      
  
            verifyUrl(url, loginuser);      
  
        }      
  
    }      
  
     
  
    private void checkLogin(String url) throws ServletException, IOException {      
  
        // 如果session中获取不到 loginuser 对象,要不就是session 过期了,要不就是还没登陆。所以返回登陆界面      
  
        // 在登陆后记得把 loginuser 对象置于 session中      
  
     
  
        if (url.indexOf("/index.jsp") >= 0     
  
                && "login".equals(request.getParameter("act"))) {      
  
            // 获取request中username,password      
  
            String username = request.getParameter("username");      
  
            String password = request.getParameter("password");      
  
            UserDao userDao = new UserDao();      
  
            if (userDao.authUser(username, password)) {      
  
                LoginUser user = userDao.getUser(username);      
  
                request.getSession().setAttribute("loginuser", user);      
  
                verifyUrl(url,user);      
  
                return;      
  
            }      
  
        }      
  
        response.sendRedirect("login.jsp");      
  
    }      
  
     
  
    private void verifyUrl(String url, LoginUser loginuser)      
  
            throws IOException, ServletException {      
  
        // 获取 loginuser 拥有的所有资源串      
  
        Set royurl = loginuser.getResStrings();      
  
        if (royurl != null && royurl.size() > 0 && pass(royurl, url, request.getParameterMap())) {      
  
            chain.doFilter(request, response);      
  
        } else {      
  
            response.setContentType("text/html;charset=GBK");      
  
            response      
  
                    .getWriter()      
  
                    .println(      
  
                            "<div style='margin: 100 auto;text-align: center;"     
  
                                    + "font: bold 18px 宋体;color: #0066CC;vertical-align: middle'> Sorry,您没有权限访问该资源!</div>");      
  
        }      
  
    }      
  
     
  
    /**    
 
     * 判断是否是公用界面    
 
     */     
  
    protected boolean baseUrl(String url, HttpServletRequest request) {      
  
        if (url.indexOf("/login.jsp") >= 0) {      
  
            return true;      
  
        }      
  
        return false;      
  
    }      
  
     
  
    /**    
 
     * 判断该用户是否有权请求该url    
 
     *     
 
     * @param royurl    
 
     *            user拥有的授权的的url串集合    
 
     * @param url    
 
     *            当前请求的url    
 
     * @param reqmap    
 
     *            当前request的参数    
 
     * @return 是否通过该url    
 
     */     
  
    protected boolean pass(Set royurl, String url, Map reqmap) {      
  
        boolean match = true;      
  
        for (Iterator iter = royurl.iterator(); iter.hasNext();) {      
  
            // 获取资源      
  
            match = true;      
  
            String res_string = (String) iter.next();      
  
            if (res_string.indexOf("*") > 0) {      
  
                res_string = res_string.substring(0, res_string.indexOf("*"));      
  
                if (url.substring(0, res_string.length()).equalsIgnoreCase(      
  
                        res_string)) {      
  
                    return true; // 增加通配符比较      
  
                }      
  
            }      
  
            // 分割url与参数      
  
            String[] spw = res_string.split("\\?"); // 用"\\?" 转义后即可得到正确的结      
  
            if (!url.equalsIgnoreCase(spw[0])) {      
  
                match = false;      
  
            }      
  
            if (match && spw.length > 1) {      
  
                String[] spa = spw[1].split("\\&"); // 分拆各参数      
  
                for (int j = 0; j < spa.length; j++) {      
  
                    String[] spe = spa[j].split("="); // 分拆键与值      
  
                    String key = spe[0];      
  
                    String value = "";      
  
                    if (spe.length > 1) {      
  
                        value = spe[1].trim();      
  
                    }      
  
     
  
                    // 轮询      
  
                    String[] values = (String[]) reqmap.get(key);      
  
                    if (values != null) {      
  
                        for (int k = 0; k < values.length; k++) {      
  
                            if (value.equalsIgnoreCase(values[k])) {      
  
                                match = true;      
  
                                break;      
  
                            }      
  
                            match = false;      
  
                        }      
  
                        if (!match) {      
  
                            break;      
  
                        }      
  
                    }      
  
                }      
  
     
  
            }      
  
     
  
            if (match) {      
  
                break;      
  
            }      
  
        }      
  
        return match;      
  
    }      
  
     
  
    public static void main(String[] args) {      
  
        UrlFilter filter = new UrlFilter();      
  
        String url = "/baseProd/product.do";      
  
     
  
        Map reqmap = new HashMap();      
  
        // 当前请求productline参数是11,12      
  
        reqmap.put("productline", new String[] { "11", "12" });      
  
     
  
        String str;      
  
        Set royurl = new HashSet();      
  
     
  
        // 和授权的的url根本不同,false      
  
        royurl.add("/user.do?a=1&b=2");      
  
        System.out.println("match false:" + filter.pass(royurl, url, reqmap));      
  
        // 授权的请求参数13,14时 false      
  
        royurl.add("/baseProd/product.do?productline=13&productline=14");      
  
        System.out.println("match false:" + filter.pass(royurl, url, reqmap));      
  
        // 授权的请求参数11,13时 false      
  
        royurl.add("/baseProd/product.do?productline=11&productline=13");      
  
        System.out.println("match false:" + filter.pass(royurl, url, reqmap));      
  
     
  
        // 授权的请求参数11时 true      
  
        royurl.add("/baseProd/product.do?productline=11");      
  
        System.out.println("match true:" + filter.pass(royurl, url, reqmap));      
  
     
  
        // 参数的不论顺序 true      
  
        royurl.add("/baseProd/product.do?productline=12&productline=11");      
  
        System.out.println("match true:" + filter.pass(royurl, url, reqmap));      
  
     
  
        royurl.clear();      
  
        // 支持 "*" 号作通配符 true      
  
        royurl.add("/baseProd/product.do*");      
  
        System.out.println("match ture:" + filter.pass(royurl, url, reqmap));      
  
     
  
    }      
  
     
  
}     

LoginUser 类:
public class LoginUser {      
    private String name;      
  
          
  
    //用户的授权url集合,如"/product.do?line=1&singer=2","/menu.do?son=1&son=2&son=3","/job.do*"      
  
    private Set resStrings;      
  
     
  
    public String getName() {      
  
        return name;      
  
    }      
  
     
  
    public void setName(String name) {      
  
        this.name = name;      
  
    }      
  
     
  
    public Set getResStrings() {      
  
        return resStrings;      
  
    }      
   
    public void setResStrings(Set resStrings) {      
  
        this.resStrings = resStrings;      
  
    }      
            
  
}
分享到:
评论

相关推荐

    数据权限控制

    数据权限控制是信息系统安全的重要组成部分,它涉及到如何管理和限制用户对特定数据的访问。在IT领域,特别是数据库管理和Web应用开发中,数据权限控制是一项核心任务。Liger UI是一个前端框架,提供了丰富的UI组件...

    filter 实现权限控制

    在IT行业中,权限控制是系统安全的关键组成部分,特别是在企业级应用中。本文将详细探讨如何通过`Filter`实现权限控制,以及与RBAC(Role-Based Access Control,基于角色的访问控制)的关系。首先,让我们理解`...

    过滤器实现多层权限控制

    在IT行业中,权限控制是系统安全的重要组成部分,尤其是在企业级应用和网站开发中。过滤器(Filter)技术常被用来实现多层权限控制,确保只有合法的用户才能访问特定的资源。本文将深入探讨如何利用过滤器实现多层...

    一种基于树型结构的BS系统权限控制方法

    一种基于树型结构的BS系统权限控制方法,是IT领域内一种创新的权限管理策略,尤其适用于基于浏览器/服务器(B/S)架构的信息系统。这种方法不仅优化了传统的基于角色的访问控制(RBAC)技术,还针对Web信息系统中...

    基于RBAC模型的细粒度权限控制

    在现代Web应用项目中,权限控制是确保系统安全的关键组件。有效的权限管理系统能够防止非法用户访问敏感信息,只允许经过授权的用户执行特定的操作。基于RBAC(Role-Based Access Control,基于角色的访问控制)模型...

    Filter控制页面的访问权限

    下面我们将详细讨论Filter的工作原理以及`UserRoleFilter`如何实现页面访问权限控制: 1. **Filter生命周期**: - **初始化**:当Filter被加载时,会调用`init(FilterConfig filterConfig)`方法。在这个方法中,`...

    PB中多用户权限控制实施

    ### PB中多用户权限控制实施 #### 背景与需求概述 在PB(PowerBuilder)应用程序设计过程中,尤其在构建复杂的企业级管理系统时,如何有效地实现多用户环境下的权限控制是一个关键问题。通常,一个系统会被划分为...

    java权限设置,和java处理字符和二进制的转换

    1. 权限控制算法:我们可以使用位运算来实现权限控制。首先,我们定义每一个操作的唯一整数值,然后使用位运算符来检查用户是否具有某个操作权限。 2. 权限值的计算:我们可以使用位运算来计算用户的权限值。例如,...

    使用拦截器进行权限控制.rar

    本教程以“使用拦截器进行权限控制”为主题,旨在帮助新手掌握如何在Struts2框架下实现权限控制。 首先,让我们了解什么是拦截器。在Struts2中,拦截器是基于Java的动态代理实现的,它通过调用一系列拦截器来形成一...

    开源PDF转图片,并模仿PDF阅读器,可以用来做PDF阅读权限控制,禁止打印和下载.只能预览.zip

    标题中的“开源PDF转图片,并模仿PDF阅读器,可以用来做PDF阅读权限控制,禁止打印和下载.只能预览.zip”揭示了这个项目的主要功能和特性。它是一款基于开源技术的解决方案,能够将PDF文件转换为图片格式,并且具备模拟...

    pb权限控制(tag法)

    PB权限控制(Tag法)是一种在PowerBuilder应用中实现精细化权限管理的方法,尤其适用于需要控制大量权限项的系统。在PB环境下,权限控制通常涉及到不同用户对系统内多个子系统、菜单项、按钮等操作的权限分配。Tag法...

    一种基于RBAC 的Web 环境下信息系统权限控制方法.pdf

    ### 基于RBAC的Web环境下信息系统权限控制方法 #### 概述 在数字化转型的浪潮中,信息系统的安全性成为企业关注的焦点。其中,权限管理作为保障数据安全的关键环节,尤其受到重视。传统的基于用户-功能的权限控制...

    extjs 的权限问题 要求控制的对象是 菜单,按钮,URL

    在Extjs框架中,实现基于角色的权限控制是一个常见需求。Extjs主要用于构建富互联网应用(RIA),其组件化的UI构建方式与传统Web开发有较大差异。因此,对于权限的控制也要采用特定的策略来实现。上述文件内容主要...

    Greenplum数据库权限管理1

    3. 可选地,可以添加WITH GRANT OPTION,允许被授予者将该权限再转授予其他用户或角色。 1.3 管理赋予在用户特殊属性上的权限 除了数据库对象的权限外,还可以管理与用户账户相关的特殊属性,如登录权限、创建...

    现基于Spring框架应用的权限控制系统

    本文将详细讨论如何在基于Spring框架的应用中实现权限控制系统,重点介绍Acegi安全框架的使用及其在权限管控方面的解决方案。 首先,我们要了解Spring框架的核心特点。Spring框架通过控制反转(IoC)和面向切面编程...

    vue-admin-template添加权限控制.zip

    【标题】"vue-admin-template添加权限控制.zip"的资源是一个基于Vue.js的后台管理模板,旨在帮助开发者在Vue项目中实现权限控制功能。Vue.js是一个轻量级的前端JavaScript框架,以其组件化、易用性和高性能著称。在...

    Cover_cover项目_权限控制_项目cover_源码

    在IT行业中,权限控制是构建安全、稳定系统的关键部分,特别是在企业级应用或者协作平台中。"Cover_cover项目"显然是一款专门针对权限管理设计的软件组件,它通过集成jar包的方式来实现这一功能。这个项目的核心目标...

    ASP.NET系统用户权限设计与实现

    * 在 ASP.NET 中实现用户权限控制的基本思想是:根据 RBAC 的基本原理,给用户分配一个角色,每个角色对应一些权限,然后利用 ASP.NET 中的用户控件实现权限控制。 * 通过用户控件,可以将每个页面初始化时所要执行...

Global site tag (gtag.js) - Google Analytics