where to obtain the role? if i dont put manually role from localstorage i can't get it?

const role = sessionStorage.getItem("role");

return (
<BrowserRouter>
<RefineKbarProvider>
<ColorModeContextProvider>
<AntdApp>
<Refine
dataProvider={dataProvider(`${backend}`)}
notificationProvider={useNotificationProvider}
routerProvider={routerBindings}
authProvider={authProvider}
accessControlProvider={{
can: async ({ action, params, resource }) => {
const enforcer = await newEnforcer(model, adapter);
if (
action === "delete" ||
action === "edit" ||
action === "show"
) {
return Promise.resolve({
can: await enforcer.enforce(
role,
`${resource}/${params?.id}`,
action
),
});
}
if (action === "field") {
return Promise.resolve({
can: await enforcer.enforce(
role,
`${resource}/${params?.field}`,
action
),
});
}
return {
can: await enforcer.enforce(
role,
resource,
action
),
};
},
}}
const role = sessionStorage.getItem("role");

return (
<BrowserRouter>
<RefineKbarProvider>
<ColorModeContextProvider>
<AntdApp>
<Refine
dataProvider={dataProvider(`${backend}`)}
notificationProvider={useNotificationProvider}
routerProvider={routerBindings}
authProvider={authProvider}
accessControlProvider={{
can: async ({ action, params, resource }) => {
const enforcer = await newEnforcer(model, adapter);
if (
action === "delete" ||
action === "edit" ||
action === "show"
) {
return Promise.resolve({
can: await enforcer.enforce(
role,
`${resource}/${params?.id}`,
action
),
});
}
if (action === "field") {
return Promise.resolve({
can: await enforcer.enforce(
role,
`${resource}/${params?.field}`,
action
),
});
}
return {
can: await enforcer.enforce(
role,
resource,
action
),
};
},
}}
5 Replies
kapa.ai
kapa.ai8mo ago
Hi @M Farhan Zachary. I'm kapa.ai, your friendly support bot. I will try to answer your question by searching through the knowledge base. :wave: ---------------------- To obtain the role dynamically rather than manually setting it in sessionStorage, you can use the authProvider's getPermissions() method. This method is designed to fetch user roles from your authentication provider, such as Supabase. Here is an example of how you can modify your accessControlProvider to use authProvider.getPermissions() to fetch the role:
import { newEnforcer } from "casbin";
import { CanParams, CanReturnType } from "@refinedev/core";
import { adapter, model } from "../casbin/accessControl";
import { authProvider } from "./authProvider";

export const accessControlProvider = {
can: async ({ resource, action, params }: CanParams): Promise<CanReturnType> => {
const role = await authProvider.getPermissions?.();

const enforcer = await newEnforcer(model, adapter);
if (action === "delete" || action === "edit" || action === "show") {
return Promise.resolve({
can: await enforcer.enforce(role, `${resource}/${params?.id}`, action),
});
}
if (action === "field") {
return Promise.resolve({
can: await enforcer.enforce(role, `${resource}/${params?.field}`, action),
});
}
return {
can: await enforcer.enforce(role, resource, action),
};
},
};
import { newEnforcer } from "casbin";
import { CanParams, CanReturnType } from "@refinedev/core";
import { adapter, model } from "../casbin/accessControl";
import { authProvider } from "./authProvider";

export const accessControlProvider = {
can: async ({ resource, action, params }: CanParams): Promise<CanReturnType> => {
const role = await authProvider.getPermissions?.();

const enforcer = await newEnforcer(model, adapter);
if (action === "delete" || action === "edit" || action === "show") {
return Promise.resolve({
can: await enforcer.enforce(role, `${resource}/${params?.id}`, action),
});
}
if (action === "field") {
return Promise.resolve({
can: await enforcer.enforce(role, `${resource}/${params?.field}`, action),
});
}
return {
can: await enforcer.enforce(role, resource, action),
};
},
};
In this example, the role is fetched using authProvider.getPermissions(), which should be defined in your authProvider. Here is an example of how getPermissions might look when using Supabase:
getPermissions: async () => {
const user = await supabaseClient.auth.getUser();

if (user) {
return user.data.user?.role;
}

return null;
};
getPermissions: async () => {
const user = await supabaseClient.auth.getUser();

if (user) {
return user.data.user?.role;
}

return null;
};
Make sure your authProvider is correctly set up to fetch the user roles from your authentication provider. For more details, you can refer to the User Permissions with Supabase in Refine (https://refine.dev/blog/refine-pixels-6/#user-permissions-with-supabase-in-refine) section. By using this approach, you avoid hardcoding roles in sessionStorage and instead fetch them dynamically based on the authenticated user. For further information, you can refer to the accessControlProvider documentation (https://refine.dev/docs/core/refine-component/#accesscontrolprovider) and the Authorization guide (https://refine.dev/docs/guides-concepts/authorization/). ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ----------------------
kapa.ai
kapa.ai8mo ago
<@757407865391808603> kapa.ai is still learning and improving, please let us know how it did by reacting below
adverse-sapphire
adverse-sapphireOP8mo ago
i want to set the role after the login using useGetIdentity, but where should i put the role in my App.tsx? @kapa.ai
kapa.ai
kapa.ai8mo ago
Let me check the knowledge base for you. One moment! :books: ---------------------- To set the role after login using useGetIdentity, you can place the logic in your App.tsx file. You will use the useGetIdentity hook to fetch the user's identity and then set the role accordingly. Here is how you can do it: 1. Import the necessary hooks and components:
import React from "react";
import { BrowserRouter, Route, Routes, Outlet } from "react-router-dom";
import { Refine, useGetIdentity } from "@refinedev/core";
import { ThemedLayoutV2 } from "@refinedev/antd";
import { Header } from "components/header";
import { newEnforcer } from "casbin";
import { adapter, model } from "../casbin/accessControl";
import { authProvider } from "./authProvider";
import React from "react";
import { BrowserRouter, Route, Routes, Outlet } from "react-router-dom";
import { Refine, useGetIdentity } from "@refinedev/core";
import { ThemedLayoutV2 } from "@refinedev/antd";
import { Header } from "components/header";
import { newEnforcer } from "casbin";
import { adapter, model } from "../casbin/accessControl";
import { authProvider } from "./authProvider";
2. Define the App component and use useGetIdentity to fetch the role:
const App: React.FC = () => {
const { data: identity } = useGetIdentity();
const role = identity?.roles?.[0] ?? "guest"; // Default to "guest" if no role is found
return (
<BrowserRouter>
<Refine
authProvider={authProvider}
accessControlProvider={{
can: async ({ resource, action, params }) => {
const enforcer = await newEnforcer(model, adapter);
if (action === "delete" || action === "edit" || action === "show") {
return Promise.resolve({
can: await enforcer.enforce(role, `${resource}/${params?.id}`, action),
});
}
if (action === "field") {
return Promise.resolve({
can: await enforcer.enforce(role, `${resource}/${params?.field}`, action),
});
}
return {
can: await enforcer.enforce(role, resource, action),
};
},
}}
// other providers and configurations
>
<Routes>
<Route
element={
<ThemedLayoutV2 Header={() => <Header role={role} />}>
<Outlet />
</ThemedLayoutV2>
}
>
{/* Define your routes here */}
</Route>
</Routes>
</Refine>
</BrowserRouter>
);
};

export default App;
const App: React.FC = () => {
const { data: identity } = useGetIdentity();
const role = identity?.roles?.[0] ?? "guest"; // Default to "guest" if no role is found
return (
<BrowserRouter>
<Refine
authProvider={authProvider}
accessControlProvider={{
can: async ({ resource, action, params }) => {
const enforcer = await newEnforcer(model, adapter);
if (action === "delete" || action === "edit" || action === "show") {
return Promise.resolve({
can: await enforcer.enforce(role, `${resource}/${params?.id}`, action),
});
}
if (action === "field") {
return Promise.resolve({
can: await enforcer.enforce(role, `${resource}/${params?.field}`, action),
});
}
return {
can: await enforcer.enforce(role, resource, action),
};
},
}}
// other providers and configurations
>
<Routes>
<Route
element={
<ThemedLayoutV2 Header={() => <Header role={role} />}>
<Outlet />
</ThemedLayoutV2>
}
>
{/* Define your routes here */}
</Route>
</Routes>
</Refine>
</BrowserRouter>
);
};

export default App;
3. Ensure your authProvider has the getIdentity method implemented:
import { AuthProvider } from "@refinedev/core";

const authProvider: AuthProvider = {
// other methods
getIdentity: async () => {
const user = localStorage.getItem("auth");
if (user) {
const { email, roles } = JSON.parse(user);
return { email, roles };
}

return null;
},
// other methods
};

export default authProvider;
import { AuthProvider } from "@refinedev/core";

const authProvider: AuthProvider = {
// other methods
getIdentity: async () => {
const user = localStorage.getItem("auth");
if (user) {
const { email, roles } = JSON.parse(user);
return { email, roles };
}

return null;
},
// other methods
};

export default authProvider;
By following these steps, you ensure that the role is dynamically set after login using the useGetIdentity hook. This role is then used in the accessControlProvider to manage access control throughout your application. For more information, you can refer to the useGetIdentity documentation (https://refine.dev/docs/authentication/hooks/use-get-identity/) and the accessControlProvider documentation (https://refine.dev/docs/core/refine-component/#accesscontrolprovider). ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ----------------------
kapa.ai
kapa.ai8mo ago
<@757407865391808603> kapa.ai is still learning and improving, please let us know how it did by reacting below

Did you find this page helpful?