我已经看到许多要求如何处理安全场景的问题,要么都有方法注释(即@PreAuthorize("hasRole('ROLE_USER')")
)的解决方案,要么使用切入点。
但是,如果在从数据存储中读取资源之前用户是否有权访问该资源,该怎么办?让我们考虑一个可以访问一组客户的用户,这些客户的其余端点可以在/customers/{id}
. 仅当用户已被授予读取帐户的访问权限时,才允许用户访问,同样,他们也必须有权访问POST
同一端点。
一种方法是:
@RequestMapping(value = "/customers/{id}", method = RequestMethod.GET)
public ModelAndView customerPage(String id, HttpServletRequest req, Principal principal) {
if (!req.isUserInRole("ROLE_ADMIN") && !cs.accessGranted(id, principal.getName())) {
throw new AccessDeniedException("You do not have access to view this custoemr.");
}
Customer cust = cs.getCustomer(id);
if (cust == null) {
throw new ResourceNotFoundException("Customer does not exist!");
}
ModelAndView mov = new ModelAndView("customers/info");
mov.addObject("customer", cust);
return mov;
}
我想知道这是否是正确的方法。
更新:调用accessGranted
是为了id
作为我错过的论点。