شروع کار با Gateman.js برای احراز هویت برنامه Node

ترجمه و تالیف : عرفان کاکایی
تاریخ انتشار : 13 خرداد 98
خواندن در 2 دقیقه
دسته بندی ها : نود جی اس

Gateman.js یک سیستم احراز هویت است، که برای مدیریت Roleها (نقش‌ها) در برنامه‌های Node با استفاده از MongoDB برای ذخیره داده‌ها طراحی شده است. این ابزار به همراه Mongoose کار می‌کند تا یک رویکرد روان برای مدیریت این Roleها و Claimها فراهم کند.

با توجه به این که محور اصلی این آموزش Node.js می‌باشد، بد نیست که دوره مربوطه بر روی راکت را مشاهده نمایید.

جدول محتوا:

  • چرا از Gateman استفاده کنیم؟
  • پیش‌نیازها
  • نصب
  • شروع کار
  • کار با Gateman.js
  • استفاده از Gateman.js به همراه مدل‌های کاربر
  • نتیجه گیری

چرا از Gateman استفاده کنیم؟

  • مدیریت Role ساده را با کد کمتری ممکن می‌سازد.
  • از MongoDB برای احراز هویت Role استفاده می‌کند، که امن‌تر از نشانه‌های وب و sessionها است.

پیش‌نیازها

این مقاله فرض را بر این می‌گذارد که شما Node و Mongoose را بر روی سیستم خود نصب دارید.

نصب

این ابزار به سادگی و با اجرای این دستور نصب می‌شود:

# با استفاده از npm

npm install gatemanjs --save

# یا با استفاده از yarn

yarn add gatemanjs

شروع کار

از آنجایی که Gateman.js یک میان‌افزار است که از Mongoose به عنوان یک dependency‌ استفاده می‌‌کند، ما با استفاده از یک آبجکت ارتباطی Mongoose و به این صورت پکیج Gateman را وارد کرده، و کلاس Gateman را راه‌اندازی می‌کنیم:

var mongoose = require('mongoose');
var gateman = require("gatemanjs").GateMan(mongoose);

کار با Gateman.js

من از یک مثال مدیر و کاربر ساده برای توضیح نحوه کار Gateman.js استفاده خواهم کرد.

نکته:

Roleها: توابع کار متفاوتی در دیتابیس کاربران هستند. Claimها: امتیازات عملکردی یا اعمال شخصی‌ای هستند که می‌توانند به Roleها کمک کنند.

ساخت Roleها و Claimها

Gateman.js برای کاهش میزان کد مورد نیاز برای احراز هویت، با تقسیم مسیرهای احراز هویت به Roleها و Claimها با سینتکس قابل درک کمک می‌کند. ما Roleها را با استفاده از Gateman و به صورت gateman.createRole(roleName); می‌سازیم. در اینجا یک کد نمونه را مشاهده می‌نمایید که نحوه ساخت یک Role مدیر را نشان می‌دهد:

gateman.createRole("admin").then((role)=>{

        console.log(role);

    }).catch((err)=>{

        console.log(err);

    });

همچنین ساخت Claimها هم مشابه به ساخت Roleها است: gateman.createClaim(claimName);. در اینجا یک نمونه کد را مشاهده می‌نمایید که نحوه ساخت یک Claim که حذف کردن را ممکن می‌سازد را نشان می‌دهد:

gateman.createClaim("delete").then((claim)=>{

        console.log(claim);

    }).catch((err)=>{

        console.log(err);

    });

لینک کردن Roleها به Claimها

وقتی که مدیر می‌خواهد امتیاز حذف را داشته باشد، ما به صورت gateman.allow(‘role’).to(‘claim’); آن را لینک می‌کنیم:

gateman.createRole("admin").then(role=>{

    gateman.allow("admin").to("delete").then(result=>{

        //result is true if claim was assigned successfully

    }).catch(err=>{

        //err contains the error message, if any

    });

})

حذف یک Claim از یک Role

