Spring Security Taglibの紹介

1概要

このチュートリアルでは、基本的な情報を提供するhttps://docs.spring.io/spring-security/site/docs/5.0.7.RELEASE/reference/htmlsingle/#taglibs[Spring Security Taglibs]を見ていきます。セキュリティー情報へのアクセスおよびJSPでのセキュリティー制約の適用のサポート。

2 Mavenの依存関係

まず最初に、https://search.maven.org/search?q=g:org.springframework.security%20AND%20a:spring-security-taglibsを追加しましょう。

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>5.0.7.RELEASE</version>
</dependency>

3 Taglibを宣言する

タグを使用する前に、JSPファイルの先頭にtaglibをインポートする必要があります。

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

これを追加すると、Spring Securityのタグを __sec __接頭辞で指定できるようになります。

4 authorize タグ

4.1. __アクセス式

私たちのアプリケーションでは、特定の役割やユーザーに対してのみ表示されるべき情報があるかもしれません。

この場合、 authorize タグを使用できます。

<sec:authorize access="!isAuthenticated()">
  Login
</sec:authorize>
<sec:authorize access="isAuthenticated()">
  Logout
</sec:authorize>

さらに、認証されたユーザーに特定の役割があるかどうかを確認できます。

<sec:authorize access="hasRole('ADMIN')">
    Manage Users
</sec:authorize>

また、 access の値としてhttps://www.baeldung.com/spring-security-expressions[Spring Security expression]を使用できます。

  • hasAnyRole( 'ADMIN'、 'USER') は、現在のユーザーが持っていれば true を返します

リストされた役割のいずれか ** isAnonymous() は、現在のプリンシパルが

匿名ユーザー ** isRememberMe() は、現在のプリンシパルがaの場合、 true を返します。

私を覚えているユーザー ** isFullyAuthenticated() は、ユーザーが認証された場合に true を返します。

匿名でも、私を記憶していないユーザーでもありません。

4.2. url

それ以外にも、特定のURLにリクエストを送信する権限を与えられたユーザーをチェックすることができます。

<sec:authorize url="/userManagement">
    <a href="/userManagement">Manage Users</a>
</sec:authorize>

4.3. デバッグ

テストシナリオなどで、UIをより細かく制御したい場合があります。 Spring Securityにこれらの不正なセクションのレンダリングをスキップさせる代わりに、例えば application.properties ファイルに __spring.security.disableUISecurity = true__を設定できます。

  • これを行うと、 authorize タグがその内容を隠すことはなく、代わりに <span class =” securityHiddenUI”> …​ </span> タグで内容をラップします。それから、CSSを使って自分でレンダリングをカスタマイズできます。

  • CSSでコンテンツを隠すのは安全ではないことを忘れないでください。 ** ユーザーはソースを閲覧するだけで不正なコンテンツを見ることができます。

5 __認証タグ

それ以外の場合は、ログインしているユーザーに関する詳細情報を表示します。たとえば、 "Welcome Back、Carol!"のようにサイトに表示します。

これには、 __認証 __タグを使用します。

<sec:authorize access="isAuthenticated()">
    Welcome Back, <sec:authentication property="name"/>
</sec:authorize>

6. csrfInput タグ

うまくいけば、Spring SecurityのCSRF防御機能がアプリで有効になります。

もしそうであれば、Spring SecurityはすでにCSRF隠しフォーム入力を <form:form> タグ内に挿入しています。

しかし、代わりに <form> を使用する場合は、 csrfInput :** を使用して、Spring Securityがこの隠し入力フィールドを配置する場所を手動で指定できます。

<form method="post" action="/do/something">
    <sec:csrfInput/>
    Text Field:<br/>
    <input type="text" name="textField"/>
</form>

CSRF保護が有効になっていない場合、このタグは何も出力しません。

7. csrfMetaTags タグ

あるいは、 JavascriptでCSRFトークンにアクセスしたい場合は、 トークンをメタタグとして挿入することをお勧めします。

これは __csrfMetaTags __tagを使って実行できます。

<html>
    <head>
        <title>JavaScript with CSRF Protection</title>
        <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");
        </script>
    </head>
    <body>
    ...
    </body>
</html>

繰り返しますが、CSRF保護が有効になっていない場合、このタグは何も出力しません。

8結論

このクイック記事では、一般的なSpring Security taglibのユースケースに焦点を当てました。

そして、私たちが学んだように、それらは認証と認可を意識したJSPコンテンツをレンダリングするために非常に役に立ちます。

すべての例は、いつものようにhttps://github.com/eugenp/tutorials/tree/master/spring-boot-security[over Github]で見つけることができます。