correct-apricot
correct-apricot4mo ago

sideMenu default depending of role

Can I set a default resource when the user has a specif role? (or permissions)
2 Replies
kapa.ai
kapa.ai4mo ago
Hi @Jaoc1811. I'm kapa.ai, your friendly support bot. I will try to answer your question by searching through the knowledge base. :wave: ---------------------- Yes, you can set a default resource based on the user's role or permissions in refine. You can use the authProvider's getPermissions() method to fetch user roles. This method is already defined for you by @refinedev/supabase when you bootstrap your refine app with CLI. Here is how the default getPermissions method in authProvider looks like:
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;
};
However, Supabase does not support setting user roles to users in the auth.users table by default. So, you have to set up custom user roles. One way to implement this is with Supabase Custom Claims. Once you have the user roles set up, you can use the Access Control feature to control the visibility of resources based on user roles. For example, in the AccessControlProvider, you can define the can method to check if a user has access to a resource:
accessControlProvider={{
can: async ({ resource, action }) => {
let can = false;
const role = getUserRole();

if (role !== undefined && resource) {
switch (role) {
case 0:
can = resource.startsWith('user/');
break;
case 2:
can = resource.startsWith('admin/');
break;
default:
console.log("Unknown Role");
break;
}
}

return Promise.resolve({ can });
},
}}
accessControlProvider={{
can: async ({ resource, action }) => {
let can = false;
const role = getUserRole();

if (role !== undefined && resource) {
switch (role) {
case 0:
can = resource.startsWith('user/');
break;
case 2:
can = resource.startsWith('admin/');
break;
default:
console.log("Unknown Role");
break;
}
}

return Promise.resolve({ can });
},
}}
In this example, the can method checks if the user's role matches the resource's prefix (either 'user/' or 'admin/'). If it does, the user has access to the resource, and the resource will be visible in the side menu. For more information, you can refer to the following sources: - Authorization Guide in Refine Documentation (https://refine.dev/docs/guides-concepts/authorization#sider) - User Permissions with Supabase in Refine Blog Post (https://refine.dev/blog/refine-pixels-6#user-permissions-with-supabase-in-refine) - Access Control Provider in Refine Documentation (https://refine.dev/docs/api-reference/core/providers/accessControl-provider/) ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ----------------------
kapa.ai
kapa.ai4mo ago
<@110864105035808768> kapa.ai is still learning and improving, please let us know how it did by reacting below