2011-07-09 16 views
10

/users/{id}をRESTfulサービスのリソースURLとしましょう。RESTfulサービスでのリソースレベルの承認

基本認証が有効になっており、認証されたユーザーのみがURLにアクセスできます。

例のシナリオ:両方が認証されているので

User_1 & User_2それらの両方は、

  • /users/1
  • /users/2
  • をへのアクセスを有するものは、ユーザーID 1 をユーザーに認証され

しかし、User_1には/users/1にアクセスし、/users/2や他のユーザーIDにアクセスする必要はありません。

質問: RESTfulサービスでリソースレベルの認可を行う方法はありますか。

注:Jax-RS(Apache CXF実装あり)を使用してRESTfulを実装しています。Jax-RSで説明できる場合に役立ちます。

-Barath

編集:ドナルが述べたように

、私はむしろレベルの認可リソース役割ベースの許可を捜しているわけではありません。

たとえば、/ users/{id}/photos/{photoId}を別のリソースURLとすることができます。 User_1には、彼に属する写真のみにアクセス権を与える必要があります。 userIには、/ user// users/1/photos/2がリクエストされたときに、http_404エラーコードhttp_404を指定する必要があります。[User_1は認証されたユーザであるため、/ users// photos/2、私たちは私がである、などの各クエリで許可を決定する一意のIDを含めると考えることができます

唯一の解決策は、

代わりのSELECT * FROM PHOTO_TBL WHERE PHOTO_ID=2;]リソースのURLを介してより認証パラメータに基づいてユーザIDを特定する必要があります

使用SELECT * FROM PHOTO_TBL, USER_TBL WHERE PHOTO_ID=2 AND USER_ID=1 AND USER_ID=PHOTO_ID;

このリソースを持つ

は、特定のユーザーに属するデータを配信しています。 [すべての要求がSTATELESS要求であるため、認証(この場合userId)を決定するために使用されるクライアント側の一意のIDの変更を防止するメカニズムが必要です]

警告:各クエリセキュリティ上の懸念を理解し、余分な参加を含めるには十分に知的でなければなりません。これはセキュリティロジックをすべてのビジネス機能に結びつける悪い設計です。

私はまだSpringのセキュリティと、このユースケースでどのように使用できるのかを見ていません。

+0

これはタグに記載されているように、これは認証を通過した認証の問題です。これは、アプリケーションにロールインするか、URLのユーザーIDと認証ヘッダーを比較する中間プロキシとして実装できます。 – Szocske

+0

@Szocske:これは、アプリに入れる価値がある場所です。しかし、あなたはSpring AOP(とSpring Security、自然に)を使って簡単にすることができます。やや難しいのは、実際にはロールベースのアクセス制御ではなく、SpringSecのRBACサポートが関係ないということです。 (悲しいかな、これは最高のチュートリアル資料です...) –

+0

これで、とにかくusersテーブルへの参加が必要な画像IDの編集が表示されます。しかし、この場合、URLにユーザIDが必要なことはほとんどありません:-) – Szocske

答えて

3

URLにユーザーIDを持たないことをお勧めします(Basic Authヘッダーによって「制限されている」ように、基本認証ヘッダーで「指定」されているように)。写真のよう

/users/CURRENT 
/me 

は、あなたがちょうど作成することができ、サブリソースです:あなたは、次のいずれかのURLを持つことができ、この場合https://www.owasp.org/index.php/Top_10_2010-A4-Insecure_Direct_Object_References

- これは、直接オブジェクト参照の脆弱性を導入するリスクを軽減しますユーザーの中で「シーケンス番号」を持つ写真SQLデータベースでは、これはユーザーと写真の両方の列に「複合キー」があることを意味します。

/users/CURRENT/photo/{user_photo_seq} 
/me/photo/{user_photo_seq} 

あなたのSQLはその後のようなものになります。

SELECT * FROM PHOTO_TBL WHERE USER_ID=<BasicAuthUsername> AND PHOTO_ID=<path param value>; 

"基本認証ヘッダー" の良い説明を:

代わりの方法でリクエストを処理する

http://en.wikipedia.org/wiki/Basic_access_authentication

+0

Basic Authヘッダーの内容を説明できますか? –

1

JAX-RS specifies sub-resource 、処理は他のオブジェクトサブリソースに委譲されます。

サブリソースを使用すると、ルートリソースを管理するだけで十分です。ネストされたリソースも保護されます。

この例では、UserResourceが表示され、そのすべてのサブリソースは承認されたユーザーのみが使用できます。

@Path("/user/{userId}") 
public class UserResource { 

    private final String userId; 

    public UserResource(@PathParam("userId") String userId, @Context SecurityContext securityContext) { 
    this.userId = userId; 

    boolean authorized = /* authorization code */; 

    if (!authorized) { throw new WebApplicationException(Status.UNAUTHORIZED); } 
    } 

    @Path("photo") 
    public PhotoResource getPhotoResource() { 
    return new PhotoResource(userId); 
    } 

} 

public class PhotoResource { 

    private final String userId; 

    public PhotoResource(String userId) { 
    this.userId = userId; 
    } 

    @GET 
    public Response listAll() { /* ... */ } 

    @GET 
    @Path("{photoId}") 
    public Response present() { /* ... */ } 

}