2015-03-29 107 views
9

Tôi đang cố gắng để thực hiện phương pháp an ninh sử dụng Java Config, nhưng tôi nhận được một lỗi: -Không resolver đậu đăng ký trong bối cảnh để giải quyết quyền truy cập vào đậu

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

Phương pháp này là: -

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

định nghĩa lớp Config là (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; 
    } 

    ... 
} 

tôi đã kiểm tra mà tôi có thể autowire đậu trong cùng một lớp, tôi cũng tìm thấy phương thức hasPermission() mặc định đang hoạt động như tôi đã triển khai chúng, vấn đề duy nhất là đọc bean từ Spel. Tôi không biết có gì sai. Bất kỳ con trỏ?

Tôi đang sử dụng Spring 4.1.5 và mùa xuân an ninh 3.2.7

Trả lời

11

Bạn cần phải đảm bảo rằng bạn thiết lập các ApplicationContext trên DefaultMethodSecurityExpresssionHandler. Ví dụ:

@Autowired 
private ApplicationContext context; 

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

Ngoài và chính xác hơn, nếu bạn định nghĩa một PermissionEvaluator duy nhất như là một Bean và Xuân An sẽ tự động nhặt nó lên (không cần phải ghi đè expressionHandler()). Ví dụ:

@Bean 
public PermissionEvaluator appPermissionEvaluator() { 
    ... 
} 
Các vấn đề liên quan