权限验证框架-authorityFilter学习

1.简介

demo,jar,src,doc下载地址:http://code.google.com/p/my-project-authorityfilter/downloads/list

 基于java 过滤器(Filter)实现对权限控制的框架。软件由三部分组成:

权限过滤器AuthorityFilter # 负责过滤url并执行权限检查器中的权限验证方法(check).配置在web.xml中

权限检查器PermissionChecker # 由用户基于业务扩展,但必须继承类:PermissionChecker,实现check方法。用户继承的Checker类必须配置在Authority的init-param中,param-name 为用户扩展的permissionChecker.           

权限数据处理器AuthorityHandler # 权限数据是有结构的。相当于一个hash.即权限组的概念。{

                    group1:[/webModel1.do*,/webModel2/*.do*,/webModel3.do?method=hello*]

                          }

                  注:'*'代表任意字符。

权限数据的主要来源有两种:

1.DB,从DB查出数据组装出以上hash结构。即:Map<String,Collection<String>>.

2.从权限数据文件获得。

       此文件可以配置在AuthorityFilter的init-param中,param-nam为:authortyFile(文件扩展名必须是.authorty).

      如果不从web.xml配置,也可以用权限数据处理器中的方法去加载文件。

      权限数据文件中权限的格式是一种我称之为友好型JSON(friendly json)[不需要双引号、单引号之类的字符]的形式={ group1:[/webModel1.do*,/webModel2/*.do*,/webModel3.domethod=hello*] , group2:[/webModel1.do*,/webModel2.do?mechod=add*,/webModel3.do*] 

                       }

权限数据处理提供了很多中<验证权限的方法>,<管理权限数据的方法>,<加载权限数据的方法>。

 

 

2.学习
2.0jar包
   --authorityFilter.jar
   --log4j.jar
   --fastjson.jar

2.1在web.xml中配置authorityFilter

<!--authenFilter-->
<filter>
    <filter-name>authenFilter</filter-name>
    <filter-class>org.authority.core.filter.AuthorityFilter</filter-class>
    <init-param>
      <param-name>permissionChecker</param-name>
      <param-value>com.ssm.bussiness.security.MyPermissionChecker</param-value>
    </init-param>
    <init-param>
      <param-name>authorityFile</param-name>
      <param-value>com/ssm/bussiness/security/authen.authority</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>authenFilter</filter-name>
    <url-pattern>*.so</url-pattern>
  </filter-mapping>

 

2.2书写permissionChecker类

/**
 * 
 */
package com.ssm.bussiness.security;


import java.io.IOException;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.authority.core.checker.PermissionChecker;
import org.authority.core.handler.AuthorityHandler;

/**
 * com.ssm.common.AccessAuthenFilter
 * @author JsonZou
 * copyright  2012
 *********************************
 * 修改项                 修改人                修改时间
 *
 *********************************
 */
public class MyPermissionChecker extends PermissionChecker{ 
	
@Override
public void init(){

/*	
//init 方法中可以加载权限到缓存authority,加载方式有很多种手工、读取authority文件、从DB查询。
//AuthorityHandler类就是提供这些管理权限缓存的方法。
//根据需要init自己定义书写。如果不写此方法,则默认权限只有web.xml中配置的authorityFile文件中读取
//web.xml中的的authorityFile路径是从src下开始的。
<init-param>
      <param-name>authorityFile</param-name>
      <param-value>com/ssm/bussiness/security/authen.authority</param-value>
    </init-param>

//以下只是示范。

try { AuthorityHandler.addAuthorityFromFile("com/ssm/bussiness/security/au1.authority"); } catch (IOException e) { e.printStackTrace(); } String jsonResources_format="{teacher:[/teacher.so*]}"; AuthorityHandler.addAuthorityFromFriendlyJSON(jsonResources_format); Map m=new HashMap(); List l=new ArrayList(); l.add("/student.so*"); m.put("student",l); AuthorityHandler.addAuthorityFromMapColection(m); List l2=new ArrayList(); l2.add("/major.so*"); AuthorityHandler.addAuthorityFromCollection("student",l2); */ }



@Override public Boolean check(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException{ HttpSession session = request.getSession(); Object roleInfo=session.getAttribute("roleInfo"); String roleCode=session.getAttribute("roleCode")==null?"":session.getAttribute("roleCode").toString(); String url=super.getUrl(request); if(roleInfo==null){ if(!AuthorityHandler.check(new String[]{"common_nologin"}, url)){ redirect("index.jsp", request, response); return false; } }else if(!AuthorityHandler.check(new String[]{roleCode,"common_login","common_nologin"}, url)){ redirect("page/error/error.jsp?err=noAuthen", request, response); return false; } return true; } //getUrl可以重写,用来获取你的action url。当然如果不重写,默认是:
	/**
	 * Get the request's servlet path
	 * @date 2013-5-4
	 * @author JsonZou
	 * @param request   HttpServletResponse
	 */
	public String getUrl(HttpServletRequest request){
		    return request.getServletPath();
	};

//因为本例mvc框架用的是stripes,他的action是这样的:http://localhost:8080/ssm/student.action?methordName=&param1=param1val&param2=param2val
//即第一个参数名字代表的是action的方法。所以需要重写。
@Override public String getUrl(HttpServletRequest request){ String path=request.getServletPath(); String method="";String value=""; String queryString= request.getQueryString(); if(queryString!=null&&!"".equals(queryString)){ String methodquery=queryString.split("&")[0]; String[] method_value=methodquery.split("="); if(method_value!=null){ method=method_value[0]; if(method_value.length==2){ value=method_value[1]; } } } return path+(method!=null&&!"".equals(method)&&(value==null||"".equals(value))?("?"+method):""); } }

 

 

 2.3authorityFile文件配置(当然你也可以不配置而从DB中获取资源)
authorityFile中的配置是一种我称之为友好型JSON(不需要引号)的形式:

{
	manager:[/student.so*,/teacher.so*,/notice.so*,/major.so*,/subject.so?*verify*,/manager.so*],
	teacher:[/subject.so*,/choose.so?*verify*,/manager.so?selAll*],
	teacher_exclude:[/subject.so?*verify*],
	student:[/choose.so*],
	student_exclude:[/choose.so?*verify*],
	common_nologin:[/notice.so?show*,/login.so*],
	common_login:[/major.so?selAll*,/subject.so?downloadFile*,/choose.so?downloadFile*,/login.so?toPassword*]
}
有两点需要注意:
  1)*代表所有字符
  2)权限组以_exclude结尾表示要排除的权限。如:上面的teacher_exclude,则表示排除/sbubject.so*中方法包含verify的权限路径


可参考:http://www.itblog8.cn/java/20130519127.html

转载于:https://my.oschina.net/jsonavaj/blog/131978

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值