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=¶m1=param1val¶m2=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