【问题标题】:Spring override @PreAuthorize annotation in subclassSpring覆盖子类中的@PreAuthorize注解
【发布时间】:2014-10-26 00:09:10
【问题描述】:

基本上,我有一个允许普通用户使用的控制器,并且我希望管理员可以通过不同的路径访问相同的控制器。 所以我认为这会起作用:

@RestController
@PreAuthorize("hasRole('USER')")
@RequestMapping(value = "/user")
public class UserController {
    @RequestMapping(value = "/name", method = RequestMethod.GET)
    public String getName() {
        return service.getCurrentUserName();
    }
}

@RestController
@PreAuthorize("hasRole('ADMIN')")
@RequestMapping(value = "/admin")
public class UserController extends UserController{
}

但我可以使用 USER 角色同时调用 /user/name 和 /admin/name。所以它有点忽略子类上的 PreAuthorize 注释。

有没有什么方法可以重用 UserController 方法,只需为它们添加不同的安全 PreAuthorize 而不为 Admin 重写它们?

【问题讨论】:

    标签: spring spring-mvc spring-security spring-annotations


    【解决方案1】:

    控制器方法注册在超类中,所以应用超类注解。

    我知道有一种动态注释的唯一方法是在@PreAuthorize 中使用#root。你可以这样修改父类:

    @RestController
    @PreAuthorize("hasRole(#root.target.requiredRole)")
    @RequestMapping(value = "/user")
    public class UserController {
        protected String getRequiredRole() {
            return "USER";
        }
        ...
    }
    

    对于子类:

    @RestController
    @RequestMapping(value = "/admin")
    public class AdminController extends UserController {
        protected String getRequiredRole() {
            return "ADMIN";
        }
        ...
    }
    

    这样,当调用 AdminController 对象时,父类的方法将正确地需要 ADMIN 角色,因为 @PreAuthorize 的字符串值将由 SpEL 预处理,同时仍然需要 USER 角色才能获得真正的 @987654327 @。

    【讨论】:

      猜你喜欢
      • 2015-11-18
      • 1970-01-01
      • 2018-01-02
      • 2017-02-18
      • 1970-01-01
      • 2016-07-18
      • 2015-09-12
      • 1970-01-01
      • 2011-11-29
      相关资源
      最近更新 更多