1

セキュリティ シナリオの処理方法を求める多くの質問を見てきましたが、すべてメソッド アノテーション (つまり@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

4

2 に答える 2

0

私のお気に入りの方法は、メソッドで@Securedアノテーションを使用することです。これは、メソッドの実行に必要な役割を表す文字列の配列を取ります。URL パターンだけにセキュリティを適用することに制限されないため、この方法が気に入っています。たとえば、これを Service クラスのメソッドに追加すると、その Service を使用するすべてのコントローラーが保護されます。

もう 1 つの一般的な方法は、Spring Security XML ファイルに URL フィルターを含めることです。正確な構文は忘れましたが、基本的には URL に一致するフィルターを設定し、必要なロールを示します。

于 2013-10-04T11:28:16.247 に答える