如何在@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/

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

答案

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

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

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

有关MethodReferencecan实施的详细信息,请点击此处: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

使用自定义 bean 测试 PreAuthorize 注释

将属性文件或 xml 文件中的属性值注入 PreAuthorize(...) java 注释(未解决)

Spring Boot HttpSecurity - @PreAuthorize - 如何设置 AuthenticationFilter?

@PreAuthorize 注释以错误的方式解析最后一个变量