`
xyzroundo
  • 浏览: 509003 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类
最新评论

简单实用一分钟上手级权限控制

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


view plaincopy to clipboardprint?
   
<!--================权限 设置================-->    
<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>    
 

<!--================权限 设置================--> 
<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> 

view plaincopy to clipboardprint?
   
 
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));     
 
    
 
    }     
 
    
 
}    
 


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 类: view plaincopy to clipboardprint?
   
 
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;     
 
    }     
 
         
 
         
 
}    
 


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;  

    }  

      

      





分享到:
评论

相关推荐

    10分钟上手Unix.zip

    《10分钟上手Unix》压缩包包含了丰富的Unix学习资源,旨在帮助初学者快速掌握Unix操作系统的基本概念和常用命令。这个压缩包中的文件包括一本电子书《Sams.Sams.Teach.Yourself.Unix.In.10.Minutes.2nd.edition.Jun....

    定时关机实用程序

    在IT领域,定时关机实用程序是日常计算机管理中非常实用的一种工具,尤其适用于需要进行自动化维护或希望节省能源的用户。本篇文章将详细介绍这种工具的功能、用途以及如何使用。 定时关机实用程序,正如其名,允许...

    PDF橡皮擦 简单 好用

    总的来说,PDF橡皮擦是一款针对PDF文档进行轻量级编辑的实用工具,尤其适合需要快速删除PDF中部分内容的用户。其简单易用的操作界面和高效的编辑功能,使得它成为个人和企业日常工作中处理PDF文件的好帮手。不过,...

    一彩快递单打印软件 v1.24.zip

    软件界面美观简洁、简单全面、实用方便,无需培训,即可快速上手,轻轻松松完成日常快递单打印功能,真正做到简单全面实用。是用户实现快递单打印功能的好帮手。 一彩快递单打印软件功能 1、系统支持近百种国内...

    Easyfzs FTP服务器

    "Easyfzs FTP服务器"是一款轻量级的FTP(File Transfer Protocol)服务器软件,它的特点在于体积小巧,仅为1MB,且...通过其简单的管理和权限设定,用户可以在几分钟内建立并管理自己的FTP服务器,高效地进行文件交换。

    一彩送货单

    1、软件简单易用、通俗易懂,提供视频教程,只需几分钟就可以快速上手; 2、支持即输即打:即不用先建好客户资料、产品资料即可直接开单,系统自动帮您保存; 3、提供绿色免安装版本:直接放在U盘中就可以使用; ...

    pdf转word工具

    PDF转Word工具是一种实用软件,专门用于将Adobe PDF(Portable Document Format)文件转换为Microsoft Word文档格式,通常为.doc或.docx。这种转换是许多用户经常需要进行的操作,因为尽管PDF格式在保持文档布局和...

    一彩送货单打印软件 2016 v2.15.zip

    软件界面美观简洁、简单全面、实用方便,可快速上手,轻轻松松完成日常送货单管理打印功能,真正做到简单全面实用。是用户实现送货单管理打印功能的好帮手。 彩送货单打印软件特色 1、软件简单易用、通俗易懂,...

    更夫(watchman)是一款可视化的定时任务配置 Web 工具,麻麻不用担心我漏掉任何更新-watchman.zip

    在安全性方面,Watchman支持用户权限管理和访问控制,确保只有授权的用户才能对任务进行操作。此外,它可能还具备加密传输和数据备份功能,保障了用户数据的安全性和完整性。 Watchman的实现可能基于常见的Web框架...

    定时关机           

    此外,对于那些需要长时间运行任务,如下载大文件或进行系统更新的用户,定时关机也是一个非常实用的工具,可以在任务完成后自动关闭计算机,避免了无人值守时电脑的长时间开启。 软件的操作界面通常简洁明了,即使...

    关机小助手

    "关机小助手"是一款专为用户设计的自动化关机工具,它简化了电脑的关机过程,提供了方便快捷的定时关机、计划任务等实用功能。在日常使用电脑时,我们有时需要在特定时间让电脑自动关机,例如进行长时间的系统更新...

    kiftd说明文档1

    《kiftd说明文档1》 欢迎使用kiftd v1.0.34,...无论是个人使用还是团队协作,kiftd都是一个强大而实用的文件传输解决方案。通过深入学习和实践,您将能够充分利用kiftd的各项功能,提升文件管理效率,保障数据安全。

    定时关机酷

    "定时关机酷"是一款专为用户设计的实用小软件,其主要功能是帮助用户设置电脑在特定时间自动关机,以实现个性化和自动化的时间管理。这款工具在日常使用中非常方便,尤其对于那些需要长时间运行计算任务或者希望在...

    JQ选择时间插件

    这个插件名为laydate,是一个基于jQuery的轻量级组件,它提供了丰富的选择类型和强大的自定义能力。 首先,laydate的核心功能包括五种选择方式: 1. **年选择器**:用户可以选择一个特定的年份,这对于需要设置...

    今晨送货单打印软件 2016 v1.43.zip

    1、软件简单易用、通俗易懂,提供视频教程,只需几分钟就可以快速上手; 2、支持即输即打:即不用先建好客户资料、产品资料即可直接开单,系统自动帮您保存; 3、提供绿色免安装版本:直接放在U盘中就可以使用; ...

    开博送货单管理系统(标准版)v2.20.rar

    软件图形化操作界面,操作简单、易学易用,配备视频操作教程、图片操作文档几分钟就可以轻松上手。 软件的拓展性很强,不仅可以设计打印格式,还可以自定义表格列内容、表头显示标题、单据编号编排规则等等。 支持...

    开博店铺收银管理系统 v2.835.zip

    简单易用、通俗易懂 ,提供视频和文档教程,只需几分钟就可以快速上手使用 可定制化界面,可以根据您的喜好设计界面的展示方式和颜色组合,并具有皮肤功能 提供绿色版本,软件支持U盘操作,实现数据随身携带,即插...

    易语言自动关机源码

    4. **用户交互界面**:为了让用户能方便地设置关机时间,程序通常会包含一个简单的用户界面,如输入框用于设置分钟数,按钮用于启动或取消关机任务。易语言提供了丰富的控件和事件处理机制来构建这样的界面。 5. **...

    好事特化妆品店会员收银管理软件系统 v1.0.zip

    1、支持会员促销、团购促销、时段促销、搭赠、有权限控制的前台折扣或折价、捆绑销售、量大从段、限量购买、买100 1促销。 2、满足更全面的商业需求,支持商品捆绑销售、商品折包销售、特价、搭赠、时段促销、商品...

    ASPMaker 6

    5. 安全性:ASPMaker 6生成的代码考虑了安全因素,例如输入验证和权限控制,有助于防止常见的Web应用攻击。 6. 国际化支持:对于多语言网站的需求,ASPMaker 6提供国际化的功能,可以方便地切换不同语言的界面。 7...

Global site tag (gtag.js) - Google Analytics