【问题标题】:Spring security ACL, @Secured annotationsSpring 安全 ACL,@Secured 注解
【发布时间】:2010-09-21 08:46:41
【问题描述】:

我目前遇到了spring security问题,我一直在关注最后两个参考on the spring security article page的教程

使用org.springframework.security.access.annotation.Secured 保护的方法似乎不会触发任何 Spring Security 逻辑。

这是我的测试文件:

 public class AclServiceTest {

 @Autowired
 PersonDataOnDemand pdod;

 @Autowired
 MyAclService aclService;

 UserDetailsService uds = new MyUserDetailsService();

 @Test
 public void testWriteResourceAnnotation(){
  Person p0 = pdod.getSpecificPerson(0);
  Person p1 = pdod.getSpecificPerson(1);

  Assert.isTrue(!p0.getId().equals(p1.getId()));

  Resource r = new Resource(p0.getSite(), p0, p0.getPrivateFolder());

  authenticatePerson(p0);
  securedWriteResource(r);

  authenticatePerson(p1);
  try{
   securedWriteResource(r);
   fail();
  } catch(Exception e){

  }
 }


 @Secured("ACL_RESOURCE_WRITE")
 public void securedWriteResource(Resource r){
  return;  
 }

 private void authenticatePerson(Person p){
  UserDetails ud = uds.loadUserByUsername(p.getEmail());
  SecurityContextHolder.getContext().setAuthentication(new RunAsUserToken("user-"+p.getId(), ud, p.getPassword(), ud.getAuthorities().toArray(new GrantedAuthority[0]), null));
 }
}

如果将以下行添加到我的web.xml

<!--Spring security filter-->
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

这是我使用的 bean 的 security.xml 配置:

<?xml version="1.0" encoding="UTF-8"?>

<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                    http://www.springframework.org/schema/security
                    http://www.springframework.org/schema/security/spring-security-3.0.xsd" >

<beans:bean id="ehCacheBasedAclCache" class="org.springframework.security.acls.domain.EhCacheBasedAclCache">
    <beans:constructor-arg>
        <beans:bean class="org.springframework.cache.ehcache.EhCacheFactoryBean">
            <beans:property name="cacheManager">
                <beans:bean class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"/>
            </beans:property>
            <beans:property name="cacheName" value="aclCache"/>
        </beans:bean>
    </beans:constructor-arg>
</beans:bean>


<!-- 
   Partie gestion de la business logic ACL
 -->

<global-method-security secured-annotations="enabled" access-decision-manager-ref="businessAccessDecisionManager"/>

<beans:bean id="businessAccessDecisionManager" class="org.springframework.security.access.vote.UnanimousBased">
    <beans:property name="allowIfAllAbstainDecisions" value="false"/>
    <beans:property name="decisionVoters">
        <beans:list>
            <beans:ref local="roleVoter"/>
            <beans:ref local="aclResourceReadVoter"/>
            <beans:ref local="aclResourceWriteVoter"/>
            <beans:ref local="aclResourceDeleteVoter"/>
            <beans:ref local="aclResourceAdminVoter"/>
        </beans:list>
    </beans:property>
</beans:bean>

<beans:bean id="roleVoter" class="org.springframework.security.access.vote.RoleVoter"/>

<beans:bean id="aclResourceReadVoter" class="org.springframework.security.acls.AclEntryVoter">
    <beans:constructor-arg ref="jdbcMutableAclService"/>
    <beans:constructor-arg value="ACL_RESOURCE_READ"/>
    <beans:constructor-arg>
        <beans:list>
            <beans:ref local="administrationPermission"/>
            <beans:ref local="readPermission"/>
        </beans:list>
    </beans:constructor-arg>
    <beans:property name="processDomainObjectClass" value="myapp.models.Resource"/>
    <beans:property name="internalMethod" value="getRootFolder"/>
</beans:bean>

<beans:bean id="aclResourceWriteVoter" class="org.springframework.security.acls.AclEntryVoter">
    <beans:constructor-arg ref="jdbcMutableAclService"/>
    <beans:constructor-arg value="ACL_RESOURCE_WRITE"/>
    <beans:constructor-arg>
        <beans:list>
            <beans:ref local="administrationPermission"/>
            <beans:ref local="writePermission"/>
        </beans:list>
    </beans:constructor-arg>
    <beans:property name="processDomainObjectClass" value="myapp.models.Resource"/>
    <beans:property name="internalMethod" value="getRootFolder"/>
</beans:bean>

<beans:bean id="aclResourceDeleteVoter" class="org.springframework.security.acls.AclEntryVoter">
    <beans:constructor-arg ref="jdbcMutableAclService"/>
    <beans:constructor-arg value="ACL_RESOURCE_DELETE"/>
    <beans:constructor-arg>
        <beans:list>
            <beans:ref local="administrationPermission"/>
            <beans:ref local="deletePermission"/>
        </beans:list>
    </beans:constructor-arg>
    <beans:property name="processDomainObjectClass" value="myapp.models.Resource"/>
    <beans:property name="internalMethod" value="getRootFolder"/>
</beans:bean>

<beans:bean id="aclResourceAdminVoter" class="org.springframework.security.acls.AclEntryVoter">
    <beans:constructor-arg ref="jdbcMutableAclService"/>
    <beans:constructor-arg value="ACL_RESOURCE_ADMIN"/>
    <beans:constructor-arg>
        <beans:list>
            <beans:ref local="administrationPermission"/>
        </beans:list>
    </beans:constructor-arg>
    <beans:property name="processDomainObjectClass" value="myapp.models.Resource"/>
    <beans:property name="internalMethod" value="getRootFolder"/>
</beans:bean>


<beans:bean id="administrationPermission" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
    <beans:property name="staticField" value="org.springframework.security.acls.domain.BasePermission.ADMINISTRATION"/>
</beans:bean>

<beans:bean id="readPermission" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
     <beans:property name="staticField" value="org.springframework.security.acls.domain.BasePermission.READ"/>
</beans:bean>

<beans:bean id="writePermission" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
    <beans:property name="staticField" value="org.springframework.security.acls.domain.BasePermission.WRITE"/>
</beans:bean>

<beans:bean id="deletePermission" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
    <beans:property name="staticField" value="org.springframework.security.acls.domain.BasePermission.DELETE"/>
</beans:bean>

businessAccessDecisionManager bean 被创建并被赋予投票者,但决不调用该方法。

有人知道出了什么问题吗?

感谢您的帮助。

【问题讨论】:

    标签: annotations spring-security acl


    【解决方案1】:

    我发现&lt;global-method-security ../&gt; 没有插入到正确的 xml 文件中。有关详细信息,请参阅here。这个文件恰好是我 Roo 项目中的 webmvc-config.xml。

    这引发了几个问题,我需要 ACL 的 SpEL,所以我最终确定了这个配置:

    <bean class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler" id="methodExprHandler">
        <property name="permissionEvaluator" ref="aclPermissionEvaluator" />
    </bean>
    <bean class="org.springframework.security.acls.AclPermissionEvaluator" id="aclPermissionEvaluator">
        <constructor-arg ref="jdbcMutableAclService" />
    </bean>
    
    
    <security:global-method-security pre-post-annotations="enabled">
        <security:expression-handler ref="methodExprHandler"/>
    </security:global-method-security>
    

    没有投票者授权逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-08
      • 2014-03-09
      • 2015-09-20
      • 1970-01-01
      • 2020-01-26
      • 2016-07-18
      • 2013-08-07
      • 1970-01-01
      相关资源
      最近更新 更多