如何在@PreAuthorize注释中传递调用自定义方法的spring句柄
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在@PreAuthorize注释中传递调用自定义方法的spring句柄相关的知识,希望对你有一定的参考价值。
我是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;
}
}
到目前为止一切顺利,一切都很顺利。
我的问题是关于性能,幕后的Spring如何处理在@PreAuthorize()中调用方法,执行任何类型的对象/方法缓存或代理,或者每次通过反射调用方法,以及如何会影响表现吗?
我做了很多搜索,只发现了这个链接,它对我有所帮助,但是你对@PreAuthorize案例有任何进一步的解释吗?
http://spring.io/blog/2007/07/19/debunking-myths-proxies-impact-performance/
希望我的问题很明确,谢谢。
首先,需要解析表达式,然后才能对其进行求值。
作为解析的结果,表达式被转换为SpelNode
s树。特别是,MethodReference
是负责方法调用的SpelNode
。
解析部分在PreInvocationAuthorizationAdvice
中很好地缓存。
有关MethodReference
can实施的详细信息,请点击此处:org.springframework.expression.spel.ast.MethodReference
org.springframework.expression.spel.ast.MethodReference#getValueInternal(...)
org.springframework.expression.spel.support.ReflectiveMethodExecutor
有缓存,java.lang.reflect.Method
引用只评估一次(如果目标对象保持相同类型)。
所以这是Spring可以做的最多的事情。进一步的改进需要字节码生成,这在我看来是一种矫枉过正。
以上是关于如何在@PreAuthorize注释中传递调用自定义方法的spring句柄的主要内容,如果未能解决你的问题,请参考以下文章
Webflux 和 keycloak 使用 jwt 中的方法安全级别 @Preauthorize 自定义声明而不是默认范围
如何在 Spring Boot 应用程序中禁用/忽略 @PreAuthorize
将属性文件或 xml 文件中的属性值注入 PreAuthorize(...) java 注释(未解决)
Spring Boot HttpSecurity - @PreAuthorize - 如何设置 AuthenticationFilter?