セキュリティ シナリオの処理方法を求める多くの質問を見てきましたが、すべてメソッド アノテーション (つまり@PreAuthorize("hasRole('ROLE_USER')")
) またはポイント カットを使用するためのソリューションがあります。
しかし、リソースがデータ ストアから読み取られるまで、ユーザーがアクセス権を持っているかどうかがわからない場合はどうなるでしょうか。一連の顧客にアクセスできるユーザーを考えてみましょう。これらの顧客の残りのエンドポイントは にあります/customers/{id}
。POST
ユーザーは、アカウントを読み取るためのアクセス権を付与されている場合にのみアクセスが許可されます。同様に、同じエンドポイントにアクセスするためのアクセス権も必要です。
1つの方法は次のとおりです。
@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