1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Django】Auth機能とカスタムテンプレートタグによってユーザーごとにアクセス可能なボタンを表示・非表示する方法

Posted at

概要

前提

  • 前回実施した続きなので、以下は実施済みの前提です。
    • Auth機能でGroup作成&User追加
    • メッセージフレームワークを利用するためのviews設定やルーティング設定

実施方法

  • カスタムテンプレートタグを使って「group_idに基づいてボタンの表示・非表示を制御する」ことを行います。
    • ①カスタムテンプレートタグの作成
    • ②HTMLテンプレートの編集

①カスタムテンプレートタグの作成

  • カスタムテンプレートタグとは、{% if ... %}など元から使えるビルトイン・テンプレートタグと違って、自分で独自に定義して処理や関数を呼び出すことができるタグです。
  • まずは、アプリ内にtemplatetagsディレクトリを作成します。
  • templatetagsディレクトリ内に__init__.pyファイルを作成(これは空のまま)。
  • templatetagsディレクトリ内にgroup_tags.pyファイルを作成。以下のように記載します。
group_tags.py
from django import template

register = template.Library()

@register.filter
def has_group(user, group_id):
    return user.groups.filter(id=group_id).exists()

  • has_groupというフィルターを実装しました。このフィルターは、ユーザーが指定したグループに所属しているかどうかを判定し、結果を返します。
  • @register.filterは、カスタムテンプレートフィルタを登録するデコレータです。

②HTMLテンプレートの編集

  • ボタン制御を行いたいテンプレートを編集します。
  • まず、group_tagsモジュールをテンプレートで呼び出すため、先頭に以下を記載します。
home.html
{% load group_tags %}
  • 次に、例えば以下のアクセス制御をしたいとします。
    • group_id = 1 の人にはボタン「権限レベル1のボタン」を表示し、それ以外は表示しない
    • group_id = 2 の人にはボタン「権限レベル1のボタン」「権限レベル2のボタン」を表示し、それ以外は表示しない
  • 上記の場合、以下のようにテンプレートに加えます。
home.html
        {% if request.user|has_group:"1" or request.user|has_group:"2" %}
          <div class="card-wrapper">
            <div>
              <button class="button color">
                <a class = "button name" href="{% url 'level1' %}">権限レベル1のボタン</a>
              </button>
            </div>
          </div>
        {% endif %}


        {% if request.user|has_group:"2" %}
          <div class="card-wrapper">
            <div>
              <button class="button color">
                <a class = "button name" href="{% url 'level2' %}">権限レベル2のボタン</a>
              </button>
            </div>
          </div>
        {% endif %}
  • これにより、has_groupというカスタムフィルターを使用して、group_idに基づいたボタンの表示・非表示を制御することができました。

TemplateSyntaxError at...エラーについて

  • 以下のエラーが出た場合、正しいディレクトリにカスタムのテンプレートタグが登録されていない可能性があります。templatetagsは通常アプリケーションのディレクトリ内に作成します。正しい場所にあるかチェックしましょう。
TemplateSyntaxError at /home/
'group_tags' is not a registered tag library. Must be one of:

ホワイトリスト方式・ブラックリスト方式

  • 以上、ボタンの表示・非表示を行うことができました。
    • orを使うことで複数のグループのアクセス制御ができますし、この方法だと割と簡潔に実装できます。
    • 仮に、アクセス権のないURLを直打ちで打つと、前回の記事で実装したメッセージが表示されます。
  • カスタムテンプレートを使っているのは、Djangoのテンプレートエンジンでは、直接条件文を使用して表示・非表示を制御することができないためです。他にもっと良い方法がある、ということがあればぜひ教えてください。
  • セキュリティ対策の考え方には、ホワイトリスト方式・ブラックリスト方式という考え方があります。どちらの方が好ましいかは、サイトのセキュリティ要件や運用方針に合わせて判断すると良いと思います。
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?