2015-03-29 10 views
9

Sto cercando di implementare la sicurezza metodo che utilizza Java Config, ma sto ottenendo un errore: -No resolver fagioli registrati nel contesto di risolvere l'accesso ai fagioli

org.springframework.expression.spel.SpelEvaluationException: EL1057E:(pos 1): No bean resolver registered in the context to resolve access to bean 'appPermissionEvaluator' 

Il metodo è il seguente: -

@PreAuthorize("@appPermissionEvaluator.hasSystemPermission()") 
public String something() { 
    ... 
} 

la definizione della classe Config è (MethodSecurityConfig.java): -

@Configuration 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration { 

    @Bean 
    public AppPermissionEvaluator appPermissionEvaluator() { 
     return new AppPermissionEvaluator(); 
    } 

    @Override 
    protected MethodSecurityExpressionHandler createExpressionHandler() { 
     DefaultMethodSecurityExpressionHandler expressionHandler = 
       new DefaultMethodSecurityExpressionHandler(); 
     expressionHandler.setPermissionEvaluator(appPermissionEvaluator()); 
     return expressionHandler; 
    } 

    ... 
} 

ho controllato che sono in grado di autowire il fagiolo nella stessa classe, ho anche scoperto che i metodi predefiniti hasPermission() funzionano come li ho implementati, l'unico problema è la lettura del bean da SpEL. Non sono sicuro di cosa c'è che non va. Eventuali puntatori?

sto usando primavera 4.1.5 e molla di sicurezza 3.2.7

risposta

11

È necessario assicurarsi di aver impostato l'ApplicationContext sul DefaultMethodSecurityExpresssionHandler. Per esempio:

@Autowired 
private ApplicationContext context; 

@Override 
protected MethodSecurityExpressionHandler expressionHandler() { 
    DefaultMethodSecurityExpressionHandler expressionHandler = 
      new DefaultMethodSecurityExpressionHandler(); 
    expressionHandler.setPermissionEvaluator(appPermissionEvaluator()); 
    handler.setApplicationContext(context); 
    return handler; 
} 

alternativa e più conciso, se si definisce un singolo PermissionEvaluator come Bean e sicurezza primavera sarà automaticamente raccoglierlo (nessuna necessità di sovrascrivere expressionHandler()). Ad esempio:

@Bean 
public PermissionEvaluator appPermissionEvaluator() { 
    ... 
} 
Problemi correlati