編集: コンテキストによっては、カスタム セキュリティ ドメインを使用し、request.login を手動で呼び出しています。標準の FORM 認証を使用していません。
編集:
私が本当に探しているのは、j_security_check の代わりに jboss で構成され<login-config>
たカスタムを使用して機能を複製する方法のようです。<security-domain>
Web アプリで 2 つの異なることを実行できる必要があります。まず、ユーザーが認証されているかどうかを判断できるようにする必要があります。認証されていない場合は、ログイン ページにリダイレクトします。これにはフィルターを使用しています。次に、Web アプリケーションで特定のページを表示するために、ユーザーが適切な役割を持っているかどうかを判断する必要があります。web.xml ファイルの security-constraint タグがこのジョブに適したツールのようですが、このルールは常に最初に適用され、フィルタが適用されます。これは、ユーザーが適切なロールを持っていないため、ページへのアクセスが拒否される前にログインする機会がユーザーに与えられないことを意味します。
私が考えることができる唯一の解決策は、セキュリティ制約を使用する代わりに、フィルターでユーザーの役割を手動で検査することですが、これは良い解決策とは思えません。これはかなり一般的な使用例のように思われるので、ここに何か欠けているものがあるのではないかと思っています。参考までに、私のフィルターとサンプルのセキュリティ制約を以下に貼り付けます。
編集: フィルターを使用して承認を確認する理由は、特定のエラーに対して 1 つのエラー ページしか定義できないためです (この場合は、403 アクセスが拒否されました)。たとえば、「customer」ロールを持つ誰かが searchCustomer ページにアクセスしようとします。私のセキュリティ制約は、そのページをロール「admin」または「user」を持つユーザーに制限しているため、403 エラーが生成され、ユーザーは構成されたエラー ページ error.xhtml にリダイレクトされます。ログインしていない 2 番目のユーザーが main.xhtml にアクセスしようとします。彼はログインしていないため、許可されている 3 つの役割のいずれかを欠いているため、403 エラーも受け取り、error.xhtml にリダイレクトされます。ただし、彼はログインしていないため、代わりにログイン ページにリダイレクトしたいと考えています。
<security-constraint>
<display-name>SecureApplicationConstraint</display-name>
<web-resource-collection>
<web-resource-name>SecureApplication</web-resource-name>
<description>SecureApplication</description>
<url-pattern>/main.xhtml</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
<role-name>user</role-name>
<role-name>customer</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<display-name>SearchCustomerPage</display-name>
<web-resource-collection>
<web-resource-name>SecureApplication</web-resource-name>
<description>SecureApplication</description>
<url-pattern>/searchCustomer.xhtml</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
<role-name>user</role-name>
</auth-constraint>
</security-constraint>
<error-page>
<error-code>403</error-code>
<location>/error.xhtml</location>
</error-page>
フィルター:
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
String uri = req.getRequestURI();
if ((null != req.getUserPrincipal())
|| uri.endsWith("login.xhtml")
|| uri.endsWith("error.xhtml")
|| uri.contains(ResourceHandler.RESOURCE_IDENTIFIER)) {
chain.doFilter(request, response);
} else {
HttpServletResponse res = (HttpServletResponse) response;
res.sendRedirect(req.getContextPath() + "/login.xhtml?from=" + URLEncoder.encode(uri, "UTF-8"));
return;
}
}