Spring在子类中覆盖@PreAuthorize注释

时间:2014-09-01 18:34:24

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

基本上我有一个允许常规用户使用的控制器,我希望管理员可以在不同的路径中访问相同的控制器。 所以我认为这会奏效:

@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而不为管理员重写它们?

1 个答案:

答案 0 :(得分:0)

控制器方法在超类中注册,因此应用超类注释。

我知道有一种动态注释的唯一方法是在#root内使用@PreAuthorize。您可以通过以下方式修改父类:

@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角色真实的UserController