分享

权限(二)

 枯井道人 2017-04-15

一、


接着上一篇的说 权限(一)--用户、权限组以及权限的分配


权限的控制分为两块:

1.页面的控制(没用权限的不让他看到页面)

2.过滤控制(就算知道url,没有权限也不让进)



在项目中,都是由一个人来负责权限部分的编写,然后其他人的活中多少会涉及到一些权限相关的。

所以,权限控制的通用性是非常重要的(总不能每次写到就找写权限部分的那个人,问他怎么弄)。


测试demo包:

权限控制Demo



二、过滤器



在访问url之前,进行一次过滤,同时查看当前用户是否有访问该url的权限。

为了保证通用性,这里使用一个map来记录url与权限的映射关系。

当其他开发者编写到需要权限控制的页面时,只需要将页面的url以及对应需要哪种权限的映射对放入到数据库中。

在应用发布的时候,加载映射到内存即可。


在过滤的时候:
1.通过url查看映射表,判断当前url是否需要权限,如果需要,需要什么权限

2.通过查找到的权限,与session中保存的权限比,看session中是否有需要的权限

session的权限查找用的比较多,所以使用HashSet实现O1时间查找。


[java] view plaincopy
  1. package com.privilege.filter;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.HashSet;  
  5.   
  6. import javax.servlet.Filter;  
  7. import javax.servlet.FilterChain;  
  8. import javax.servlet.FilterConfig;  
  9. import javax.servlet.ServletException;  
  10. import javax.servlet.ServletRequest;  
  11. import javax.servlet.ServletResponse;  
  12. import javax.servlet.http.HttpServletRequest;  
  13. import javax.servlet.http.HttpServletResponse;  
  14.   
  15. import com.privilege.utils.PrivilegeUrlMapping;  
  16.   
  17. public class PrivilegeFilter implements Filter {  
  18.   
  19.     private static String CONTEXT_PATH = null;  
  20.   
  21.     @Override  
  22.     public void destroy() {  
  23.   
  24.     }  
  25.   
  26.     @SuppressWarnings("unchecked")  
  27.     @Override  
  28.     public void doFilter(ServletRequest req, ServletResponse resp,  
  29.             FilterChain chain) throws IOException, ServletException {  
  30.         HttpServletRequest request = (HttpServletRequest) req;  
  31.         HttpServletResponse response = (HttpServletResponse) resp;  
  32.   
  33.         String requestPath = request.getRequestURI();  
  34.         String target = requestPath.replace(CONTEXT_PATH, "");  
  35.   
  36.         // 如果不需要权限,放行  
  37.         if (!PrivilegeUrlMapping.contains(target)) {  
  38.             chain.doFilter(request, response);  
  39.             return;  
  40.         }  
  41.   
  42.         Object p = request.getSession().getAttribute("privilege");  
  43.         // 如果session无记录,直接不给过  
  44.         if (p == null) {  
  45.             defaultRedirect(response);  
  46.             return;  
  47.         }  
  48.         HashSet<Integer> privleges = (HashSet<Integer>) p;  
  49.         // 查找映射关系表  
  50.         Integer code = PrivilegeUrlMapping.getPrivilegeCode(target);  
  51.         // 查看该用户是否包含此url的权限  
  52.         if (privleges.contains(code)) {  
  53.             chain.doFilter(request, response);  
  54.             return;  
  55.         }  
  56.   
  57.         // 权限不足,重定向到登录界面  
  58.         defaultRedirect(response);  
  59.   
  60.     }  
  61.   
  62.     private void defaultRedirect(HttpServletResponse response)  
  63.             throws IOException {  
  64.         response.sendRedirect(CONTEXT_PATH + "/login.jsp");  
  65.     }  
  66.   
  67.     @Override  
  68.     public void init(FilterConfig config) throws ServletException {  
  69.         CONTEXT_PATH = config.getServletContext().getContextPath();  
  70.     }  
  71.   
  72. }  



三、页面处理


同样是为了实现通用,这里使用一个自定义标签

设想是这样的

<p:privilege target="2"></p:privilege>

使用这个一个标签,将需要权限判断的内容放入到其中,然后指定需要哪种权限。


自定义标签java代码:

[java] view plaincopy
  1. package com.privilege.tag;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.HashSet;  
  5.   
  6. import javax.servlet.jsp.JspException;  
  7. import javax.servlet.jsp.tagext.BodyTagSupport;  
  8.   
  9. public class PrivilegeTag extends BodyTagSupport {  
  10.   
  11.     private Integer target;  
  12.       
  13.       
  14.     @Override  
  15.     public int doEndTag() throws JspException {  
  16.         Integer code = getTarget();  
  17.         Object p = pageContext.getSession().getAttribute("privilege");  
  18.         if (p == null) {  
  19.             return SKIP_BODY;  
  20.         }  
  21.         HashSet<Integer> privilege = (HashSet<Integer>) p;  
  22.         //如果session中的privilege含有该权限,则显示其中的内容  
  23.         //否则跳过  
  24.         if (privilege.contains(code)) {  
  25.             try {  
  26.                 pageContext.getOut().print(bodyContent.getString());  
  27.             } catch (IOException e) {  
  28.                 e.printStackTrace();  
  29.             }   
  30.             return EVAL_PAGE;  
  31.         }  
  32.         return SKIP_BODY;  
  33.     }  
  34.   
  35.     public Integer getTarget() {  
  36.         return target;  
  37.     }  
  38.   
  39.     public void setTarget(Integer target) {  
  40.         this.target = target;  
  41.     }  
  42.       
  43. }  

自定义标签配置文件(放在WEB-INF下):

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2.   
  3. <taglib xmlns="http://java./xml/ns/javaee" xmlns:xsi="http://www./2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java./xml/ns/javaee http://java./xml/ns/javaee/web-jsptaglibrary_2_1.xsd"  
  5.     version="2.1">  
  6.   
  7.     <tlib-version>1.2</tlib-version>  
  8.     <short-name>p</short-name>  
  9.     <uri>http://java./jsp/jstl/privilege</uri>  
  10.   
  11.   
  12.   
  13.     <tag>  
  14.         <name>privilege</name>  
  15.         <tag-class>com.privilege.tag.PrivilegeTag</tag-class>  
  16.         <body-content>JSP</body-content>  
  17.         <attribute>  
  18.             <name>target</name>  
  19.             <required>yes</required>  
  20.         </attribute>  
  21.     </tag>  
  22.   
  23. </taglib>  


、jsp页面

1.包含taglib

[html] view plaincopy
  1. <%@ taglib prefix="p" uri="http://java./jsp/jstl/privilege"%>  

2.内容

[html] view plaincopy
  1. <body>  
  2.     <p:privilege target="1">  
  3.         <div>权限1能够看到</div>  
  4.         ${user.username}  
  5.     </p:privilege>  
  6.   
  7.     <p:privilege target="2">  
  8.         <div>权限2能够看到</div>  
  9.         ${user.username}  
  10.         </p:privilege>  
  11.   
  12.     <p:privilege target="3">  
  13.         <div>权限3能够看到</div>  
  14.         ${user.username}  
  15.     </p:privilege>  
  16. </body>  


五、测试


好了,亲测好使。。。

下载地址:

权限控制Demo

记得查看readme.txt文件

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多