برنامه نویسی

کنترل دسترسی ساده مرده با iamjs

با پیشرفت و پیچیدگی برنامه های کاربردی وب، نیاز به اقدامات امنیتی پیشرفته نیز افزایش می یابد. یکی از حوزه‌های خاص تمرکز فرآیند مجوز است که کنترل می‌کند چه کسی به چه چیزی در یک برنامه دسترسی دارد. اما چگونه می توانید این را به طور موثر مدیریت کنید؟

معرفی iamjs، یک کتابخانه مجوز قوی و مبتنی بر عملکرد مهندسی شده برای ساده‌سازی فرآیند مجوز شما از طریق یک رویکرد مبتنی بر طرح. iamjs که از چندین ماژول مانند @iamjs/core، @iamjs/express، @iamjs/koa، @iamjs/next و @iamjs/react تشکیل شده است، چیزی برای سازگاری با انواع محیط های برنامه نویسی دارد.

🎉 امکانات:

iamjs یک کتابخانه کنترل دسترسی غنی از ویژگی ها است که عملکرد بالا و طیف گسترده ای از قابلیت ها را ارائه می دهد. با توانمندسازی توسعه دهندگان با ابزارهای کارآمدی که گردش کار آنها را ساده می کند، فرآیند مجوز را متحول می کند. در اینجا برخی از ویژگی های کلیدی است که باعث می شود iamjs برجسته کردن:

  • 🔑 کنترل دسترسی مبتنی بر نقش: iamjs به کاربران اجازه می دهد تا به راحتی نقش ها را با مجوزهای دقیق اختصاص دهند و کنترل دقیقی بر دسترسی به منابع و امنیت را امکان پذیر می کند.
  • 🌐 پشتیبانی از محیط برنامه نویسی همه کاره: با iamjs، می توانید به طور یکپارچه کنترل دسترسی را در محیط های برنامه نویسی مختلف از جمله Express.js، Koa.js، Next.js و React ادغام کنید. این انعطاف پذیری تضمین می کند که بتوانید از آن استفاده کنید iamjs در کل پشته فناوری شما
  • 📝 مجوزهای قابل تنظیم: تنظیم مجوزهای دسترسی به نیازهای خاص شما بسیار آسان است iamjs. شما این آزادی را دارید که مجوزهای سفارشی را برای منابع و اقدامات فردی تعریف و پیکربندی کنید و به شما قدرت ایجاد یک مدل امنیتی قوی را می‌دهد.
  • 🎯 ایمنی نوع: iamjs با TypeScript ساخته شده است که ایمنی نوع را تضمین می کند و احتمال خطا در کد شما را کاهش می دهد.
  • 🧪 تست بدون زحمت: iamjs مجهز به ابزارهای تست جامع است که فرآیند اعتبارسنجی منطق مجوز شما را ساده می کند. این ویژگی تضمین می کند که برنامه شما در طول توسعه ایمن باقی می ماند و به شما آرامش می دهد.

را @iamjs/core ماژول منطق اصلی کتابخانه را فراهم می کند و توسعه دهندگان را با یک جعبه ابزار توانمند می کند که ساخت سیستم های کنترل دسترسی را به یک کار ساده تر تبدیل می کند.

به عنوان مثال، اجازه دهید با تعریف دو نقش شروع کنیم، user و admin، هر دو مجهز به مجوزهای خاص برای اقدامات و منابع مختلف هستند:

import { AuthManager, Role, Schema } from "@iamjs/core";

const roles = {
  user: new Role({
    name: "user",
    config: {
      user: {
        scopes: "-r--l",
        custom: {
          ban: false,
        },
      },
      post: {
        scopes: "crudl",
        custom: {
          publish: true,
        },
      },
    },
  }),
  admin: new Role({
    name: "admin",
    config: {
      user: {
        scopes: "crudl",
        custom: {
          ban: true,
        },
      },
      post: {
        scopes: "crudl",
        custom: {
          publish: true,
        },
      },
    },
  }),
};

const schema = new Schema(roles);
const auth = new AuthManager(schema);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با نقش ها و طرح مجوز تعریف شده، اکنون می توانید از کلاس AuthManager برای انجام بررسی های مجوز بدون زحمت استفاده کنید:

const isAdminAuthorized = auth.authorize({
  role: "admin",
  actions: ["ban", "create"],
  resources: "user",
}); // true

const isUserAuthorized = auth.authorize({
  role: "user",
  actions: ["read", "create"],
  resources: ["post", "user"],
  strict: true,
}); // false
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

🚀 @iamjs/express:

