Сазнајте како да комбинујете ове технологије са практичном демонстрацијом.

Контрола приступа заснована на улогама је сигуран механизам аутентификације. Можете га користити да ограничите приступ одређеним ресурсима на кориснике који имају одређене улоге.

Овај тип аутентификације помаже администраторима система да контролишу дозволе у ​​складу са улогама које су одредили корисници. Овај ниво детаљне контроле додаје слој безбедности, омогућавајући апликацијама да спрече неовлашћени приступ.

Имплементација механизма контроле приступа заснованог на улогама помоћу Пасспорт.јс и ЈВТ

Контрола приступа заснована на улогама (РБАЦ) је популаран механизам који се користи за спровођење ограничења приступа у апликацијама на основу корисничких улога и дозвола. Доступне су различите методе за имплементацију РБАЦ механизма.

Два популарна приступа укључују коришћење наменских РБАЦ библиотека као што су АцессЦонтрол или коришћење постојећих библиотека за аутентификацију за имплементацију механизма.

У овом случају, ЈСОН веб токени (ЈВТ) пружају безбедан начин за пренос акредитива за аутентификацију, док Пасспорт.јс поједностављује процес аутентификације пружањем флексибилне аутентификације Миддлеваре.

Користећи овај приступ, можете доделити улоге корисницима и кодирати их у ЈВТ-у када се аутентификују. Затим можете користити ЈВТ да верификујете идентитет и улоге корисника у наредним захтевима, омогућавајући ауторизацију засновану на улогама и контролу приступа.

Оба приступа имају своје предности и могу бити ефикасна у имплементацији РБАЦ-а. Избор између метода за имплементацију зависиће од специфичних захтева вашег пројекта.

Код овог пројекта можете преузети са његовог ГитХуб спремиште.

Подесите пројекат Екпресс.јс

Започети, локално подесите Екпресс.јс пројекат. Када поставите пројекат, наставите и инсталирајте ове пакете:

нпм инсталл цорс дотенв монгоосе цоокие-парсер јсонвебтокен монгодб \
пасош пасош-локални

Следећи, креирајте МонгоДБ базу података или поставите кластер на МонгоДБ Атлас. Копирајте УРИ везе са базом података и додајте га у а .енв датотеку у основном директоријуму вашег пројекта вашег пројекта:

ЦОННЕЦТИОН_УРИ="УРИ везе"

Конфигуришите везу са базом података

У основном директоријуму креирајте нови утилс/дб.јс датотеку и додајте код испод да бисте успоставили везу са МонгоДБ кластером који ради на Атласу користећи Монгоосе.

конст мунгоосе = захтевају('Мунгос');

конст цоннецтДБ = асинц () => {
покушати {
чекати мунгоосе.цоннецт (процесс.енв. ЦОННЕЦТИОН_УРИ);
конзола.Пријава(„Повезано са МонгоДБ-ом!“);
} улов (грешка) {
конзола.еррор(„Грешка при повезивању са МонгоДБ:“, грешка);
}
};

модул.екпортс = цоннецтДБ;

Дефинишите модел података

У основном директоријуму креирајте нови модел/усер.модел.јс датотеку и додајте следећи код да бисте дефинисали модел података за податке корисника користећи Монгоосе.

конст мунгоосе = захтевају('Мунгос');

конст усерСцхема = Нова Мунгос. Шема({
корисничко име: Низ,
Лозинка: Низ,
улога: Низ
});

модул.екпортс = мунгоосе.модел('Корисник', усерСцхема);

Креирајте контролер за крајње тачке АПИ-ја

Створити нова контролери/усер.цонтроллер.јс датотеку у основном директоријуму и додајте код испод.

Прво направите ове увозе:

конст Корисник = захтевају('../моделс/усер.модел');
конст пасош = захтевају('пасош');
конст {генерирајТокен} = захтевају('../миддлеваре/аутх');
захтевају('../миддлеваре/пасспорт')(пасош);

Затим дефинишите логику за управљање регистрацијом корисника и функционалношћу пријављивања:

