2010-07-24 7 views
2

La sécurité HTTP fonctionne dans mon application Web avec l'authentification CAS à l'aide de Spring Security. Cependant, j'essaie de le mélanger avec la sécurité au niveau de la méthode pour certaines méthodes de service (en particulier GWT RPC), mais cela ne semble pas fonctionner. Il arrive au point où il exécute l'annotation @PostAuthorize. Cependant, il ne semble pas faire attention à la configuration que j'ai et exécute une autre manière qui refuse l'accès à l'objet retourné.Niveau de sécurité du niveau de sécurité de sécurité dans l'application HTTP

Réduire deployerConfigContext.xml lu par org.springframework.web.context.ContextLoaderListe ner listener.

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:security="http://www.springframework.org/schema/security" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="schemaURLs here"> 

<security:http use-expressions="true" 
    entry-point-ref="casProcessingFilterEntryPoint"> 
    <security:intercept-url pattern="/casfailed.jsp" 
    requires-channel="any" access="permitAll" /> 
    <security:intercept-url pattern="/cas-logout.jsp" 
    requires-channel="any" access="permitAll" /> 
    <security:intercept-url pattern="/**" 
    access="isAuthenticated()" requires-channel="https" /> 
    <security:logout logout-success-url="/cas-logout.jsp" /> 
    <security:custom-filter ref="casAuthenticationFilter" 
    after="CAS_FILTER" /> 
</security:http> 

<security:authentication-manager alias="authenticationManager"> 
    <security:authentication-provider 
    ref="casAuthenticationProvider" /> 
</security:authentication-manager> 

<!-- setup method level security using annotations --> 
<security:global-method-security 
    jsr250-annotations="disabled" secured-annotations="enabled" 
    pre-post-annotations="enabled"> 
    <security:expression-handler ref="expressionHandler" /> 
</security:global-method-security> 

<bean id="expressionHandler" 
    class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler"> 
    <property name="permissionEvaluator" ref="permissionEvaluator" /> 
</bean> 

<bean id="permissionEvaluator" 
    class="org.springframework.security.acls.AclPermissionEvaluator"> 
    <constructor-arg ref="aclService" /> 
</bean> 

<bean id="aclService" 
    class="my.custom.AclService"> 
    <constructor-arg> 
    <bean class="org.springframework.security.acls.domain.ConsoleAuditLogger" /> 
    </constructor-arg> 
    <constructor-arg> 
    <bean 
    class="org.springframework.security.acls.domain.AclAuthorizationStrategyImpl"> 
    <constructor-arg> 
    <list> 
     <bean 
     class="org.springframework.security.core.authority.GrantedAuthorityImpl"> 
     <constructor-arg value="ROLE_ADMINISTRATOR" /> 
     </bean> 
     <bean 
     class="org.springframework.security.core.authority.GrantedAuthorityImpl"> 
     <constructor-arg value="ROLE_ADMINISTRATOR" /> 
     </bean> 
     <bean 
     class="org.springframework.security.core.authority.GrantedAuthorityImpl"> 
     <constructor-arg value="ROLE_ADMINISTRATOR" /> 
     </bean> 
    </list> 
    </constructor-arg> 
    </bean> 
    </constructor-arg> 
</bean> 

<bean 
    class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 

<tx:annotation-driven transaction-manager="transactionManager" /> 

<bean id="systemEMF" 
    class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="_persistenceunit_" /> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="systemEMF" /> 
</bean> 
</beans> 

Le haricot pour mon AclService est créé, mais rien après est exécuté en elle (je vous connecter à chaque méthode). Je ne suis même pas sûr que l'expression haricot Handler est utilisée. Ai-je besoin de déplacer quelque chose dans la sécurité: section http?

est ici la section du journal de débogage où il est exécuté:

