Spring 安全性 - 方法级安全性不适用于从另一个方法调用



假设我有两个方法

 @Secured("ROLE_ADMIN")
 @RequestMapping(value = "/methodA", method = RequestMethod.GET)
 public void MethodA(){
 // code
 }

以及调用第一种方法的另一种方法

@RequestMapping(value = "/MethodB", method = RequestMethod.GET)
public void MethodB(){
MethodA();
//code
}

如果我使用权限ROLE_USER登录到应用程序并尝试访问URL /methodA,我会得到一个拒绝访问的异常-完美!但是如果我访问URL /methodB,即使我使用ROLE_USER权限访问那里的MethodA,我也不会得到拒绝访问的异常。它应该这样工作吗?还是我做错了什么。

附言:这不是一个实时应用程序场景,但我只是在玩代码。

这是因为spring安全性通过代理您的安全类来工作。这意味着它在现有类周围放置了一个包装器。如果使用基于接口的代理,它可以是java.lang.Proxy,也可以是cglib增强的子类。不过,我不想在这里过多地讨论这个问题。

但最重要的是,当外部调用方调用您的方法时,会发生以下情况:

调用者--->代理--->安全拦截器--->实现类

安全性拦截器检查注释并确定要应用的安全性。然而,一旦您进入了实际的实现类,您就只是在不涉及代理和安全拦截器的情况下调用方法,因此没有安全检查。

因此,您需要使用适合它的@Secured注释以及它在内部调用的任何内容来保护您的每个入口点。

最新更新