質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3302閲覧

Django ユーザごとの個人ページの閲覧制限方法

tramon

総合スコア1

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

1クリップ

投稿2020/08/15 13:45

前提・実現したいこと

Djangoで複数のユーザが使用するアプリケーションを作成しています。
ログインは既にしてるものとして、ユーザIDが付与されたURLにアクセスしたとき、そのIDに該当するユーザ以外は閲覧を拒否したいです。
例)ログインユーザのIDが01の時は、URLが/polls/01のみは開けるが、/polls/02は見れなくする。

発生している問題

これの実現方法として、ログイン中のuserオブジェクトのidと、リクエストしたURLからid部分を抽出して、制限をかけると言った方法は思いついています。
コードとしては以下のような形です。

class HomeView(LoginRequiredMixin, TemplateView): template_name = 'polls/home.html' def get_context_data(self, **kwargs): # request.pathからid部分を抽出('/polls/01'が入ってるので、01だけ取る) url_id = self.request.path.split('/')[-2] # ログイン中のuser_idとurlのidの一致チェック if self.request.user.user_id == url_id: # 正常処理 else # エラー処理 403とかに飛ばす

これで実現できると思うのですが、これは一般的な方法でしょうか?
他にいい方法やDjangoのメソッドがあれば教えていただきたいです。

よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

Python3.8.5
Django3.1.0

退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/08/17 21:50

まず、認証方式がいくつかありますが、古臭いdjangoの標準を仮定します。 最初に行うべきは認証されたユーザーかどうかの確認です。 https://docs.djangoproject.com/ja/3.1/topics/auth/default/#authentication-in-web-requests 上記の例で言えば、 if request.user.is_authenticated: のときに初めてのそのユーザーがそのリソースに対してアクセス権を持っているかどうかの確認をする感じです。今回で言えば、今のページのユーザーであるかどうかですね。 つまりパターンとして3つ。 ・正しい認証ユーザーの正常処理 ・認証されてるけど権限が足りなければ403を表すカスタムページへの遷移処理 ・そもそも認証されてないユーザーならログインページへの遷移処理 が一般的かと思います。
guest

回答2

0

ログインユーザのIDが01の時は、URLが/polls/01のみは開けるが、/polls/02は見れなくする。

関数で書いたらスマートにいける気がします。
Pollsという名前のモデルということにして書きます。

Python

1from django.shortcuts import render, get_object_or_404 2from django.http import Http404 3from django.contrib.auth.decorators import login_required 4 5@login_required 6def fnc(request, id): 7 if id != request.user.id: 8 raise Http404("権限がありません") 9 poll = get_object_or_404(Polls, id=id) 10 return render(request, "polls/home.html", {"poll":poll})

HTML

1<p>{{poll.id}}</p> 2<!-- poll.<フィールド> -->

投稿2020/08/15 22:17

編集2020/08/15 22:24
ForestSeo

総合スコア2722

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ForestSeo

2020/08/15 22:22 編集

get_object_or_404は便利 見つからなかったら404にリダイレクトしてくれます
tramon

2020/08/19 03:04

ありがとうございます。参考になります。
guest

0

ベストアンサー

Railsのタグがあったので開いてしまいましたが、Pythonですね。。。

アクセス管理の考え方はそれで一般的です。アクセス管理のパッケージがあればそれを使うということもありますが(railsならcancancanとか)使わない場合は、質問にある方法で合っています。
ただ、idを得るのにrequest.pathから辿らなくても、「どのデータを表示してくれ」という情報がパラメータで渡ってきてません?そこにidが入っています。

投稿2020/08/15 22:06

winterboum

総合スコア23645

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tramon

2020/08/19 03:04

ありがとうございます。パラメータが別で渡ってきていたので、それで認証ができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問