ビジネスパーソン・ガジェット置場 empty lot for business

営業や仕事、それに伴う生活を便利に楽にするツール、ガジェットを作ります。既にあるツールも自分用にカスタマイズ。

python: Flaskアプリの作成18 権限

備忘録です。

今回はページにアクセスする権限への備忘録です。

アプリケーションのアクセス権限について

webアプリケーションをどう使うかによって色々とアクセス権限の仕方があると思います。実際、この記事を書きながら私が作成しているアプリケーションは、自分だけで使用し、さらに見られてもいいものなのでそこまでアクセス権限がどうとかは必要ないのかもです。

ただ、それでも、ネット上に公開されているので、そのURLそのものにアクセス権限を与えていなければ、基本アクセスできてしまうので、編集や作成が誰でもできてしまうと困りものだと思います。

 

例えば、

チームでアプリケーションを使うなら

  • 誰が書いたものかわかること
  • 他人の書いたものは閲覧権限のみ(編集や削除ができない)
  • チーム外の人はそのアプリケーションにアクセスできない

色々な会社が使うなら

  • 会社ごとにアクセス権限を付与
  • アクセス権限がない会社はURLにアクセスできない
  • 全社が見れるお知らせなどのページ
  • 各会社ごとに自分の会社の投稿情報しか見れない
  • ユーザー登録などはアプリの作成元の管理者しかできない

などなど、アクセスの権限は今後色々と考えないといけない。それこそ、アクセスするユーザーの固定IPを登録するなどが必要。

 

ただ、今回は単純な2つのやり方でアプリケーションのアクセスを制限する方法の備忘録

 

1.  @login_required

前回の記事で設定した通りで、アクセス時にログインが必要な箇所にこの一文をつければアクセスしようとするとログインページへ飛ばされる。

 

下記のような形

# ダッシュボードページの作成
@app.route('/dashboard', methods=['GET', 'POST'])
@login_required
def dashboard():
    
    return render_template('dashboard.html')

 

2.  条件分岐でログインページ以外に飛ばす

 

例えば下記のようにcurrent_user.is_authenticatedを使用するとログインの状態を確認して適切なページに飛ばしてくれる。

{% extends "base.html" %}
{% block content %}
<br/>

# ログインの有無を確認
{% if current_user.is_authenticated %}
<h1>ナレッジを編集する</h1>
<br/>
<div class="shadow p-3 mb-5 bg-body rounded">
  <form method="POST">
    {{ form.hidden_tag() }}

    {{ form.k_title.label(class="form-label") }}
    {{ form.k_title(class="form-control") }}
    <br/>

    {{ form.k_content.label(class="form-label") }}
    {{ form.k_content(class="form-control") }}
    <br/>

    {{ form.k_tag.label(class="form-label") }}
    {{ form.k_tag(class="form-control") }}
    <br/>

    {{ form.submit(class="btn btn-secondary") }}
  </form>
</div>

# ログインしていなければフォームではなく編集権限がない旨表示
{% else %}
  <h2>編集権限がありません</h2>
{% endif %}
{% endblock %}

 

3. アプリケーションに条件に沿って実装

今回、自分のアプリケーションへの設定を下記の条件通りに実装

  • ある特定のページ(knowledge.html)だけログインしなくてもアクセスできるようにする。
  • ただし、そのページ(knowledge.html)はログインしていなければ編集ボタンも削除ボタン新規投稿ボタンも表示しないようにする。
  • navbar上には、ログインしていない場合はそのページ(knowledge.html)とログインのリンクのみとする
  • urlがわかってもそのページ(knowledge.html)とログインページ以外アクセスできないようにする

 

■navbarとログインなしでも表示するページには

{% if current_user.is_authenticated %}

{% else %}

{% endif %}

こちらを使用して表示を制限。

 

※ログインしていない場合のnavbar

リンクはknowledgeページとloginページのみ

 

※ログインした場合のnavbar

 

※ログインが必要ないページ(knowledgeページ)

上記のように編集や削除、新規追加のリンクなし

 

※上記のページにログインしてアクセスすると

上記のように編集・削除・新規追加のリンクあり

 

■その他のページは同時に@login_requiredを実装しアクセス不可としました。

上記を実装していない場合、urlが判明すればアクセスできてしまうため。