JakartaEE フィルタで認証と認可を実装する方法を初心者向けに解説!サーブレットのセキュリティ入門
生徒
「先生、JakartaEEでログインしていないユーザーを保護されたページに入れないようにするにはどうすればいいですか?」
先生
「その場合はサーブレットフィルタを使って、リクエストが来るたびに認証済みかどうかをチェックする方法がよく使われるよ。」
生徒
「なるほど!でも、もし認証だけじゃなくて特定のユーザーだけアクセスできるようにしたい場合はどうしますか?」
先生
「それが認可処理だね。ユーザーの権限を確認して、許可された人だけがリソースにアクセスできるようにフィルタで制御するんだ。」
1. 認証と認可とは何か
Webアプリケーションを作る上で欠かせないのがセキュリティです。JakartaEEではサーブレットフィルタを使うことで、簡単に認証(ログインチェック)と認可(アクセス制御)を組み込むことができます。認証とは「誰なのかを確認すること」、認可とは「その人が何をできるかを決めること」です。この2つを正しく使い分けることで、安全なWebアプリケーションを実現できます。
2. 認証フィルタの基本
認証フィルタは、ユーザーがログインしているかどうかをチェックします。例えばセッションにユーザー情報が保存されていなければ、ログインページにリダイレクトさせる仕組みを作ります。以下は基本的な認証フィルタのサンプルです。
@WebFilter("/secure/*")
public class AuthFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
HttpSession session = req.getSession(false);
if (session == null || session.getAttribute("user") == null) {
res.sendRedirect(req.getContextPath() + "/login.jsp");
} else {
chain.doFilter(request, response);
}
}
}
このフィルタでは「/secure/」配下のURLにアクセスする際、ユーザーがログイン済みでなければ必ずログインページにリダイレクトされるようになっています。
3. 認可フィルタの基本
認可フィルタは、認証済みのユーザーに対してさらにアクセス権限をチェックします。例えば「管理者だけがアクセスできるページ」を作りたい場合に役立ちます。
@WebFilter("/admin/*")
public class RoleFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
HttpSession session = req.getSession(false);
if (session != null && "admin".equals(session.getAttribute("role"))) {
chain.doFilter(request, response);
} else {
res.sendError(HttpServletResponse.SC_FORBIDDEN, "アクセス権限がありません");
}
}
}
この例では、ユーザーがログインしていても、セッションにrole=adminが設定されていない場合は403エラーを返すようにしています。
4. フィルタを組み合わせて使う
JakartaEEのフィルタはチェーンでつながる仕組みを持っているため、認証フィルタと認可フィルタを組み合わせることができます。まず認証フィルタでログイン済みかどうかをチェックし、その後で認可フィルタを通して権限を確認するといった流れです。こうすることで、柔軟かつ安全なアクセス制御を行うことができます。
5. フィルタで実装するメリット
フィルタを使って認証と認可を実装するメリットは以下の通りです。
- 共通処理を一元管理できるためコードの重複を防げる
- 複数のサーブレットに対して一括でセキュリティを適用できる
- 設定変更や機能追加が容易で拡張性が高い
- ログイン状態や権限を統一的に管理できる
これにより、大規模なJakartaEEアプリケーションでも効率的にセキュリティを構築できます。
6. 実運用での注意点
フィルタで認証・認可を実装する際は、以下の点に注意する必要があります。
- ログイン情報は必ずセッションやセキュアなストレージで管理する
- HTTPSを利用して通信内容を暗号化する
- 権限チェックの条件を明確にし、不正アクセスを防ぐ
- 必要に応じてJakarta Security APIや外部ライブラリとの連携も検討する
これらを守ることで、JakartaEEアプリケーションの安全性を高めることができます。