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彼らのレジャーでデータを乱暴にする?
もし私たちが春を持っていたら。プラス面では、私はいつもaspectjを調べるための言い訳をしたかった。 –