権限ロールを設定している画面、アクションにアクセスする時、
その要求されるロールがないか確認できない場合は強制的にログイン画面に遷移します。
ログイン画面は
WEB-INF/application-settings.xml
で指定します。
<parameter>
<param-name>login</param-name>
<param-value>/aplication-path/login.html</param-value>
</parameter>
アクションによってはログイン画面に遷移できない場合がありますが、
その場合は例外がスローされて JavaScriptの errorHandler() 関数に処理が渡されます。
アクションのロール設定は WEB-INF/action-mappings.xml で行います。
<action-package>
<package-name>action.packcage</package-name>
<action-role>role1,role2</action-role>
</action-package>
<action>
<action-name>ActionName</action-name>
<action-class>action.package.XXXAction</action-class>
<action-role>role1,role2</action-role>
</action>
上記例のようにパッケージとアクションクラスのどちらの設定も可能で、
またパッケージの設定よりアクションクラスの設定が優先されます。
画面毎の設定は WEB-INF/security-settings.xml で行います。
<path-role>
<url-pattern>/folder/*.html</url-pattern>
<roles>role1,role2</roles>
</path-role>
url-pattern に一致する画面をロードする際に権限チェックを行います。
複数のロールを設定する場合は例のようにカンマで区切ってください。
権限ロールを設定したアクション、画面にアクセスする前に
ログイン画面などで権限をセッションに登録しておきます。
ユーザロールは "user-roles" というキー名でセッションに格納しておきます。
このキー名は ActionPermission.USER_ROLES に定義してありますので
それを使用します。
public class LoginAction extends ServiceAction {
public void execute() throws Exception {
List userRoles;
...
request.getSession().setAttribute(ActionPermission.USER_ROLES, userRoles);
...
}
}
セッションに格納するユーザ権限は String、Objectの配列、Iterableインタフェースの実装クラス
のいずれかオブジェクトである必要があります。
String型で複数のロールを指定するには各ロールをカンマで区切ります。
そのアクション、画面が要求する各ロールそれぞれについて、
equalsでtrueとなる要素がユーザ権限に含まれている場合にアクセスが許可されます。
アクセスが許可されないときは設定したログイン画面に遷移し
JavaScriptの doActionError を実行します。
doActionError関数を定義していない場合は
デフォルトで警告メッセージを表示します。
doActionErrorの引数として渡されるオブジェクトには
以下の情報が格納されています。
- REFERER 要求元画面のURL
- REQUEST_URL 要求されたURL
- 許可されなかった要求に渡されるはずだった全てのリクエストパラメータ
- ERROR 下記の情報を格納するオブジェクト
- message デフォルトのメッセージ
- className 次のいずれか
IllegalAccess 現在のユーザロールでは要求されたリクエストを実行できない場合
RequireLogin ユーザロールが存在しない場合
SessionTimeout セッションが無効の場合
上記の情報は document.initialdata にも格納されますので、
ログイン後の遷移先などに利用してください。