18

我正在使用 Spring Security 对方法进行权限检查。我想调用一个私有方法来收集一些数据发送到hasPermission()方法。以下是我试图执行的事情,我得到 SpelEvaluationException 因为 Spring 正在寻找localPrivateMethodin 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) {}
4

3 回答 3

37

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

于 2013-08-27T16:31:54.347 回答
3

不能调用私有方法,但是可以通过以下方式引用“这个组件” 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)
{
}
于 2018-03-02T14:55:39.493 回答
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

于 2021-07-16T10:51:30.587 回答