spring - 在 Spring @PreAuthorize 中调用私有(private)方法

标签 spring spring-mvc spring-security

我正在使用 Spring Security 对方法进行权限检查。我想调用一个私有(private)方法来收集一些数据发送到 hasPermission() 方法。以下是我尝试执行的操作,我得到 SpelEvaluationException,因为 Spring 正在 MethodSecurityExpressionRoot 中寻找 localPrivateMethod。有没有办法做到这一点?谢谢。

@PreAuthorize("hasPermission(new Object[]{#arg3, #localPrivateMethod(#arg1,#arg2)}, 'canDoThis')")  
public long publicMethod1(long arg1, long arg2, long arg3) {}

private String localPrivateMethod(long a1, long a2) {}

最佳答案

您将无法调用私有(private)方法,但可以调用另一个 Spring bean 中的方法。在我的应用程序中,我有一个名为 permissionEvaluator 的 @Component。然后我像这样在@PreAuthorize 中引用它:

@PreAuthorize("@permissionEvaluator.canViewImageSet( #imageSet, principal )")
@RequestMapping(value="/image", method=RequestMethod.GET )
public String getImage(
        @RequestParam(value="imageSet", required=false) ImageSet imageSet ) {
    // method body
}

PermissionEvaluatorImpl 看起来像这样:

@Component(value="permissionEvaluator")
public class PermissionEvaluatorImpl implements PermissionEvaluator
{
    public PermissionEvaluatorImpl() {}

    /**
     * Determine if a user can view a given image.
     */
    public boolean canViewImageSet( ImageSet imageSet, UserDetailsAdapter user )
    {
        // code to see if they should view this image
    }
}

PermissionEvaluator 是我自己的接口(interface),没有什么特别之处,只是我需要评估的任何方法。

关于spring - 在 Spring @PreAuthorize 中调用私有(private)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18470479/

相关文章:

spring - 使用 Spring Security ACL 向现有对象身份授予权限

spring - 如何在 Spring Boot REST API 中捕获 AccessDeniedException

java - "session"Web 应用程序中的 bean 作用域 - 可靠吗?

grails - 无法在Grails中正确登录

java - 如何在 CrudRepository 上使用 findAll() 返回 List 而不是 Iterable

java - Spring MVC 返回 404

java - 使用 REST 和 Javaconfig 在 Spring Security 中摘要验证

java - 使用 spring 模板的 pom.xml 中的 Maven 错误

java - 不要在 Spring MVC 3 中使用 Jackson 序列化子类型属性

java - 在 Spring : Caused by: org. hibernate.AnnotationException 中使用 Hibernate 的困难:针对未映射的类使用 @OneToMany 或 @ManyToMany: