Spring security spring如何处理调用@PreAuthorize注释中传递的自定义方法
我是spring security的新手,最近参与了一个需要执行方法级安全性的项目 我成功地处理了它,如下所示: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
@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
引用只计算一次(如果目标对象保持相同类型)
因此,这是春天可能完成的最多的一次。进一步的改进需要生成字节码,在我看来这是一种过分的做法