2010-10-19 4 views
2

Nous avons une application où les utilisateurs ayant des droits de proxy doivent pouvoir voir les liens dans une application.Spring Security 2.0.x - Filtre basé sur le type de rôle + État du bean basé sur la session

Par exemple, nous pourrions avoir:

<s:intercept-url pattern="/resourceManager.htm" access=" ROLE_ADMIN_GROUP, ROLE_PROXY"/> 

Si l'utilisateur a le rôle de procuration, mais pas le rôle d'administrateur, je dois les présenter avec une page leur disant qu'ils doivent être en proxy mode pour voir cette page. De plus, j'ai besoin de vérifier les permissions de l'utilisateur auquel ils sont mandatés, pour vérifier qu'ils ont le bon rôle.

Nous avons plusieurs pages, donc j'aimerais faire cette logique dans un filtre, afin que nous puissions appliquer la logique à travers le tableau.

Je me moque de ce code pseudo alors que je continue à chercher.

class Filter 
{ 

protected void doFilterHttp() 
{ 

    //proxy summary is session based object 
    if(proxySummary.isProxyMode()) 
    { 
    user = proxySummary.getProxiedUser() 
    //here load user's authorities 
    //will have to look at ldap authorities populator, but I should be able to work this part out 
    } 
    if(user.getGrantedAuthorities.contains("Role_Proxy")) 
    { 

    //Is there any way to tell possible valid roles for a url? 
    if(url.getPossibleRoles() intersect user.getGrantedAuthorities().size == 1 &&  
     intersection.contains(Role_Proxy)) 
     { redirectToProxyPage(); } 
    } 

} 

Quelle est la meilleure façon d'obtenir des métadonnées pour l'URL à laquelle j'essaie d'accéder?

S'il n'y a aucun moyen d'obtenir des informations sur tous les rôles autorisés pour une URL, alors j'imagine que je devrais le faire à la page.

La mise à niveau vers Spring Security 3 me donnerait-elle plus de flexibilité?

+0

J'implémente l'intercepteur de filtre de sécurité ci-dessus avec un runAsManager personnalisé (techniquement runAsProxy). Il semble se comporter comme prévu, mais je dois m'assurer que je ne fais rien qui puisse causer des problèmes de performance. Va poster un code si ça marche. – Scott

Répondre

0

J'ai fini par créer une implémentation runAsManager qui s'exécutait en tant qu'utilisateur proxy en mode proxy. Sinon, si l'utilisateur n'avait qu'un rôle de proxy pour le lien, ils ont été redirigés. RunAsManager n'a modifié que l'objet d'authentification en mode proxy.

J'ai inclus des extraits de chaque classe, afin de ne pas rendre le message trop long.

RunAsProxy Snippet

public Authentication buildRunAs(Authentication authentication, Object object, 
     ConfigAttributeDefinition config) { 

      //probably need to do something to cache the proxied user's roles 
    if(proxySummary.isProxyMode()) 
    { 
    SpringSecurityLdapTemplate template = new SpringSecurityLdapTemplate(contextSource); 
    String dn = proxySummary.getLoggedInUser(); 

    String [] tmp = { "uid", "cn" }; 
    DirContextOperations user = template.retrieveEntry(dn, tmp); 


    GrantedAuthority[] proxiedAuthorities = authoritiesPopulator.getGrantedAuthorities(user, user.getStringAttribute("cn").toString()); 

    return new RunAsUserToken(this.key, authentication.getPrincipal(), authentication.getCredentials(), 
      proxiedAuthorities, authentication.getClass()); 

    } 

    return null; 



} 

code Interceptor -> étend AbstractSecurityInterceptor implémente le filtre, Ordonné

public void invoke(FilterInvocation fi) throws IOException, ServletException { 

//same code as from proxy security interceptor here ... 

          //config attributes are the roles assigned to a link 
        ConfigAttributeDefinition cad = ((DefaultFilterInvocationDefinitionSource)objectDefinitionSource).lookupAttributes(fi.getRequestUrl()); 
        if(cad != null) 
        { 
         HashSet<String> configAttributes = new HashSet<String>(); 
         for(Object ca: cad.getConfigAttributes()) 
         { 
          configAttributes.add(((ConfigAttribute)ca).getAttribute()); 
         } 

         SecurityContext sc = SecurityContextHolder.getContext(); 
         HashSet<String> authorities = new HashSet<String>(); 
         for(GrantedAuthority ga: sc.getAuthentication().getAuthorities()) 
         { 
          authorities.add(ga.getAuthority()); 
         } 

         //intersection and remaining available roles to determine 
            //if they just have the proxy role 
         authorities.retainAll(configAttributes); 
         if(authorities.size() == 1 && authorities.contains("ROLE_PROXY")) 
         { 

            //redirect to page telling them to proxy 
                  ((HttpServletResponse)fi.getResponse()).sendRedirect("jsp/doProxy.jsp"); 
         } 


        //System.out.println(cad); 
        fi.getRequest().setAttribute(FILTER_APPLIED, Boolean.TRUE); 
       //other boilderplate code      
     } 

Setup Spring

<bean id="proxySecurityInterceptor" class="org.springframework.security.intercept.web.ProxySecurityInterceptor"> 
    <property name="authenticationManager" ref="authenticationManager"/> 
    <property name="accessDecisionManager" ref="_accessManager"/> 
    <property name="proxySummary" ref="proxySummary" /> 
    <property name="runAsManager" ref="runAsProxy" /> 
    <property name="objectDefinitionSource"> 
    <s:filter-invocation-definition-source> 
    <s:intercept-url pattern="/groupManager.htm*" access="ROLE_GLOBAL_ADMIN, ROLE_ADMIN_GROUP, ROLE_PROXY"/> 
    </s:filter-invocation-definition-source> 
    </property> 
    <s:custom-filter after="FILTER_SECURITY_INTERCEPTOR" /> 
</bean> 
Questions connexes