Spring security spring如何处理调用@PreAuthorize注释中传递的自定义方法

Spring security spring如何处理调用@PreAuthorize注释中传递的自定义方法,spring-security,Spring Security,我是spring security的新手,最近参与了一个需要执行方法级安全性的项目 我成功地处理了它,如下所示: @Repository public class EmployeeDaoImpl{ @PreAuthorize("@mySecurityService.canAdd('ROLE_ADMIN') ") public void addEmployee(EmployeeEntity employee) { try{ this.ses

我是spring security的新手,最近参与了一个需要执行方法级安全性的项目

我成功地处理了它,如下所示:

 @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;
    }
}
到目前为止,一切都很顺利

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

我做了很多搜索,只找到了这个链接,这对我很有帮助,但是你有针对@PreAuthorize case的进一步解释吗


希望我的问题清楚,谢谢。

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

作为解析的结果,表达式被转换为
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
引用只计算一次(如果目标对象保持相同类型)

因此,这是春天可能完成的最多的一次。进一步的改进需要生成字节码,在我看来这是一种过分的做法