екпортс.регистерУсер = асинц (рек, рес) => {
конст { корисничко име, лозинка, улога } = рек.боди;

покушати {
чекати Усер.цреате({ корисничко име, лозинка, улога });
рес.статус(201).јсон({ порука: 'Корисник је успешно регистрован' });
} улов (грешка) {
конзола.лог (грешка);
рес.статус(500).јсон({ порука: 'Дошло је до грешке!' });
}
};

екпортс.логинУсер = (рек, рес, следећи) => {
пасспорт.аутхентицате('локални', { седница: лажно }, (ерр, усер, инфо) => {
ако (ерр) {
конзола.лог (ерр);

повратак рес.статус(500).јсон({
порука: „Дошло је до грешке приликом пријављивања“
});
}

ако (!корисник) {
повратак рес.статус(401).јсон({
порука: 'Неважећи акредитиви за пријаву'
});
}

рек.логин (корисник, { седница: лажно }, (ерр) => {
ако (ерр) {
конзола.лог (ерр);

повратак рес.статус(500).јсон({
порука: „Дошло је до грешке приликом пријављивања“
});
}

конст { _ид, корисничко име, улога } = корисник;
конст носивост = { ИД корисник: _ид, корисничко име, улога };
конст токен = ГенерирајТокен (корисно оптерећење);
рес.цоокие('жетон', токен, { хттпОнли: истина });
повратак рес.статус(200).јсон({ порука: 'Пријављивање успешно' });
});
})(рек, рес, нект);
};

Тхе регистерУсер функција управља регистрацијом новог корисника издвајањем корисничког имена, лозинке и улоге из тела захтева. Затим креира нови кориснички унос у бази података и одговара поруком о успеху или грешком ако се појави током процеса.

С друге стране, логинУсер функција олакшава пријављивање корисника коришћењем локалне стратегије аутентификације коју обезбеђује Пасспорт.јс. Он потврђује аутентичност акредитива корисника и враћа токен након успешног пријављивања који се затим чува у колачићу за накнадне провјерене захтјеве. Ако дође до било какве грешке током процеса пријављивања, вратиће одговарајућу поруку.

На крају додајте код који имплементира логику преузимања података свих корисника из базе података. Користићемо ову крајњу тачку као ограничену руту да бисмо обезбедили да само овлашћени корисници са улогом админ може приступити овој крајњој тачки.

екпортс.гетУсерс = асинц (рек, рес) => {
покушати {
конст корисници = чекати Усер.финд({});
рес.јсон (корисници);
} улов (грешка) {
конзола.лог (грешка);
рес.статус(500).јсон({ порука: 'Дошло је до грешке!' });
}
};

Подесите стратегију локалне аутентикације Пасспорт.јс

Да бисте аутентификовали кориснике након што дају своје акредитиве за пријаву, потребно је да подесите локалну стратегију аутентификације.

Створити нова Миддлеваре/пасспорт.јс датотеку у основном директоријуму и додајте следећи код.

конст ЛоцалСтратеги = захтевају('пасош-локални').Стратегија;
конст Корисник = захтевају('../моделс/усер.модел');

модул.екпортс = (пасош) => {
пасош.употреба(
Нова Локална стратегија(асинц (корисничко име, лозинка, готово) => {
покушати {
конст корисник = чекати Усер.финдОне({ корисничко име });

ако (!корисник) {
повратак Готово(нула, лажно);
}

ако (усер.пассворд !== лозинка) {
повратак Готово(нула, лажно);
}

повратак Готово(нула, корисник);
} улов (грешка) {
повратак урађено (грешка);
}
})
);
};

Овај код дефинише локалну стратегију пасспорт.јс за аутентификацију корисника на основу њиховог корисничког имена и лозинке.

У почетку, он поставља упит бази података да пронађе корисника са одговарајућим корисничким именом, а затим наставља да потврђује његову лозинку. Сходно томе, враћа аутентификовани кориснички објекат ако је процес пријављивања успешан.

Направите средњи софтвер за ЈВТ верификацију

Унутар Миддлеваре директоријуму, креирајте нову аутх.јс датотеку и додајте следећи код да бисте дефинисали међуовер који генерише и верификује ЈВТ-ове.