برای علاقمندان Express.js، @iamjs/express یکپارچگی یکپارچه با چارچوب Express.js فراهم می کند. با استفاده از این ماژول، می‌توانید به راحتی میان‌افزاری را برای تخصیص نقش‌ها و بررسی مجوز راه‌اندازی کنید و لایه امنیتی برنامه خود را تنها در چند خط کد تقویت کنید:

import { Role, Schema } from '@iamjs/core';
import { ExpressRoleManager } from '@iamjs/express';
import express from 'express';

const role = new Role({
  name: 'role',
  config: {
    resource1: {
      scopes: 'crudl'
    },
    resource2: {
      scopes: 'cr-dl',
      custom: {
        'create a new user': false
      }
    }
  }
});

const schema = new Schema({
  role
});

const roleManager = new ExpressRoleManager({
  schema: schema,
  onError(_err, _req, res, _next) {
    res.status(403).send('Forbidden');
  },
  onSucess(_req, res, _next) {
    res.status(200).send('Hello World from the success handler!');
  }
});

const app = express();

app.get(
  '/resource1',
  roleManager.check({
    resources: 'resource1', // the resources to be accessed
    actions: ['create', 'update'], // the actions to be performed
    role: 'role',// the role to check
    strict: true // make the checks run in strict mode
    // additionnaly you can construct role from permissions by using the construct option
        construct: true,
        data: async(req){
            return schema.get('role').toObject()
        }
}),
  (_req, res) => {
    res.send('Hello World!');
  }
);

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

☢️ @iamjs/react:

در نهایت، این را در یک تنظیمات React قرار دهید، @iamjs/react بررسی مجوزها در اجزای شما را ساده می کند. یک قلاب زیبا را معرفی می کند – useAuthorize، به شما امکان می دهد رندر مؤلفه را بر اساس نقش های کاربر کنترل کنید:

وارد كردن useAuthorize و createSchema از بسته

import { Role } from "@iamjs/core";
import { createSchema, useAuthorization } from "@iamjs/react";
import { useEffect, useState } from "react";
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

طرح اولیه را با نقش های پیش فرض ایجاد کنید

const schema = createSchema({
  user: new Role({
    name: 'user',
    description: 'User role',
    meta: {
      name: 'user'
    },
    config: {
      books: {
        scopes: 'crudl',
        custom: {
          upgrade: true,
          downgrade: false,
          sort: true
        }
      }
    }
  })

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

قلاب خود را ایجاد کنید تا مجوزهای کاربر را از باطن خود دریافت کنید

const useUser = () => {
  const { build } = useAuthorization(schema);
  const [userRole, setUserRole] = useState(null);

  useEffect(() => {
    // Call the API endpoint to fetch user permissions
    fetch("/permssions")
      .then((response) => response.json())
      .then((data) => {
        // Build the role based on the received permissions
        const builtRole = build(data);
        setUserRole(builtRole);
      })
      .catch((error) => {
        console.error("Error fetching user permissions:", error);
      });
  }, []);

  return userRole;
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از هوک خود برای بررسی مجوزها یا بررسی مجوزهای کاربر یا رندر مولفه ها به صورت مشروط استفاده کنید.

const Component = () => {
  const userRole = useUser();

  if (!userRole) {
    return <div>Loading...</div>;
  }

  const { can, Show } = userRole;

  return (
    <div>
      <div>{can("books", "create").toString()}</div>
      <Show resources="books" actions="create">
        <div>Rendered if user has 'create' permission for 'books'</div>
      </Show>
    </div>
  );
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

علاوه بر این شما استفاده از Show و can روش های مستقیم از useAuthorize و از نقش‌هایی که در طرح ارائه کرده‌اید برای رندر کردن مشروط یا بررسی مجوزهای کاربران استفاده کنید

const { can, Show } = useAuthorization(schema);

const canDo = can("user", "books", "create").toString(); // 'true'

<Show role="user" resources="books" actions="create">
  <div>can show</div>
</Show>;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

📔نتیجه گیری

iamjs یک کتابخانه قدرتمند و همه کاره برای کنترل دسترسی است که فرآیند مجوز را با استفاده از رویکرد مبتنی بر طرحواره ساده می کند. با ویژگی هایی مانند کنترل دسترسی مبتنی بر نقش، مجوزهای قابل تنظیم، و پشتیبانی از انواع محیط های برنامه نویسی، iamjs یک راه حل جامع برای ایجاد برنامه های کاربردی وب ایمن و قوی ارائه می دهد.

برای کسب اطلاعات بیشتر در مورد iamjs، اسناد رسمی را در اینجا بررسی کنید. و اگر علاقه مند به مشارکت در پروژه هستید، به مخزن در GitHub بروید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

همچنین ببینید
بستن
دکمه بازگشت به بالا