2011-07-26 7 views
9

JAX-RSを使用して、Webアプリケーションへの簡単なインターフェイスを作成しました。現在、すべてのアプリケーションデータにアクセスできる1つの内部クライアントによってのみ使用されており(読み取り専用)、アクセスにはhttp基本認証が使用されています。私は私のアプリのビュー層の一部としてそれを使用し始めたいと思います、そして、特定の操作は、ユーザーがWebアプリケーションを介してログインしている場合にのみ許可されます。私は、たくさんのコードを繰り返すことなく、両方の形式の認証を使い分けることができるパターンを見つけようとしています。おおよそ私が思いついたのは次のとおりです。Java Restful Web Services(jax rs)認証パターン

最初に、データベースに格納されているアプリケーションセッションを読み込むためのutilクラス。

@Path("/protected/resource") 
public class ProtectedResource { 
    @GET 
    @Produces(MediaType.TEXT_JSON) 
    @Path("{userId}") 
    public String getProtectedResourceJson(@Context HttpServletRequest request, @PathParam("userId") Integer userId) { 
     // Return Charity List XML 
     AppSession session = RestUtil.getAuthenticatedSession(request); 

     if (session.canAccessUser(userId)) //get Json... 
    } 
} 

はここでの目的のために、AppSessionの最も基本的な眺めです:

public class RestUtil { 
    public static AppSession getAuthenticatedSession(HttpServletRequest request) { 
     AppSession session; 
     String remoteUser = request.getRemoteUser(); 
     if (remoteUser != null) { 
      session = SessionRepository.loadSessionByRemoteUser(remoteUser); 
     } else { 
      session = SessionRepository.loadSessionById(request.getSession().getId()); 
     } 
     return session; 
    } 
} 

は、ここで認証されたユーザーのみがアクセス可能であり、または当社のHTTP基本認証クライアントの一つの方法で、私たちのリソースですこの質問:

public class AppSession { 
    User authenticatedUser; 
    String remoteUser; 

    public boolean canAccessUser(Integer userId) { 
     if (remoteUser != null) { 
      //this client has access to all users 
      return true; 
     } else if (authenticatedUser.getId().equals(userId)) { 
      //this is local client, calling the service from a view 
      //only has access to authenticatedUser 
      return true; 
     } else { 
      return false; 
     } 
    } 
} 

はさらに、認証の任意の並べ替えを必要としないサービスのために、どのように私はちょうどURLを指してから、権限のない第三者を防止しない、とg彼らのレジャーでデータを乱暴にする?

答えて

5

アスペクト指向のプログラミングを使用して、ビジネスロジックとセキュリティの面を分けることが重要なポイントになっています。既にSpringを使用してアプリケーションの部分を組み立てている場合(複雑なサーバーの場合はこれをお勧めします)、Spring AOPでセキュリティロジックを追加するだけです。それ以外の場合は、AspectJを直接使用してください。複数のログインモードを処理する実際のロジックはおそらくカスタムでなければなりませんが、少なくとも隔離しておくことができます。

Springを使用する場合は、Spring Securityの使用を検討してください。これはSpring AOPの上に構築され、さらに多くのソリューションを提供します。

+0

もし私たちが春を持っていたら。プラス面では、私はいつもaspectjを調べるための言い訳をしたかった。 –

関連する問題