アリeggフレームワークに基づいてブログを構築する(4)--権限制御


関連記事
アリeggフレームワークに基づくブログ構築(1)——開発準備アリeggフレームワークに基づくブログ構築(2)——Hello Worldアリeggフレームワークに基づくブログ構築(3)——登録と登録アリeggフレームワークに基づくブログ構築(4)——権限制御アリeggフレームワークに基づくブログ構築(5)——トップナビゲーションバーアリeggフレームワークに基づくブログ構築(6)——閲覧、発表文章はアリeggフレームワークに基づいてブログを構築する(7)--文章を編集する
git
https://github.com/ZzzSimon/e...好きならいいね!
本文
前の文章では、ユーザーの登録とログインを実現しました.次に、ユーザー権限を制御する必要があります.例えば、普通のユーザーはコメントしかできません.管理者は文章を発表することができます.最高の管理者はユーザー権限を変更することができます.権限制御は汎用的な機能であるため,この機能をミドルウェアにした.ミドルウェアについて:
公式ドキュメント:https://eggjs.org/zh-cn/basic...
きのうせっけい
  • ユーザー1人につき1ロール
  • は、プロファイル構成によって、あるロールが使用する権限のないページとインタフェース
  • を構成することができる.
  • は、ユーザと権限を検証する必要のないpathを構成することができる.例えば、登録と登録に関するページとインタフェース
  • ログインしてからアクセスできるpathのみ、そうでなければログインページをジャンプします.

  • Userテーブル、role(ロール)フィールドを追加
    プロファイル
    私たちはconfig/config.default.jsには以下の内容が含まれています.
            auth : {
                noAuth:['/login.htm','/user/login','/register.htm','/user/register'],
                noPermission:{
                    admin:[],
                    manager:['/admin.htm'],
                    user:['/admin.htm','/edit.htm']
                }
            }

    そのうち:noAuthノード構成は、認証なしでアクセスできるpath noPermissionノード構成であり、各ロールがアクセスできないpathである
    auth.jsミドルウェアコードapp/middleware/auth.jsファイルを作成します.
    module.exports = (options, app) => {
        return async function auth(ctx, next) {
            //    session   
            if (typeof (ctx.session.user) !== 'undefined') {
                const username = ctx.session.user.username;
                //       ,            ,  :  ,         。  :     ,    redis
                //   ,       session,  :    ,   。  :               session,                
                const role = await ctx.service.user.getRoleByUsername(username);
                const noPerList = options.noPermission[role];
                if (noPerList && !noPerList.includes(ctx.path)) {
                    await next();
                } else {
                    ctx.body = '   ,        !';
                }
                //           
            } else if (options.noAuth.includes(ctx.path)) {
                await next();
                //  session           
            } else {
                ctx.redirect('/login.htm')
            }
        }
    };

    効果
    ユーザーを作成し、ユーザーロールを付与します.プロファイルから、ユーザーロールは/edit.htmパスにアクセスできません.図:
    正規一致
    ページが多ければ多いほど、パラメータ付きpathがダイナミックな場合は、pathをフィルタするルールが必要です.この場合、正則マッチングを使用する必要があります.auth.jsファイルを変更します.
    module.exports = (options, app) => {
        function isNoPer(noPerList,path) {
            for (let i = 0;i

    このとき、プロファイルは正規表現をサポートします.
            auth : {
                noAuth:['/login.htm','/user/login','/register.htm','/user/register'],
                noPermission:{
                    admin:[],
                    manager:['/admin.htm'],
                    user:['/admin.htm','/edit.*']
                }
            }

    の最後の部分
    読み終わって役に立つと思ったら、作者に好きなものをあげてください.ありがとう!