2010-07-23 17:39:17,885 [org.springframework.security.access.prepost.PrePostAnnotationSecurityMetadataSource] DEBUG: @org.springframework.security.access.prepost.PostAuthorize(value=hasPermission(filterObject,'read')) found on specific method: public ReturnType my.rpc.RPCClass.getObject(java.lang.Long) 
    2010-07-23 17:39:17,885 [org.springframework.security.access.method.DelegatingMethodSecurityMetadataSource] DEBUG: Adding security method [CacheKey[my.rpc.RPCClass; public abstract ReturnType my.rpc.RPCClass.getObject(java.lang.Long)]] with attributes [[authorize: 'permitAll', filter: 'null', filterTarget: 'null'], [authorize: 'hasPermission(filterObject,'read')', filter: 'null']] 
    2010-07-23 17:39:17,885 [org.springframework.transaction.annotation.AnnotationTransactionAttributeSource] DEBUG: Adding transactional method 'getObject' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; '',-java.lang.Throwable 
    2010-07-23 17:39:17,886 [org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor] DEBUG: Secure object: ReflectiveMethodInvocation: public abstract ReturnType my.rpc.RPCClass.getObject(java.lang.Long); target is of class [my.rpc.RPCClass]; Attributes: [[authorize: 'permitAll', filter: 'null', filterTarget: 'null'], [authorize: 'hasPermission(filterObject,'read')', filter: 'null']] 
    2010-07-23 17:39:17,886 [org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor] DEBUG: Previously Authenticated: org.spr[email protected]eeb49577: Principal: [email protected]: Username: kevin.jordan; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_USER; Password: [PROTECTED]; Authenticated: true; Details: org.sprin[email protected]0: RemoteIpAddress: 192.168.0.16; SessionId: HZFBB0B9768A164833B6C659177874FC9C; Granted Authorities: ROLE_USER Assertion: [email protected] Credentials (Service/Proxy Ticket): ST-27-lUehDttiUOLU041sBEio-cas 
    2010-07-23 17:39:17,890 [org.springframework.security.access.vote.AffirmativeBased] DEBUG: Voter: org.springframework.securi[email protected], returned: 1 
    2010-07-23 17:39:17,890 [org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor] DEBUG: Authorization successful 
    2010-07-23 17:39:17,890 [org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor] DEBUG: RunAsManager did not change Authentication object 
    2010-07-23 17:39:17,890 [org.springframework.beans.factory.support.DefaultListableBeanFactory] DEBUG: Returning cached instance of singleton bean 'transactionManager' 
    2010-07-23 17:39:17,890 [org.springframework.orm.jpa.JpaTransactionManager] DEBUG: Creating new transaction with name [my.rpc.RPCClass.getObject]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; '',-java.lang.Throwable 
    2010-07-23 17:39:17,891 [org.springframework.orm.jpa.JpaTransactionManager] DEBUG: Opened new EntityManager [[email protected]] for JPA transaction 
    2010-07-23 17:39:18,333 [org.springframework.orm.jpa.JpaTransactionManager] DEBUG: Initiating transaction commit 
    2010-07-23 17:39:18,339 [org.springframework.orm.jpa.JpaTransactionManager] DEBUG: Committing JPA transaction on EntityManager [[email protected]] 
    2010-07-23 17:39:18,342 [org.springframework.orm.jpa.JpaTransactionManager] DEBUG: Closing JPA EntityManager [[email protected]] after transaction 
    2010-07-23 17:39:18,342 [org.springframework.orm.jpa.EntityManagerFactoryUtils] DEBUG: Closing JPA EntityManager 
    2010-07-23 17:39:18,343 [org.springframework.security.access.expression.method.ExpressionBasedPostInvocationAdvice] DEBUG: PostAuthorize expression rejected access 

Si quelqu'un a besoin d'informations à partir de quand il commence ou quoi que ce soit me le faire savoir. Merci de votre aide!

Répondre

0

Vos appels ne sont probablement pas interceptés par un proxy AOP, car les méthodes sont appelées directement (voir 7.6.1 Understanding AOP proxies). C'est définitivement le cas si vous annotez les méthodes du RemoteServiceServlet lui-même.

Vous devez soit annoter les méthodes des beans de service appelés à partir du RemoteServiceServlet, soit utiliser spring4gwt.

+0

Je n'appelle pas les beans de service. J'essaie de sécuriser la méthode GWT RPC. Dans ce cas, avec un @PostAuthorize ("hasPermission (filterObject, 'read')"). Le problème est qu'il ne semble pas utiliser aucun de mes objets de service ACL. Cela nie automatiquement. – kjordan

0

Et apparemment, c'est parce que j'utilisais filterObject quand, pour cela, ça devrait être returnObject.