Я хочу реализовать аутентификацию на основе ролей в моем приложении React ... я храню admin и роли в mongodb
сейчас 1) как получить роль пользователя при входе в приложение ... я сохраняю логин данные в токенах ... которые хранятся в локальном хранилище в браузере, и срок действия каждого токена истекает. Это mon goose Схема
email: {
type: String,
require: true
},
password: {
type: String,
require: true
},
roles: {
type: String,
default: "editor"
}
Это мое приложение реакции. js file
const App = () => {
const { token, login, logout, adminId }= useAuth();
let routes;
if (token) {
routes=(
);
}else{
routes=(
);
}
return(
<AuthContext.Provider
value={{
isLoggedIn: !!token,
token: token,
// editorId: editorId,
adminId: adminId,
login: login,
logout: logout
}}
>
<Router>
<Switch>
{routes}
</Switch>
</Router>
</AuthContext.Provider>
);
};
и это файл контекста аутентификации
import {createContext} from 'react';
export const AuthContext = createContext({
isLoggedIn: false,
adminId: null,
token: null,
login: () =>{},
logout: () =>{}
});
, и я использую casl .. теперь это безопасно для использования или есть лучший способ реализовать роль пользователя в приложении реагирования 2) Как установить роль зарегистрированного пользователя в файл умений casl
Это способность. js file
//ability.js
import { Ability, AbilityBuilder } from "@casl/ability"
import store from "../store/index"
// Defines how to detect object's type
function subjectName(item) {
if (!item || typeof item === "string") {
return item
}
return item.__type
}
const ability = new Ability([], { subjectName });
function defineRulesFor(auth) {
const { can, rules } = AbilityBuilder.extract()
if (auth.role === "editor") {
can("view", "Profile")
}
if (auth.role === "admin") {
can("accept", "Application")
}
if (auth.role === "viewer") {
can("review", "Proposal")
}
return rules
}
export default ability;