如何在@PreAuthorize注释中传递调用自定义方法的spring句柄

时间:2015-06-15 16:20:28

标签: spring-security

我是Spring安全新手,最近开发了一个需要进行方法级安全性的项目。

我设法像下面那样处理它:

 @Repository
public class EmployeeDaoImpl{
    @PreAuthorize("@mySecurityService.canAdd('ROLE_ADMIN') ")
    public void addEmployee(EmployeeEntity employee) {
        try{
            this.sessionFactory.getCurrentSession().save(employee);         
        }catch(AccessDeniedException e){

        }
    }
}

    @Component
public class MySecurityService {

    public boolean canAdd(String user) {
        System.out.println("Entered has permission..........");
        if(user.equals("ROLE_ADMIN")){
            return false;
        }
        return false;
    }
}
到目前为止一切顺利,外表工作得非常顺利。

我的问题是关于性能,幕后弹簧如何处理调用@PreAuthorize()中的方法,执行任何类型的对象/方法缓存或代理,或者每次通过反射调用方法,以及这将如何影响性能?

我做了很多搜索,只找到了这个链接,它对我有所帮助,但你是否对@PreAuthorize案例有任何进一步的解释。

http://spring.io/blog/2007/07/19/debunking-myths-proxies-impact-performance/

希望我的问题很明确,谢谢。

1 个答案:

答案 0 :(得分:0)

首先,需要解析表达式,然后才能对其进行求值。

作为解析的结果,表达式将转换为SpelNode s的树。特别是,MethodReference是负责方法调用的SpelNode

解析部分在PreInvocationAuthorizationAdvice中很好地缓存。

MethodReference的实施细节可以在这里找到: org.springframework.expression.spel.ast.MethodReference org.springframework.expression.spel.ast.MethodReference#getValueInternal(...) org.springframework.expression.spel.support.ReflectiveMethodExecutor

存在缓存,java.lang.reflect.Method引用仅评估一次(如果目标对象保持相同类型)。

所以这是Spring可以做的最多的事情。进一步的改进需要字节码生成,这在我看来是一种矫枉过正。