在Spring @PreAuthorize中调用私有方法

时间:2013-08-27 16:04:31

标签: spring spring-mvc spring-security

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

@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) {}

3 个答案:

答案 0 :(得分:23)

您将无法调用私有方法,但您可以在另一个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是我自己的界面,没有什么特别的,只需要我需要评估的任何方法。

答案 1 :(得分:0)

无法调用私有方法,但您可以参考"此组件"通过this.

@PreAuthorize("hasPermission(new Object[]{#arg3, /* HERE: */ this.localPublicMethod(#arg1,#arg2)}, 'canDoThis')")   
public long publicMethod1(long arg1, long arg2, long arg3)
{
}

public String localPublicMethod(long a1, long a2)
{
}

答案 2 :(得分:0)

可以使用 @someController.localPublicMethod(#arg1,#arg2)

以简单的方式完成

无需实现permissionEvaluator

@RestController
public class SomeController{

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

public String localPublicMethod(long a1, long a2) {}

}
}

localPublicMethod 不能是私有的

对于权限评估器 - 有更好的方法可以参考以下链接 https://www.baeldung.com/spring-security-create-new-custom-security-expression