JSP タグライブラリ

Taglib の宣言

タグを使用するには、JSP でセキュリティ taglib を宣言する必要があります。

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>

承認タグ

このタグは、その内容を評価する必要があるかどうかを判断するために使用されます。Spring Security 3.0 では、2 つの方法で使用できます。

Spring Security 2.0 の従来のオプションもサポートされていますが、お勧めしません。

最初のアプローチでは、タグの 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 内で情報(必要なロールなど)を複製する必要がなくなります。このアプローチを method 属性(POST などの HTTP メソッドを提供)と組み合わせて、より具体的に一致させることもできます。

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 タグを使用する必要はなく、ビュー内のロジックをできるだけ少なくすることを好む人もいます。(SecurityContextHolder.getContext().getAuthentication() を呼び出すことにより)MVC コントローラーの Authentication オブジェクトにアクセスし、ビューでレンダリングするためにデータをモデルに直接追加できます。

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 は何も出力しません。