まず、関心の分離について考えてみましょう。REST API の目的は何ですか?
REST API はクライアントにサービスを提供する必要があります。クライアントは REST プロトコル経由でリクエストを送信し、そのリクエストに対するレスポンスを取得します。コードでは、これは次のようになります。
@GET
public Response getClientInfo(@QueryParam("clientId") Integer clientId) {
ClientDTO clientDTO = database.getClientInfo(clientId);
return ResponseWrapper.wrap(clientDTO);
}
ここで、REST メソッドでこれだけを実行し、他には何も実行しないようにします。そうしないと、block-bruteforce-and-spam-logicを REST メソッドに入れることになり、コードが混乱して拡張できず、バージョン管理が難しくなります。たとえば、ブラックリスト ポリシーを変更する場合は、次のようにします。すべての REST メソッドを変更する必要があり、かさばります。REST メソッドを作成する前に呼び出しを確認したい場合は、フィルターをご覧ください。すべての要求と応答は一連のフィルターを通過し、サーバーの誤用をチェックできます。
あなたの技術スタックが何であるかはわかりませんが、これらを調べることをお勧めします:
- JBoss AS7.
- DeltaSpike (REST メソッドの実行前にユーザー権限と実行権限をチェックする強力なインターセプターを有効にします)。
例えば:
@LoggedInUser
@GET
public Response getClientInfo(...) {
...
}
このセキュリティ アノテーション@LoggedInUser
(ちなみに、これはユーザーが定義します) は、Interceptor にこのセキュリティ制約をチェックするサインを与えます。
@Secures (built in annotation)
@LoggedInUser
public boolean hasRight(Identity identity) {
return identity.isLoggedIn(); //or if he is in certain group of users
}
- Context および Dependency Injection コンテキスト (DeltaSpike で使用)。
- JBoss Filters (たとえば、一部の IP が非常に短い期間 (10 行のコード) 内に複数の呼び出しを送信しようとしているかどうかをチェックする独自のフィルターを作成できるフィルター チェーン)。
フィルターの例
@Startup
@ApplicationScoped
@Filter(around= "org.jboss.seam.web.ajax4jsfFilter")
public class IPTrackerFilter extends AbstractFilter {
//IPTracker is your @ApplicationScoped bean that remembers all IP addresses accessing the application.
@Inject
private IPTracker fIPTracker;
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
if (!(req instanceof HttpServletRequest)) {
chain.doFilter(req, res);
return;
}
final String ipAddress= ((HttpServletRequest)req).getRemoteAddr();
if (fIPTracker.isBlackListed(ipAddress)) {
//implement error message here
sendErrorMessage(response);
return;
} else {
//all good, continue
chain.doFilter(req, res);
}
}
}
PS。DeltaSpikeのリンクを提供しました。他の人は本当に簡単に見つけることができます。また、DeltaSpike がわかりにくい場合は、JBoss Seam Security Frameworkを試してください。