Spring Security-方法级别的安全性不适用于从其他方法调用
问题内容:
假设我有两种方法
@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,也不会遇到拒绝访问的异常。它应该像那样工作还是我做错了什么?
PS:这不是实时的应用程序场景,但是我只是在玩代码。
问题答案:
这是因为Spring
Security通过代理安全类来工作。这意味着它为您现有的类提供了包装。如果使用基于接口的代理,则可以是java.lang.Proxy,也可以是cglib增强的子类。不过,我不想在这里过多讨论。
但最重要的是,当外部调用者调用您的方法之一时,会发生以下情况:
调用者->代理->安全拦截器->实现类
是安全拦截器来检查注释并确定要应用的安全性。但是,一旦进入实际的实现类,就可以在不涉及代理和安全拦截器的情况下调用方法,因此无需进行安全检查。
因此,您需要使用适用于它的@Secured注释以及内部调用的任何内容来保护每个入口点。