در موقعیتی که حساب مدیر به حالت یک کاربر برگردانده شده است، ما می‌توانیم Claim مورد نظر را با این کد حذف کنیم:

gateman.disallow('role').from('claim').then(result=>{

    //result is true if claim was retracted

}).catch(err=>{

    //err contains any error message, if any

});

نکته: اگر Claim‌ مورد نظر به Role مشخص شده اختصاص نیافته باشد، این کد هیچ کاری انجام نمی‌دهد.

و در موقعیتی که اختصاص دادن یک Claim به یک Role را فراموش کرده‌اید، Gateman.js به شما کمک می‌کند تا با استفاده از این کد آن را بررسی کنید:

gateman.role('rolename').can('claimname').then(result=>{

    //result is true if the claim has been assigned, else it will be false

});

//Checking for errors

gateman.role('rolename').can('claimname').then(result=>{

    //you can user result here

}).catch(err=>{

    //err contains error message if any

});

استفاده از Gateman.js به همراه مدل‌های کاربر

با راه‌اندازی مدل کاربر خود به کلاس HasRolesAndClaims از پکیج Gateman.js، کاربر قادر می‌شود تا یک Claim‌ را انجام دهد:

const mogoose = require('mongoose');

const hasRolesAndClaims = require('gatemanjs').hasRolesAndClaims(mogoose);

var UserSchema =  mongoose.Schema({

    name: String,

    email: String

});

UserSchema.loadClass(hasRolesAndClaims);

module.exports = mongoose.model('User',UserSchema)

اجازه دادن به کاربران برای انجام یک Claim

UserModel.findOne({name: "Obinna"}, (err, user)=>{

    user.allow("claim")

        .then((userClaim)=>{

            console.log(userClaim);

        }).catch((err)=>{

            console.log(err);

        });

    });

//Disallowing a user from performing a claim

UserModel.findOne({name: "Obinna"}, (err, user)=>{

    user.disallow("claim")

        .then((message)=>{

            console.log(message);

        }).catch((err)=>{

            console.log(err);

        });

    });

نکته: کلاس hasRoesAndClaim در Gateman.js، در مدل Mongoose معتبر بارگذاری شده است، که یعنی متدها فقط برای آبجکت‌های کاربر معتبر در دسترس هستند.

اعتبارسنجی کنید که‌ آیا کاربر وجود دارد یا نه

UserModel.findOne({name: "Obinna"}, (err, user)=>{

    user.assign("role")

        .then((userRole)=>{

            console.log(userRole);

        }).catch((err)=>{

            console.log(err);

        });

    });

اعتبارسنجی این که آیا یک Claim به درستی به کاربر مناسب اختصاص داده شده است یا نه را می‌‌توانیم به این صورت بررسی کنیم:

User.findOne({name: "Obinna"}, (err, user)=>{

        user.isA("role").then((userHasRole)=>{

            if (userHasRole){

                //user belongs to role

            }

        });

    });

//To verify if a User can perform an claim

User.findOne({name: "Obinna"}, (err, user)=>{

        user.can("claim").then((hasClaim)=>{

            if (userHasClaim){

                //user can perform claim

            }

        });

    });

بازسازی یک Role از یک کاربر

UserModel.findOne({name: "Obinna"}, (err, user)=>{

    user.retract("role")

        .then((message)=>{

            console.log(message);

        }).catch((err)=>{

            console.log(err);

        });

    });

دریافت لیستی از Claimها

ما می‌توانیم لیستی از Claimهای موجود را به این صورت به دست بیاوریم:

gateman.getRoles().then(roles=>{

    //roles is a collection of existing roles

}).catch(err=>{

    //err contains the error message, if any

});

.getRoles() یک تابع callback است که لیست roleها را نشان می‌دهد.

نتیجه گیری

Gateman.js یک کلک خوب برای احراز هویت با کد کمتر بوده، و همچنین متن باز می‌باشد. پیشنهاد می‌کنم که آن را بررسی کرده، و در پروژه مربوطه شرکت کنید.

منبع

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر لازم است ابتدا وارد سایت شوید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید