我是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/
希望我的问题很明确,谢谢。
答案 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可以做的最多的事情。进一步的改进需要字节码生成,这在我看来是一种矫枉过正。