efwフレームワーク ログイン・権限制御サンプル
概要
これはefwフレームワークに基づいたWebアプリケーションのサンプルで、包括的なログイン制御と権限管理機能を実装しています。社内システムとインターネット向けWebアプリケーションの両方に対応し、多層防御セキュリティアーキテクチャにより、直接URLアクセスや開発者ツールからの悪意のある呼び出しを効果的に防止します。
主な機能
ログイン制御
- ログイン検証メカニズム: ユーザーのログイン状態を自動検証
- セッションタイムアウト処理: ログインページへの自動リダイレクト
- ログイン不要ページ: ログインページ、パスワード回復、パスワード変更、エラーページ
- 二重セキュリティ: フロントエンドコンポーネント保護 + バックエンドセッション検証
権限制御
- ロール管理: 管理者と一般ユーザーの役割
- 詳細な制御: URLとイベントIDに基づくアクセス制御
- 安全なエラー処理: 不正アクセス時にはシステムエラーページを表示
- 多層権限検証: フロントエンドUI制御 + バックエンド権限チェック
セキュリティアーキテクチャ:多層防御
フロントエンドセキュリティ保護
<efw:client>タグメカニズムによる直接コンポーネント呼び出しの防止:
保護原理:
- コンポーネントページ(サブ画面、ダイアログ)には
<efw:client>タグが含まれない - メインページから正しく読み込まれたコンポーネントのみが正常に機能する
- コンポーネントページに直接アクセスすると、すべてのJavaScriptイベント関数が実行不能になる
セキュリティ効果:
直接アクセス: http://app.com/MST01_inputdialog.jsp
→ ページは読み込まれるが、すべての機能が無効化
適切なアクセス: メインページのダイアログ経由 → 完全な機能が動作
バックエンドセキュリティ検証
最終防御ラインとしてのサーバーサイドセッションと権限チェック:
セッション検証:
- すべてのリクエストでセッション内に有効なUSER_IDが存在するか検証
- 未認証またはセッション期限切れの場合、ログインページへ自動リダイレクト
- セッションデータはサーバーサイドに保存され、クライアント側で改ざん不可
権限チェック:
- ユーザーロール(管理者/一般ユーザー)に基づく詳細な制御
- 現在の操作がユーザーの権限範囲内かどうかを検証
- 不正アクセス時には直接エラーページを返す
保護効果:
// 開発者ツールでの偽造リクエスト試行
fetch('/app/event', {
method: 'POST',
body: 'eventId=MST01_delete&userId=123'
});
→ バックエンドでユーザー権限を検証 → 権限不足 → エラーページを返す
プロジェクト構造
skeletonSample/
├── JSPページ/
│ ├── LG01.jsp # ログインページ
│ ├── LG02.jsp # メニューページ
│ ├── LG03.jsp # パスワード回復ページ
│ ├── LG04.jsp # パスワード変更ページ
│ ├── MST01.jsp # ユーザー管理メインページ
│ ├── error.jsp # エラーページ
│ └── コンポーネントファイル...
├── JavaScriptイベントファイル/
│ ├── LG01_*.js # ログイン関連イベント
│ ├── LG02_*.js # メニュー関連イベント
│ ├── MST01_*.js # ユーザー管理イベント
│ └── グローバルイベント...
├── 設定ファイル/
│ └── efw.properties # フレームワーク設定
└── データベースファイル/
├── skeletonSample.backup # PostgreSQLバックアップ
└── ユーザマスタDDL.sql # ユーザーテーブル作成スクリプト
コア設定
ログイン制御 (efw.properties)
# ログイン制御を有効化
efw.login.check = true
efw.login.key = USER_ID
efw.login.url = LG01.jsp
# ログイン不要ページパターン
efw.outoflogin.url.pattern = LG01|LG03|LG04.jsp
efw.outoflogin.eventid.pattern = LG01|LG03|LG04|head_logout
権限制御 (efw.properties)
# 権限制御を有効化
efw.auth.check = true
efw.auth.key = USER_ID
efw.system.error.url = error.jsp
# ロール定義
efw.auth.cases = admin,user
# 管理者権限
admin.auth.pattern = ^admin.*$
admin.url.pattern = LG02|MST01.jsp
admin.eventid.pattern = LG02|MST01
# 一般ユーザー権限
user.auth.pattern = ^((?!admin).)*$
user.url.pattern = LG02.jsp
user.eventid.pattern = LG02
セキュリティ機能の詳細説明
1. フロントエンドコンポーネント保護
- 実装:
<efw:client>タグ経由でフロントエンド実行可能関数を登録 - 保護範囲: コンポーネントページへの直接URLアクセス防止
- 利点: 軽量な保護、ユーザーエクスペリエンスの向上
2. バックエンドセッション検証
- 実装: サーバーサイドセッション状態チェック
- 保護範囲: すべてのHTTPリクエスト(ページアクセス、イベント呼び出し、APIリクエスト)
- 利点: フロントエンドから迂回不可、極めて高い安全性
3. 権限検証フロー
ユーザーリクエスト → フロントエンドコンポーネント検証 → バックエンドセッション検証 → バックエンド権限検証 → ビジネス実行
4. エラー処理戦略
- 通常操作: ユーザーフレンドリーなインターフェースプロンプト
- 異常アクセス: 統一されたシステムエラーページ
- セキュリティ原則: 潜在的な攻撃者に詳細情報を提供しない
データベース設計
ユーザーマスターテーブル構造:
CREATE TABLE "ユーザマスタ" (
"ユーザID" VARCHAR(10) NOT NULL PRIMARY KEY, -- ユーザーID
"パスワード" VARCHAR(10), -- パスワード
"ユーザ名" VARCHAR(20), -- ユーザー名
"メール" VARCHAR(50), -- メールアドレス
"コメント" VARCHAR(200), -- コメント
"初期化フラグ" INTEGER, -- 初期化フラグ
"ロックフラグ" INTEGER, -- ロックフラグ
"パスワード更新日" DATE, -- パスワード更新日
"作成日時" DATE, -- 作成日時
"作成者" VARCHAR(10), -- 作成者
"更新日時" DATE, -- 更新日時
"更新者" VARCHAR(10) -- 更新者
);
システム要件
- データベース: PostgreSQL(推奨)または他の対応データベース
- Webサーバー: JSP対応サーブレットコンテナ
- 依存関係: データベースドライバー、メールコンポーネント、POIコンポーネント
クイックスタート
- データベースのバックアップを復元するか、提供されたSQLスクリプトを実行
- データベース接続パラメータを設定
- Webサーバーにデプロイ
- ログインページにアクセスして使用開始
セキュリティベストプラクティス
- セッション管理: 適切なセッションタイムアウト期間の設定
- パスワードポリシー: 強力なパスワード要件と定期的な変更の実装
- エラー処理: 情報漏洩防止のための統一エラーページ
- ロギング: 重要なセキュリティイベントの記録
- 定期的な監査: 権限設定とユーザーロールの定期的な見直し
このサンプルは、efwフレームワークを使用したエンタープライズレベルのWebアプリケーション向けの完全なセキュリティソリューションを実演しています。フロントエンド保護 + バックエンド検証の多層防御アーキテクチャにより、Webアプリケーションにエンタープライズグレードのセキュリティ保証を提供します。