基本上我有一个允许常规用户使用的控制器,我希望管理员可以在不同的路径中访问相同的控制器。 所以我认为这会奏效:
@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而不为管理员重写它们?
答案 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
。