权限实现

权限实现
http://forum.springside.org.cn/viewthread.php?tid=927&highlight=%E6%9D%83%E9%99%90
简单实用一分钟上手级权限控制

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

view plain print ?
  1. <!--================权限 设置================-->  
  2. <filter>  
  3.     <filter-name>Authentication</filter-name>  
  4.     <filter-class>com.springside.demo.security.UrlFilter</filter-class>  
  5.     <init-param>  
  6.         <param-name>onError</param-name>  
  7.         <param-value>/login.jsp</param-value>  
  8.     </init-param>  
  9. </filter>  
  10. <filter-mapping>  
  11.     <filter-name>Authentication</filter-name>  
  12.     <!-- 只过滤 .jsp 结尾的url, 其余的如 .do, .html, .jpg, .css 等不作过滤-->  
  13.     <url-pattern>*.jsp</url-pattern>  
  14. </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>

 

UrlFilter filter类的实现

view plain print ?
  1. public class UrlFilter implements Filter {  
  2.     private FilterConfig filterConfig;  
  3.   
  4.     private FilterChain chain;  
  5.   
  6.     private HttpServletRequest request;  
  7.   
  8.     private HttpServletResponse response;  
  9.   
  10.     public void destroy() {  
  11.         this.filterConfig = null;  
  12.     }  
  13.   
  14.     public void init(FilterConfig filterConfig) throws ServletException {  
  15.         this.filterConfig = filterConfig;  
  16.     }  
  17.   
  18.     public void doFilter(ServletRequest servletRequest,  
  19.             ServletResponse servletResponse, FilterChain chain)  
  20.             throws IOException, ServletException {  
  21.         this.chain = chain;  
  22.         this.request = (HttpServletRequest) servletRequest;  
  23.         this.response = ((HttpServletResponse) servletResponse);  
  24.   
  25.         String url = request.getServletPath();  
  26.         if (url == null)  
  27.             url = "";  
  28.   
  29.         // 获取session中的loginuser对象  
  30.         HttpSession session = request.getSession();  
  31.         LoginUser loginuser = (LoginUser) session.getAttribute("loginuser");  
  32.   
  33.         if (baseUrl(url, request)) {  
  34.             // 如果是登陆界面等无须<u><b><font color="#FF0000">权限</font></b></u>访问的的公用界面则跳过  
  35.             chain.doFilter(request, response);  
  36.         } else if (loginuser == null) {  
  37.             checkLogin(url);  
  38.         } else {  
  39.             verifyUrl(url, loginuser);  
  40.         }  
  41.     }  
  42.   
  43.     private void checkLogin(String url) throws ServletException, IOException {  
  44.         // 如果session中获取不到 loginuser 对象,要不就是session 过期了,要不就是还没登陆。所以返回登陆界面  
  45.         // 在登陆后记得把 loginuser 对象置于 session中  
  46.   
  47.         if (url.indexOf("/index.jsp") >= 0  
  48.                 && "login".equals(request.getParameter("act"))) {  
  49.             // 获取request中username,password  
  50.             String username = request.getParameter("username");  
  51.             String password = request.getParameter("password");  
  52.             UserDao userDao = new UserDao();  
  53.             if (userDao.authUser(username, password)) {  
  54.                 LoginUser user = userDao.getUser(username);  
  55.                 request.getSession().setAttribute("loginuser", user);  
  56.                 verifyUrl(url,user);  
  57.                 return;  
  58.             }  
  59.         }  
  60.         response.sendRedirect("login.jsp");  
  61.     }  
  62.   
  63.     private void verifyUrl(String url, LoginUser loginuser)  
  64.             throws IOException, ServletException {  
  65.         // 获取 loginuser 拥有的所有资源串  
  66.         Set royurl = loginuser.getResStrings();  
  67.         if (royurl != null && royurl.size() > 0 && pass(royurl, url, request.getParameterMap())) {  
  68.             chain.doFilter(request, response);  
  69.         } else {  
  70.             response.setContentType("text/html;charset=GBK");  
  71.             response  
  72.                     .getWriter()  
  73.                     .println(  
  74.                             "<div style='margin: 100 auto;text-align: center;"  
  75.                                     + "font: bold 18px 宋体;color: #0066CC;vertical-align: middle'> Sorry,您没有<u><b><font color="#FF0000">权限</font></b></u>访问该资源!</div>");  
  76.         }  
  77.     }  
  78.   
  79.     /** 
  80.      * 判断是否是公用界面 
  81.      */  
  82.     protected boolean baseUrl(String url, HttpServletRequest request) {  
  83.         if (url.indexOf("/login.jsp") >= 0) {  
  84.             return true;  
  85.         }  
  86.         return false;  
  87.     }  
  88.   
  89.     /** 
  90.      * 判断该用户是否有权请求该url 
  91.      *  
  92.      * @param royurl 
  93.      *            user拥有的授权的的url串集合 
  94.      * @param url 
  95.      *            当前请求的url 
  96.      * @param reqmap 
  97.      *            当前request的参数 
  98.      * @return 是否通过该url 
  99.      */  
  100.     protected boolean pass(Set royurl, String url, Map reqmap) {  
  101.         boolean match = true;  
  102.         for (Iterator iter = royurl.iterator(); iter.hasNext();) {  
  103.             // 获取资源  
  104.             match = true;  
  105.             String res_string = (String) iter.next();  
  106.             if (res_string.indexOf("*") > 0) {  
  107.                 res_string = res_string.substring(0, res_string.indexOf("*"));  
  108.                 if (url.substring(0, res_string.length()).equalsIgnoreCase(  
  109.                         res_string)) {  
  110.                     return true// 增加通配符比较  
  111.                 }  
  112.             }  
  113.             // 分割url与参数  
  114.             String[] spw = res_string.split("\\?"); // 用"\\?" 转义后即可得到正确的结  
  115.             if (!url.equalsIgnoreCase(spw[0])) {  
  116.                 match = false;  
  117.             }  
  118.             if (match && spw.length > 1) {  
  119.                 String[] spa = spw[1].split("\\&"); // 分拆各参数  
  120.                 for (int j = 0; j < spa.length; j++) {  
  121.                     String[] spe = spa[j].split("="); // 分拆键与值  
  122.                     String key = spe[0];  
  123.                     String value = "";  
  124.                     if (spe.length > 1) {  
  125.                         value = spe[1].trim();  
  126.                     }  
  127.   
  128.                     // 轮询  
  129.                     String[] values = (String[]) reqmap.get(key);  
  130.                     if (values != null) {  
  131.                         for (int k = 0; k < values.length; k++) {  
  132.                             if (value.equalsIgnoreCase(values[k])) {  
  133.                                 match = true;  
  134.                                 break;  
  135.                             }  
  136.                             match = false;  
  137.                         }  
  138.                         if (!match) {  
  139.                             break;  
  140.                         }  
  141.                     }  
  142.                 }  
  143.   
  144.             }  
  145.   
  146.             if (match) {  
  147.                 break;  
  148.             }  
  149.         }  
  150.         return match;  
  151.     }  
  152.   
  153.     public static void main(String[] args) {  
  154.         UrlFilter filter = new UrlFilter();  
  155.         String url = "/baseProd/product.do";  
  156.   
  157.         Map reqmap = new HashMap();  
  158.         // 当前请求productline参数是11,12  
  159.         reqmap.put("productline"new String[] { "11""12" });  
  160.   
  161.         String str;  
  162.         Set royurl = new HashSet();  
  163.   
  164.         // 和授权的的url根本不同,false  
  165.         royurl.add("/user.do?a=1&b=2");  
  166.         System.out.println("match false:" + filter.pass(royurl, url, reqmap));  
  167.         // 授权的请求参数13,14时 false  
  168.         royurl.add("/baseProd/product.do?productline=13&productline=14");  
  169.         System.out.println("match false:" + filter.pass(royurl, url, reqmap));  
  170.         // 授权的请求参数11,13时 false  
  171.         royurl.add("/baseProd/product.do?productline=11&productline=13");  
  172.         System.out.println("match false:" + filter.pass(royurl, url, reqmap));  
  173.   
  174.         // 授权的请求参数11时 true  
  175.         royurl.add("/baseProd/product.do?productline=11");  
  176.         System.out.println("match true:" + filter.pass(royurl, url, reqmap));  
  177.   
  178.         // 参数的不论顺序 true  
  179.         royurl.add("/baseProd/product.do?productline=12&productline=11");  
  180.         System.out.println("match true:" + filter.pass(royurl, url, reqmap));  
  181.   
  182.         royurl.clear();  
  183.         // 支持 "*" 号作通配符 true  
  184.         royurl.add("/baseProd/product.do*");  
  185.         System.out.println("match ture:" + filter.pass(royurl, url, reqmap));  
  186.   
  187.     }  
  188.   
  189. }  
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)) { // 如果是登陆界面等无须<u><b><font color="#FF0000">权限</font></b></u>访问的的公用界面则跳过 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,您没有<u><b><font color="#FF0000">权限</font></b></u>访问该资源!</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 plain print ?
  1. public class LoginUser {  
  2.     private String name;  
  3.       
  4.     //用户的授权url集合,如"/product.do?line=1&singer=2","/menu.do?son=1&son=2&son=3","/job.do*"  
  5.     private Set resStrings;  
  6.   
  7.     public String getName() {  
  8.         return name;  
  9.     }  
  10.   
  11.     public void setName(String name) {  
  12.         this.name = name;  
  13.     }  
  14.   
  15.     public Set getResStrings() {  
  16.         return resStrings;  
  17.     }  
  18.   
  19.     public void setResStrings(Set resStrings) {  
  20.         this.resStrings = resStrings;  
  21.     }  
  22.       
  23.       


你可能感兴趣的:(权限实现)