`
sqe_james
  • 浏览: 264889 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

基于Java 5 注释的Acegi方法保护

    博客分类:
  • J2EE
阅读更多

使用Java 5 Annotations 方式来实现方法级别的保护,配置文件如下:

<bean id="methodSecurityInterceptor" class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">
   <property name="validateConfigAttributes" value="false" />
   <property name="authenticationManager" ref="authenticationManager" />
   <property name="accessDecisionManager" ref="accessDecisionManager" />
   <property name="objectDefinitionSource">
         <bean class="org.acegisecurity.intercept.method.MethodDefinitionAttributes">
	         <property name="attributes">
	           <!--  利用1.5Annotation的設定方式 -->
	           <bean class="org.acegisecurity.annotation.SecurityAnnotationAttributes" />
	         </property>
           </bean>
  </property>
</bean>

此外,在代码里面必使用Acegi Java 5 Security Annotations 来配置方法的保护属性。下面的例子使用 @Secured 注解来描述配置属性,如下示例:

 

import org.acegisecurity.annotation.Secured;
import org.springframework.transaction.annotation.Transactional;

/**
 * 使用Java 5 注解来实现方法保护
 * 
 * @author Janwer
 *
 */
@Transactional
public interface WebService {
	@Transactional(readOnly=true)
	@Secured({"ROLE_CUSTOMER"})
	List<Subscribe> queryOrderStates(long regId, int subcribeStatus);


	@Transactional(readOnly=true)
	@Secured({"ROLE_MANAGER"})
	List<Subscribe> queryRegSubscribeState(Page page, boolean asc, int subcribeStatus);


	@Secured({"ROLE_CUSTOMER"})
	TransactionResult createSubscribeByAlipay(Map<String,String> m, Register r, int status, String alipayRecord);

}

你可能注意到了 validateConfigAttributes 属性在上面的 MethodSecurityInterceptor 示例中,当设置为 true (the default) ,在启动时 MethodSecurityInterceptor 将验证提供的所有配置属性是否有效。它每个配置属性的检查能通过 AccessDecisionManager RunAsManager 来处理。假如它们都不能处理这些配置属性,那么一个异常将会被抛出。如果使用 Jakarta Commons 属性配置方法, 你应该将 validateConfigAttributes 设置为 false

 


注意:其实使用Java 5 的注释也应该设置为false ,否则在程序启动时,将有一个警告产生。并不影响它的正常使用。

WARN [org.acegisecurity.intercept.AbstractSecurityInterceptor.afterPropertiesSet:225]- Could not validate configuration attributes as the MethodDefinitionSource did not return a ConfigAttributeDefinition Iterator


请注意,当使用 BeanNameAutoProxyCreator 为安全过滤创建请求代理时,如果使用基于 CGLIB 的代理,那配置文件应当包含 proxyTargetClass 属性并设置为 true 。否则方法保护将不起作用。引用的是代理的呼叫,而不是实际代理的对象。注意采用这种方式需要 CGLIB 。如果直接使用 JDK1.5 动态代理时,可以注释掉这一属性,见如下示例:

<!-- 利用Spring的自动代理功能实现AOP代理 -->
<bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
  <property name="interceptorNames">
       <list>
	  <value>methodSecurityInterceptor</value>
       </list>
  </property>
  <property name="beanNames">
       <list>
	 <!--  需要保护的方法  -->
	 <value>registerService</value>
	 <value>mgrService</value>
	 <value>subService</value>
	 </list>
   </property>
   <!--property name="proxyTargetClass" value="true"/-->
</bean>

注意:上面是引用Acegi 官方文档描述,但在我的实际使用中,因为我用的是Spring 2.0.6 且使用基于 JDK1.5 的动态代理,所以不再需要proxyTargetClass 属性设置。当然如是使用 CGLIB 代理的就按官方说明来设置。

 

分享到:
评论
5 楼 nurenok 2009-11-26  
取消XML全部配置注解  就好了
4 楼 sqe_james 2008-09-11  
不好意思较长时间没来这里了,看了你的异常,好像是没有找到相应匹配的转换策略。估计你的 FilterSecurityInterceptor 安全拦截器没有配置或有误。
你在 @Secured() 里标注的安全角色,应该在 FilterSecurityInterceptor 有相应的配置。

引用
请问sqe_james,为什么我的service中如:
# 需要保护的方法
<value>registerService</value>


加了@Secured({"ROLE_CUSTOMER"})后报这个错
no matching editors or conversion strategy found


Error creating bean with name '/users' defined in ServletContext resource [/WEB-INF/userContext.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.TypeMismatchException: Failed to convert property value of type [$Proxy9] to required type [com.lottery.DAO.LotteryUsersDAOImpl] for property 'lotteryUsersDAOImpl'; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [$Proxy9] to required type [com.lottery.DAO.LotteryUsersDAOImpl] for property 'lotteryUsersDAOImpl': no matching editors or conversion strategy found
Caused by:


请指教!!!
3 楼 anson_xu 2008-09-01  
请问sqe_james,为什么我的service中如:
# 需要保护的方法
<value>registerService</value>


加了@Secured({"ROLE_CUSTOMER"})后报这个错
no matching editors or conversion strategy found


Error creating bean with name '/users' defined in ServletContext resource [/WEB-INF/userContext.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.TypeMismatchException: Failed to convert property value of type [$Proxy9] to required type [com.lottery.DAO.LotteryUsersDAOImpl] for property 'lotteryUsersDAOImpl'; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [$Proxy9] to required type [com.lottery.DAO.LotteryUsersDAOImpl] for property 'lotteryUsersDAOImpl': no matching editors or conversion strategy found
Caused by:


请指教!!!
2 楼 sqe_james 2008-04-20  
请问你是在哪一层进行方法保护的?是Controller层还是Service层?可以把你的配置贴上来?如果配置正确的话,不用开启<context:annotation-config />和<aop:aspectj-autoproxy />就能生效的。
1 楼 kv0002 2008-04-19  
按照楼主的方法配置了基于annotation的acegi,也就是在接口的方法上定义@Secured,然后在loginController中分配角色:

// 把登录者的角色信息放在acegi中
List<GrantedAuthority> gas = new ArrayList<GrantedAuthority>();
GrantedAuthority ga = new GrantedAuthorityImpl(RoleIds.ROLE_LBLOG_ADMIN);
gas.add(ga);

GrantedAuthority ga2 = new GrantedAuthorityImpl(RoleIds.ROLE_LBLOG_OPER);
gas.add(ga2);

Authentication auth = new UsernamePasswordAuthenticationToken(user
.getUserName(), null, gas.toArray(new GrantedAuthority[gas.size()]));
SecurityContextHolder.getContext().setAuthentication(auth);

但是在实际调用被@Secured注释的方法时,acegi没有起半点左右,没有设置角色的用户也能调用该方法,我在SPRING配置中,已经开启了<context:annotation-config />
和<aop:aspectj-autoproxy />,但是怎么没有效果呢?

相关推荐

    基于java的ACEGI

    AceGI,全称为Acegi Security,是Java领域中一个用于Spring框架的安全组件,它提供了全面的身份验证、授权和会话管理功能。这个框架在早期的Spring版本中非常流行,为开发者构建安全的Web应用程序提供了强大的支持。...

    Java安全模型acegi

    Java安全模型是Java平台上的一个核心概念,它定义了如何保护应用程序免受恶意代码的攻击,确保只有授权的用户和程序能够访问敏感资源。Acegi是Spring框架的一个早期安全模块,后来演变为Spring Security,是Java企业...

    基于rbac模式的acegi权限管理

    Acegi Security是Spring框架的一个扩展,它为Java应用程序提供了全面的安全性解决方案。在Acegi中,RBAC模式被用于构建一个灵活且可扩展的权限管理系统。下面我们将详细介绍Acegi Security与RBAC的结合以及在Spring...

    敏捷Acegi、CAS++构建安全的Java系统——part5

    敏捷Acegi、CAS++构建安全的Java系统pdf——part5

    Acegi保护Java 应用程序

    在本文中,我们将深入探讨Acegi安全框架的核心概念、工作原理以及如何在实际项目中使用它来保护我们的Java应用。 首先,Acegi(现已被Spring Security替代)是一个基于Spring的全面安全解决方案,它允许开发者在不...

    敏捷Acegi、CAS构建安全的Java系统(part2)共四part

    JAVA开发专家:敏捷Acegi、CAS:构建安全的Java系统 pdf

    acegi保护业务方法_basedMemory

    这个“acegi保护业务方法_basedMemory”主题可能是关于如何使用Acegi Security来保护应用程序中的特定业务方法,特别是那些处理敏感数据或关键操作的方法。在这个场景下,“basedMemory”可能指的是基于内存的认证和...

    acegi保护业务方法_basedDatabase

    在"acegi保护业务方法_basedDatabase"这个主题中,我们主要探讨如何使用Acegi Security来保护基于数据库的业务方法,确保只有授权的用户才能访问特定的业务功能。 首先,我们需要了解Acegi Security的核心概念。...

    Acegi 保护 Java 应用程序

    这份共分三部分的系列文章介绍了 Acegi 安全系统(Acegi Security System),它是用于 JavaTM 企业应用程序的强大的开源安全框架。...您介绍 Acegi 的架构和组件,并展示如何使用它来保护一个简单的 Java 企业应用程序。

    使用 Acegi 保护 Java 应用程序: 续二

    在"使用 Acegi 保护 Java 应用程序:续二"这篇博文中,作者可能详细介绍了如何集成 Acegi 安全框架到 Java 应用程序中,以及如何配置和定制其安全策略。以下是对 Acegi 安全框架及其应用的一些关键知识点的详解: 1...

    使用 Acegi 保护 Java 应用程序: 续一

    本篇文章是“使用 Acegi 保护 Java 应用程序”系列的续篇,旨在深入探讨 Acegi 的使用方法。在前一篇文章中,我们可能已经介绍了 Acegi 的基本概念和安装步骤。在这里,我们将更进一步,讨论如何配置和实现 Acegi 的...

    acegi

    Acegi 是一个在Java开发领域,特别是Spring框架中曾经广泛使用的安全组件,全称为Acegi Security。这个系统为Spring应用程序提供了全面的安全管理解决方案,包括身份验证、授权、会话管理以及安全事件处理等功能。...

    Acegi学习笔记(JAVA系统安全编程时用到)

    Acegi 是一个强大的 Java 安全框架,专用于系统安全编程,尤其在处理认证和授权方面表现出色。在本文中,我们将深入探讨 Acegi 的基本概念、如何设置以及它如何与 Spring 框架集成。 首先,让我们了解 Acegi 的核心...

    使用 Acegi 保护 Java 应用程序: 续三

    总之,Acegi 是一个强大的安全框架,它提供了丰富的工具和策略来保护 Java 应用程序。通过深入学习和应用 Acegi,开发者可以创建高度安全的应用,同时保持灵活性和可扩展性。在续三部分中,可能还会涉及更多高级话题...

    基于spring的Acegi安全框架认证与授权的分析及扩展.pdf

    Acegi的设计理念旨在解决传统Java认证和授权服务(JAAS)中存在的不足,如政策文件难以管理和用户权限无法根据对象状态动态调整等问题。 #### 2. Acegi安全框架的核心组件分析 Acegi的安全框架由多个核心组件构成...

    ACEGI

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

    实战Acegi:使用Acegi作为基于Spring框架的WEB应

    在Java Web开发领域,Spring框架以其强大的功能和灵活性深受开发者喜爱。...虽然Acegi Security已被Spring Security取代,但其核心理念和实践方法对于理解和掌握现代Web应用安全仍具有重要的参考价值。

    Acegi例子代码+一个很好的学习Acegi的网址

    它可以基于角色、URL、方法或者更复杂的规则进行控制。 3. **会话管理(Session Management)**:Acegi提供了会话管理功能,可以防止会话固定攻击(Session Fixation),并支持会话超时和并发会话控制。 4. **过滤...

Global site tag (gtag.js) - Google Analytics