REST-ful インターフェイスを公開する Java サーバーに取り組んでいます。インターフェイスへの呼び出しはユーザー名/パスワードによって保護され、各ユーザーにはロールが割り当てられ、それに基づいてリソースへのアクセスが制限されます。サーバーは Glassfish 3.1 によってホストされています。サーバーから独立したカスタム承認/認証スキームを実装する必要があります (さまざまな理由)。そのため、このトピックに関する多数の記事を読んだ後、それを実装する方法を完全に説明している記事は見つかりませんでした。これまでのところ、すべてのリクエストをインターセプトするカスタム Filter クラスがあります。
public class AuthenticationFilter implements Filter {
@Override
public void init(FilterConfig config) throws ServletException { }
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
String user = "SalesUser";
List<String> roles = new ArrayList<String>();
roles.add("Sales");
chain.doFilter(new UserRoleRequestWrapper(user, roles, request), response);
}
このフィルタ クラスは UserRoleRequestWrapper を使用します。
public class UserRoleRequestWrapper extends HttpServletRequestWrapper {
String user;
List<String> roles = null;
HttpServletRequest realRequest;
public UserRoleRequestWrapper(String user, List<String> roles, HttpServletRequest request) {
super(request);
this.user = user;
this.roles = roles;
this.realRequest = request;
}
@Override
public boolean isUserInRole(String role) {
if (roles == null) {
return this.realRequest.isUserInRole(role);
}
return roles.contains(role);
}
@Override
public Principal getUserPrincipal() {
if (this.user == null) {
return realRequest.getUserPrincipal();
}
// make an anonymous implementation to just return our user
return new Principal() {
@Override
public String getName() {
return user;
}
};
}
}
フィルターがリクエストをインターセプトするので、カスタム プリンシパル (提供されたユーザー名/パスワードに基づく) を設定します。また、 getCallerPrincipal() を使用して SessionContext からそのプリンシパルを取得できます。問題は isCallerInRole() メソッドです。原則に役割を割り当てましたが、 isCallerInRole() は別の場所で役割を探しているようです。アプリケーションをホストしているサーバーに依存しない方法で、そのロールをプログラムで設定するにはどうすればよいですか? ありがとう :)