
前の記事では、フォーラムにコメントと返信を実装し、コミュニティのインタラクションを大幅に強化しました。
しかし、インタラクションが増えれば、必然的に対立が生じます。インタラクションが増えるにつれて、コミュニティ管理は私たちが直面しなければならない問題となります。悪意のあるコンテンツが投稿された場合はどうなるでしょうか?
この記事では、基本的なパーミッション管理システムを紹介します。私たちは「管理者」ロールを確立し、コミュニティの秩序を維持するために管理者にユーザーを「禁止」する能力を与えます。
ステップ1:データベースモデルの更新
ユーザーテーブル(users)に2つのフィールドを追加する必要があります。1つは管理者かどうかを識別するため、もう1つは「禁止」されているかどうかをマークするためです。
models.pyを開き、Userモデルを変更します。
models.py(User モデルの更新)
is_adminとis_bannedの2つのフィールドを追加しました。既存のユーザーに影響を与えないように、両方ともdefault=Falseに設定されています。
モデルを更新した後、データベーステーブル構造を手動で更新する必要があります。対応するSQLステートメントは次のとおりです。
データベースの作成にLeapcellを使用している場合、
これらのSQLステートメントをWebベースの操作パネルで直接実行できます。
ステップ2:管理者の手動任命
私たちのフォーラムには、管理者Appointmentsするための「管理者バックエンド」がまだありません。管理者を作成することはまれな要件であるため、データベースを直接操作して、ユーザーを管理者に手動で設定することができます。
データベースで次のコマンドを実行します。
your_usernameを登録したユーザー名に置き換えるのを忘れないでください。
ステップ3:管理者パネルページの作成
管理者がアクセスできるページが必要で、すべてのユーザーとアクションボタンが表示されます。
templatesフォルダにadmin.htmlという新しいファイルを作成します。
templates/admin.html
このページは、すべてのユーザーを反復処理します。ユーザーが管理者でない場合、その横に「禁止」または「禁止解除」ボタンが表示されます。これらのボタンは、これから作成するAPIルートにPOSTリクエスト経由で接続されます。
ステップ4:管理者バックエンドルートの実装
管理者パネルのロジックを処理する新しいルートをmain.pyに追加する必要があります。
main.py(新しいルートと依存関係の追加)
これには以下の主な変更が含まれます。
get_current_userに基づいて、さらにcurrent_user.is_adminがTrueであるかを確認する新しい依存関係get_admin_userを作成しました。- すべてのユーザーをクエリし、
admin.htmlテンプレートをレンダリングするGET /adminルートを作成しました。このルートは、管理者のみがアクセスできるようにDepends(get_admin_user)によって保護されています。 - 特定のユーザーを禁止/禁止解除するための
POST /admin/ban/{user_id}およびPOST /admin/unban/{user_id}ルートを作成しました。
ステップ5:禁止の強制(投稿の防止)
ユーザーは「禁止」とマークできるようになりましたが、そのアクションはまだ影響を受けていません。禁止されたユーザーは引き続き投稿やコメントを作成できます。
アクションを実行する前にユーザーのステータスを確認するために、create_postおよびcreate_commentルートを変更する必要があります。
main.py(create_postとcreate_commentの更新)
これで、禁止されたユーザーが投稿フォームを送信しようとすると、バックエンドはリクエストを拒否し、403エラーを返します。
ステップ6:フロントエンドUIの更新
バックエンドは安全になりましたが、ユーザーエクスペリエンスの観点からは、フロントエンドから投稿およびコメントフォームを非表示にし、管理者にバックエンドへのエントリポイントを提供する必要があります。
templates/posts.html(更新)
templates/post_detail.html(更新)
これには2つの主な変更が含まれます。
posts.htmlヘッダーで、現在のユーザーが管理者(current_user.is_admin)の場合、「管理者パネル」リンクが表示されます。posts.htmlおよびpost_detail.htmlで、元の{% if current_user %}条件が{% if current_user and not current_user.is_banned %}に変更されました。これは、禁止されていないユーザーのみがフォームを見ることができることを意味します。
実行と検証
uvicornサーバーを再起動します。
管理者アカウントにログインします。右上隅に「管理者パネル」リンクが表示されるはずです。
それをクリックして/adminページに移動します。すべてのユーザーのリストが表示され、他のユーザーを禁止できます。
test_userを禁止します。test_userとしてログインしている状態に切り替えると、「新規投稿の作成」フォームが消え、「禁止されています」というメッセージに置き換えられていることに気づくでしょう。
結論
フォーラムに基本的な管理機能を追加しました。is_adminおよびis_bannedフィールドの使用により、ユーザーロールの区別とパーミッション管理をサポートしました。
このフレームワークに基づいて、シャドウバンやログイン禁止などの、より多くの管理機能をさらに拡張できます。
フォーラムのコンテンツが増えるにつれて、ユーザーは関心のある古い投稿を見つけるのに苦労するかもしれません。
これを解決するために、次の記事ではフォーラムに検索機能を追加します。
Xでフォローする:@LeapcellJapan
関連記事:
