最新の安定バージョンについては、Spring Security 6.3.1 を使用してください! |
JSP タグライブラリ
Taglib の宣言
タグを使用するには、JSP でセキュリティ taglib を宣言する必要があります。
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
承認タグ
このタグは、その内容を評価する必要があるかどうかを判断するために使用されます。Spring Security 3.0 では、2 つの方法で使用できます [ 1 ]。最初のアプローチでは、タグの access
属性で指定された Web セキュリティ式を使用します。式の評価は、アプリケーションコンテキストで定義された SecurityExpressionHandler<FilterInvocation>
に委譲されます(このサービスが使用可能であることを確認するには、<http>
名前空間構成で Web 式を有効にする必要があります)。たとえば、持っているかもしれません
<sec:authorize access="hasRole('supervisor')">
This content will only be visible to users who have the "supervisor" authority in their list of <tt>GrantedAuthority</tt>s.
</sec:authorize>
Spring Security の PermissionEvaluator と組み合わせて使用すると、タグを使用して権限を確認することもできます。例:
<sec:authorize access="hasPermission(#domain,'read') or hasPermission(#domain,'write')">
This content will only be visible to users who have read or write permission to the Object found as a request attribute named "domain".
</sec:authorize>
一般的な要件は、ユーザーが実際にクリックすることを許可されている場合にのみ特定のリンクを表示することです。何かが許可されるかどうかを事前に判断するにはどうすればよいですか? このタグは、特定の URL を属性として定義できる代替モードで動作することもできます。ユーザーがその URL の呼び出しを許可されている場合、タグの本文が評価され、そうでない場合はスキップされます。次のようなものを持っているかもしれません
<sec:authorize url="/admin">
This content will only be visible to users who are authorized to send requests to the "/admin" URL.
</sec:authorize>
このタグを使用するには、アプリケーションコンテキストに WebInvocationPrivilegeEvaluator
のインスタンスも存在する必要があります。名前空間を使用している場合、名前空間は自動的に登録されます。これは DefaultWebInvocationPrivilegeEvaluator
のインスタンスで、指定された URL のダミー Web リクエストを作成し、セキュリティインターセプターを呼び出して、リクエストが成功するか失敗するかを確認します。これにより、<http>
名前空間構成内の intercept-url
宣言を使用して定義したアクセス制御セットアップに委譲でき、JSP 内で情報(必要なロールなど)を複製する必要がなくなります。このアプローチは、より具体的な一致のために、HTTP メソッドを提供する method
属性と組み合わせることもできます。
タグの評価のブール結果(アクセスの許可または拒否)は、var
属性を変数名に設定することにより、ページコンテキストスコープ変数に格納でき、他の場所で条件を複製および再評価する必要がありません。ページ。
テストのためのタグ認証の無効化
認可されていないユーザーのためにページ内のリンクを非表示にしても、ユーザーが URL にアクセスすることを妨げません。たとえば、ブラウザーに直接入力するだけです。テストプロセスの一環として、バックエンドでリンクが本当に保護されていることを確認するために、非表示の領域を明らかにすることができます。システムプロパティ spring.security.disableUISecurity
を true
に設定すると、authorize
タグは引き続き実行されますが、その内容は非表示になりません。デフォルトでは、<span class="securityHiddenUI">…</span>
タグでコンテンツを囲みます。これにより、異なる背景色などの特定の CSS スタイルで「隠された」コンテンツを表示できます。たとえば、このプロパティを有効にして「チュートリアル」サンプルアプリケーションを実行してみてください。
デフォルトの span
タグから周囲のテキストを変更する場合(または空の文字列を使用して完全に削除する場合)、プロパティ spring.security.securedUIPrefix
および spring.security.securedUISuffix
を設定することもできます。
認証タグ
このタグは、セキュリティコンテキストに保存されている現在の Authentication
オブジェクトへのアクセスを許可します。オブジェクトのプロパティを JSP で直接レンダリングします。そのため、たとえば、Authentication
の principal
プロパティが Spring Security の UserDetails
オブジェクトのインスタンスである場合、<sec:authentication property="principal.username" />
を使用すると現在のユーザーの名前がレンダリングされます。
もちろん、この種のことのために JSP タグを使用する必要はなく、ビューの中にできるだけ少ないロジックを保持することを好む人もいます。MVC コントローラーの Authentication
オブジェクトにアクセスし(SecurityContextHolder.getContext().getAuthentication()
を呼び出すことにより)、データをモデルに直接追加して、ビューでレンダリングすることができます。
accesscontrollist タグ
このタグは、Spring Security の ACL モジュールで使用する場合にのみ有効です。指定されたドメインオブジェクトに必要なアクセス許可のコンマ区切りリストをチェックします。現在のユーザーがこれらすべての権限を持っている場合、タグの本文が評価されます。そうでない場合はスキップされます。例は
一般に、このタグは非推奨と見なされる必要があります。代わりに承認タグを使用してください。 |
<sec:accesscontrollist hasPermission="1,2" domainObject="${someObject}">
This will be shown if the user has all of the permissions represented by the values "1" or "2" on the given object.
</sec:accesscontrollist>
許可は、アプリケーションコンテキストで定義された PermissionFactory
に渡され、ACL Permission
インスタンスに変換されます。そのため、ファクトリでサポートされている任意の形式を使用できます。整数である必要はなく、READ
や WRITE
などの文字列でもかまいません。PermissionFactory
が見つからない場合、DefaultPermissionFactory
のインスタンスが使用されます。アプリケーションコンテキストからの AclService
は、提供されたオブジェクトの Acl
インスタンスをロードするために使用されます。Acl
は、すべてが許可されているかどうかを確認するために必要な権限で呼び出されます。
このタグは、authorize
タグと同様に、var
属性もサポートします。
csrfInput タグ
CSRF 保護が有効になっている場合、このタグは、CSRF 保護トークンの正しい名前と値を持つ非表示フォームフィールドを挿入します。CSRF 保護が有効になっていない場合、このタグは何も出力しません。
通常、Spring Security は、使用する <form:form>
タグに対して CSRF フォームフィールドを自動的に挿入しますが、何らかの理由で <form:form>
を使用できない場合、csrfInput
は便利な代替です。
このタグは、通常は他の入力フィールドを配置する HTML <form></form>
ブロック内に配置する必要があります。このタグを Spring <form:form></form:form>
ブロック内に配置しないでください。Spring Security は Spring フォームを自動的に処理します。
<form method="post" action="/do/something">
<sec:csrfInput />
Name:<br />
<input type="text" name="name" />
...
</form>
csrfMetaTags タグ
CSRF 保護が有効になっている場合、このタグは、CSRF 保護トークンフォームフィールドとヘッダー名、および CSRF 保護トークン値を含むメタタグを挿入します。これらのメタタグは、アプリケーションの JavaScript 内で CSRF 保護を採用できます。
csrfMetaTags
は、通常は他のメタタグを配置する HTML <head></head>
ブロック内に配置する必要があります。このタグを使用すると、JavaScript を使用してフォームフィールド名、ヘッダー名、トークン値に簡単にアクセスできます。この例では、タスクを簡単にするために JQuery が使用されています。
<!DOCTYPE html>
<html>
<head>
<title>CSRF Protected JavaScript Page</title>
<meta name="description" content="This is the description for this page" />
<sec:csrfMetaTags />
<script type="text/javascript" language="javascript">
var csrfParameter = $("meta[name='_csrf_parameter']").attr("content");
var csrfHeader = $("meta[name='_csrf_header']").attr("content");
var csrfToken = $("meta[name='_csrf']").attr("content");
// using XMLHttpRequest directly to send an x-www-form-urlencoded request
var ajax = new XMLHttpRequest();
ajax.open("POST", "https://www.example.org/do/something", true);
ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded data");
ajax.send(csrfParameter + "=" + csrfToken + "&name=John&...");
// using XMLHttpRequest directly to send a non-x-www-form-urlencoded request
var ajax = new XMLHttpRequest();
ajax.open("POST", "https://www.example.org/do/something", true);
ajax.setRequestHeader(csrfHeader, csrfToken);
ajax.send("...");
// using JQuery to send an x-www-form-urlencoded request
var data = {};
data[csrfParameter] = csrfToken;
data["name"] = "John";
...
$.ajax({
url: "https://www.example.org/do/something",
type: "POST",
data: data,
...
});
// using JQuery to send a non-x-www-form-urlencoded request
var headers = {};
headers[csrfHeader] = csrfToken;
$.ajax({
url: "https://www.example.org/do/something",
type: "POST",
headers: headers,
...
});
<script>
</head>
<body>
...
</body>
</html>
CSRF 保護が有効になっていない場合、csrfMetaTags
は何も出力しません。