конст јвт = захтевају('јсонвебтокен');
конст сецретКеи = процесс.енв. ТАЈНИ КЉУЧ;

конст генератеТокен = (носивост) => {
конст токен = јвт.сигн (корисни терет, сецретКеи, { Истиче: '1х' });
повратак токен;
};

конст верифиТокен = (обавезна улога) =>(рек, рес, следећи) => {
конст токен = рек.цоокиес.токен;

ако (!токен) {
повратак рес.статус(401).јсон({ порука: „Није обезбеђен токен“ });
}

јвт.верифи (токен, сецретКеи, (ерр, децодед) => {
ако (ерр) {
повратак рес.статус(401).јсон({ порука: 'Неважећи токен' });
}

рек.усерИд = децодед.усерИд;

ако (децодед.роле !== рекуиредРоле) {
повратак рес.статус(403).јсон({
порука: „Немате овлашћење и дозволе за приступ овом ресурсу.“
});
}

следећи();
});
};

модул.екпортс = { генератеТокен, верифиТокен };

Тхе генератеТокен функција креира ЈВТ са одређеним временом истека, док је верифиТокен функција проверава да ли је токен присутан и важећи. Поред тога, он такође потврђује да декодирани токен садржи потребну улогу, у суштини, осигуравајући да само корисници са овлашћеном улогом и дозволама имају приступ.

Да бисте јединствено потписали ЈВТ-ове, морате да генеришете јединствени тајни кључ и додате га у свој .енв датотеку као што је приказано испод.

СЕЦРЕТ_КЕИ="Ово је пример тајног кључа."

Дефинишите АПИ руте

У основном директоријуму, направите нову фасциклу и назовите је рутама. Унутар ове фасцикле направите нову усерРоутес.јс, и додајте следећи код.

конст екпресс = захтевају('изразити');
конст рутер = експрес. Роутер();
конст усерЦонтроллерс = захтевају('../цонтроллерс/усерЦонтроллер');
конст { верифиТокен } = захтевају('../миддлеваре/аутх');

роутер.пост('/апи/регистер', усерЦонтроллерс.регистерУсер);
роутер.пост('/апи/логин', усерЦонтроллерс.логинУсер);

роутер.гет('/апи/усерс', верифиТокен('админ'), усерЦонтроллерс.гетУсерс);

модул.екпортс = рутер;

Овај код дефинише ХТТП руте за РЕСТ АПИ. Тхе корисника руту конкретно, сервере као заштићену руту. Ограничавањем приступа корисницима са админ улогу, ефикасно спроводите контролу приступа засновану на улогама.

Ажурирајте датотеку главног сервера

Отвори свој сервер.јс датотеку и ажурирајте је на следећи начин:

конст екпресс = захтевају('изразити');
конст цорс = захтевају('цорс');
конст цоокиеПарсер = захтевају('цоокие-парсер');
конст апп = екпресс();
конст порт = 5000;
захтевају('дотенв').цонфиг();
конст цоннецтДБ = захтевају('./утилс/дб');
конст пасош = захтевају('пасош');
захтевају('./миддлеваре/пасспорт')(пасош);

цоннецтДБ();

апп.усе (екпресс.јсон());
апп.усе (екпресс.урленцодед({ продужени: истина }));
апп.усе (цорс());
апп.усе (цоокиеПарсер());
апп.усе (пасспорт.инитиализе());

конст усерРоутес = захтевају('./роутес/усерРоутес');
апп.усе('/', усерРоутес);

апп.листен (порт, () => {
конзола.Пријава(`Сервер ради на порту ${порт}`);
});

На крају, покрените развојни сервер да бисте покренули апликацију.

чвор сервер.јс

Искористите РБАЦ механизам да побољшате своје системе аутентификације

Имплементација контроле приступа засноване на улогама је ефикасан начин да се побољша безбедност ваших апликација.

Иако је укључивање постојећих библиотека за аутентификацију за успостављање ефикасног РБАЦ система одличан приступ, коришћење РБАЦ библиотека за експлицитно дефинисање корисничких улога и додељивање дозвола пружа још робусније решење, на крају, побољшавајући укупну безбедност вашег апликација.