`
bearjava
  • 浏览: 82238 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

扩展Acegi框架 自定义权限处理

    博客分类:
  • Java
阅读更多
Acegi默认不支持RBAC权限模型,需要自己扩展。对于数据的获取默认是SQL,也需要扩展。

public class RdbmsEntryHolder implements Serializable{
	
	private static final long serialVersionUID = 2317309106087370323L;
	
	//保护的URL模式
	private String url;
	
	//要求的角色集合
	private ConfigAttributeDefinition cad;
	
	public String getUrl() {
		return url;
	}
	
	public ConfigAttributeDefinition getCad() {
		return cad;
	}
	
	public void setUrl(String url) {
		this.url = url;
	}
	
	public void setCad(ConfigAttributeDefinition cad) {
		this.cad = cad;
	}	
}

public class RdbmsFilterInvocationDefinitionSource extends JdbcDaoSupport implements FilterInvocationDefinitionSource {

	protected static final Log logger = LogFactory.getLog(RdbmsFilterInvocationDefinitionSource.class);
	
	private SecuredUrlDefinition rdbmsInvocationDefinition;

	private PathMatcher pathMatcher = new AntPathMatcher();
	
	private Ehcache webresdbCache;
	
	private IBaseDAO baseDAO;

	public ConfigAttributeDefinition getAttributes(Object object)
			throws IllegalArgumentException {
		logger.info("starting method getAttributes");
		if ((object == null) || !this.supports(object.getClass())) {
			throw new IllegalArgumentException("抱歉,目标对象不是FilterInvocation类型");
		}
		// 抽取出待请求的URL
		String url = ((FilterInvocation) object).getRequestUrl();
		logger.info("请求的url: "+url);
		
		List list = this.getRdbmsEntryHolderList();
		if (list == null || list.size() == 0)
			return null;
		int firstQuestionMarkIndex = url.indexOf("?");
		if (firstQuestionMarkIndex != -1) {
			url = url.substring(0, firstQuestionMarkIndex);
		}
		Iterator iter = list.iterator();
		while (iter.hasNext()) {
			RdbmsEntryHolder entryHolder = (RdbmsEntryHolder) iter.next();			
			boolean matched = pathMatcher.match(entryHolder.getUrl(), url);
			if (logger.isDebugEnabled()) {
				logger.debug("匹配到如下URL: '" + url + ";模式为 "
						+ entryHolder.getUrl() + ";是否被匹配:" + matched);
			}
			if (matched) {
				return entryHolder.getCad();
			}
		}
		logger.info("ending method getConfigAttributeDefinitions");
		return null;
	}

	public Iterator getConfigAttributeDefinitions() {
		logger.info("starting method getConfigAttributeDefinitions");
        Set set = new HashSet();
        Iterator iter = this.getRdbmsEntryHolderList().iterator();
        while (iter.hasNext()) {
        	RdbmsEntryHolder entryHolder = (RdbmsEntryHolder) iter.next();
            set.add(entryHolder.getCad());
        }
        return set.iterator();
	}

	public boolean supports(Class clazz) {
		logger.info("starting method supports");
		if (FilterInvocation.class.isAssignableFrom(clazz)) {
			return true;
		} else {
			return false;
		}
	}

	protected void initDao() throws Exception {
		logger.info("starting method initDao");
		this.rdbmsInvocationDefinition = new SecuredUrlDefinition(baseDAO);
		if(this.webresdbCache == null)
			throw new IllegalArgumentException("必须为RdbmsFilterInvocationDefinitionSource配置一EhCache缓存");
	}

	private List getRdbmsEntryHolderList(){
		logger.info("starting method getRdbmsEntryHolderList");
		List list = null;
		Element element = this.webresdbCache.get("webres");
		if(element != null){
			list = (List)element.getValue();
		} else {
			list = this.rdbmsInvocationDefinition.execute();			
			Element elem = new Element("webres", list);
			this.webresdbCache.put(elem);
		}
		logger.info("ending method getRdbmsEntryHolderList.list size :"+list.size());
		return list;
	}
	
	public void setWebresdbCache(Ehcache webresdbCache) {
		this.webresdbCache = webresdbCache;
	}
	
	public void setBaseDAO(IBaseDAO baseDAO) {
		this.baseDAO = baseDAO;
	}	
}

/**
 * Hibernate实现获取角色,Jdbc实现获取资源.
 * @author xiongyuan
 */
public class RdbmsSecuredUrlDefinition extends MappingSqlQuery{

	protected static final Log logger = LogFactory.getLog(RdbmsSecuredUrlDefinition.class);	
	
	private IBaseDAO baseDAO;

	protected RdbmsSecuredUrlDefinition(DataSource ds,IBaseDAO baseDAO) {
        super(ds, "SELECT * FROM auth");      
    	logger.info("进入到RdbmsInvocationDefinition构建器中.........");
    	this.baseDAO = baseDAO;
        compile();
    }

    protected Object mapRow(ResultSet rs, int rownum)
        throws SQLException {    
    	StringBuffer msg = new StringBuffer();
    	RdbmsEntryHolder rsh = new RdbmsEntryHolder();
    	//设置URL
    	int urlid = rs.getInt("authid");
    	String url = rs.getString("authName");
    	msg.append(url+" 对应的ROLE列表...");    	
    	rsh.setUrl(url);
        ConfigAttributeDefinition cad = new ConfigAttributeDefinition();  
        
        /*使用逗号分割role的方案
         * String[] tokens = 
        		StringUtils.commaDelimitedListToStringArray(rs.getString("rolename").trim());
        for(int i = 0; i < tokens.length;++i)
        	cad.addConfigAttribute(new SecurityConfig(tokens[i]));
        */  
        
        //使用自定义表结构后的方案
        String hql = "FROM RoleAuth ra where ra.auth.authid=?";
        List list = baseDAO.find(hql, urlid);
		Iterator iterator = list.iterator();
		while (iterator.hasNext()) {
			RoleAuth obj = (RoleAuth)iterator.next();			
			msg.append(obj.getRole().getRoleName()+",");
			cad.addConfigAttribute(new SecurityConfig(obj.getRole().getRoleName()));
		}
		logger.info(msg);
        //设置角色集合
       rsh.setCad(cad);    	
       return rsh;
    }
}

/**
 * Hibernate实现获取角色权限和资源列表
 * @author xiongyuan
 */
public class SecuredUrlDefinition {

	private static final Log logger = LogFactory.getLog(SecuredUrlDefinition.class);

	private IBaseDAO baseDAO;

	private String loadSecuredUrl = "FROM Auth";

	private String loadRoleForUrl = "FROM RoleAuth ra where ra.auth.authid=?";

	public SecuredUrlDefinition(IBaseDAO baseDAO) {
		logger.info("进入到SecuredUrlDefinition构建器中.........");
		this.baseDAO = baseDAO;
	}

	private RdbmsEntryHolder mapRow(Auth auth) throws SQLException {
		StringBuffer msg = new StringBuffer();		
		// 设置URL
		int urlid = auth.getAuthid();
		String url = auth.getAuthName();
		msg.append(url + " 对应的ROLE列表...");
		RdbmsEntryHolder rsh = new RdbmsEntryHolder();
		rsh.setUrl(url);
		ConfigAttributeDefinition cad = new ConfigAttributeDefinition();
		// 使用自定义表结构后的方案
		List list = baseDAO.find(loadRoleForUrl, urlid);
		Iterator iterator = list.iterator();
		while (iterator.hasNext()) {
			RoleAuth obj = (RoleAuth) iterator.next();
			msg.append(obj.getRole().getRoleName() + ",");
			cad.addConfigAttribute(new SecurityConfig(obj.getRole().getRoleName()));
		}
		logger.info(msg);
		// 设置角色集合
		rsh.setCad(cad);
		return rsh;
	}

	public List execute() {
		List<RdbmsEntryHolder> entryHolderList = new ArrayList<RdbmsEntryHolder>();
		try {
			List securedUrl = baseDAO.find(loadSecuredUrl);
			for (int i = 0; i < securedUrl.size(); i++) {
				Auth auth = (Auth) securedUrl.get(i);				
				entryHolderList.add(mapRow(auth));
			}
		} catch (SQLException e) {			
			e.printStackTrace();
		}
		return entryHolderList;
	}

	public void setLoadRoleForUrl(String loadRoleForUrl) {
		this.loadRoleForUrl = loadRoleForUrl;
	}

	public void setLoadSecuredUrl(String loadSecuredUrl) {
		this.loadSecuredUrl = loadSecuredUrl;
	}
}




分享到:
评论

相关推荐

    基于Acegi安全框架的权限管理研究与实现.

    ### 基于Acegi安全框架的权限管理研究与实现 #### 摘要与背景 在当前的软件开发领域,尤其是针对Java Web应用程序的安全性设计尤为重要。一个完整的Java Web应用系统不仅需要强大的功能模块来支撑业务逻辑,还需要...

    acegi实现用户权限

    总之,AceGI作为一个强大的安全框架,通过灵活的配置和扩展机制,使开发者能轻松地在Web应用中实现复杂的安全控制。它不仅支持基本的认证和授权,还允许自定义逻辑以适应各种业务场景。通过理解和熟练运用AceGI,...

    权限Acegi的使用

    6. **事件监听**:Acegi允许监听和处理安全相关的事件,如登录成功、失败,或者权限被拒绝等,开发者可以自定义处理这些事件的行为。 在实际应用中,我们通常会遵循以下步骤来使用Acegi: 1. **集成Acegi**:将...

    使用acegi控制用户权限实例

    Acegi Security是Spring框架早期的一个安全模块,它提供了全面的基于Spring的应用程序的访问控制和身份验证功能。在本文中,我们将深入探讨如何使用Acegi Security来实现用户权限的控制。 Acegi Security的核心功能...

    Spring源代码解析(九):Spring_Acegi框架鉴权的实现.doc

    在Spring_Acegi框架鉴权的实现中,我们主要关注的是如何处理用户的登录验证以及在验证成功或失败后系统如何响应。 首先,Spring_Acegi通过实现Servlet的`Filter`接口来介入HTTP请求的生命周期。`...

    基于rbac模式的acegi权限管理

    本文将深入探讨基于RBAC(Role-Based Access Control)模式的Acegi权限管理,它是在Spring框架上的一个经典实现。RBAC是一种广泛采用的权限模型,通过角色来分配权限,有效地实现了用户与权限之间的间接关联,降低了...

    acegi 例子 进行了扩展

    通过这个示例,开发者可以学习到如何使用Acegi Security进行权限配置,包括设置安全性拦截器、创建自定义的认证和授权机制、处理未授权或未认证的异常、以及如何在控制器中检查用户权限等。此外,还能了解到如何在...

    Acegi安全权限管理手册

    Acegi Security是Spring框架的一个扩展,它为Java应用程序提供了强大的安全性和权限控制功能。在这个手册中,读者将深入理解如何利用Acegi来构建安全、灵活且可扩展的企业级应用程序。 1. **Acegi Security概述**:...

    Acegi将资源权限数据存储到数据库.pdf

    在处理复杂的权限管理时,Acegi允许开发者将资源权限数据存储到数据库,而不是仅局限于配置文件中,这样可以实现更灵活的权限动态扩展。 在传统的Acegi配置中,资源和角色的关系通常是硬编码在XML配置文件内的,...

    现基于Spring框架应用的权限控制系统

    Acegi框架的集成和使用,不仅保持了Spring框架的轻量级和简洁性,而且通过高效的AOP和IoC机制,使得安全控制功能得以在不影响应用其他部分的前提下,灵活地扩展和维护。 在面对日益复杂的网络安全挑战时,利用Acegi...

    batis+acegi实现的动态权限控制

    博文链接中提到的“https://huangshenji.iteye.com/blog/298413”可以查看具体的实现细节,可能包括如何配置Acegi,如何在MyBatis中查询权限数据,以及如何自定义权限策略等。 6. **升级至Spring Security**: ...

    基于java的ACEGI

    4. **实现认证和授权逻辑**:根据应用需求,实现自定义的认证和授权类,这些类通常会扩展Acegi提供的基础类。 5. **测试和调试**:在实际运行环境中测试安全功能,确保用户权限设置正确,并使用Acegi提供的日志和...

    安全框架acegi-1.0.7.rar

    4. **commons-collections-3.1.jar**: Apache Commons Collections是Java集合框架的一个扩展库,提供了丰富的集合操作和实用工具,例如列表转换、排序、查找等,这对于处理Acegi Security中的用户和权限数据非常有用...

    最简单acegi权限管理实例

    总的来说,这个"最简单acegi权限管理实例"是一个很好的学习起点,通过实践可以了解Acegi的基本用法,包括用户认证、权限控制、配置文件的理解以及如何与Spring框架集成。在实际项目中,我们需要根据需求进行更复杂的...

    Acegi 数据库配置安全策略 源代码及图解

    6. **定制编辑器配置**:`customEditorConfigurer.jpg`可能涉及到Acegi中自定义类型转换器的配置,这对于处理自定义权限对象或其他特殊类型的认证信息很有帮助。 7. **用户权限管理**:标签中的“用户权限”表明,...

    ACEGI

    Acegi Security是一个专门为Spring框架设计的权限控制框架,旨在为基于J2EE的企业级应用程序提供全面的安全服务。这个框架解决了J2EE规范中安全性配置不便于移植的问题,使得应用程序的安全设置能够在不同服务器环境...

    spring Acegi例子,很简单的一个acegi实例,容易理解

    这个例子是为初学者设计的,旨在帮助他们快速理解和应用Acegi框架。Acegi(现在已被Spring Security替代)在Spring应用程序中提供了身份验证、授权和会话管理等功能。 在Spring Acegi的例子中,我们首先需要了解的...

    使用Acegi作为基于Spring框架的WEB应用的安全框架

    Acegi Security是Spring框架早期的一个安全模块,后来发展成为Spring Security,是Java Web应用程序中广泛使用的安全框架。本文将深入探讨如何将Acegi(或现在的Spring Security)集成到基于Spring的Web应用程序中,...

Global site tag (gtag.js) - Google Analytics