Verify the active user's permissions in an organization
In general, you should always verify whether or not a user is authorized to access sensitive information, important content, or exclusive features. The most secure way to implement authorization is by checking the active user's role or permissions.
Clerk enables two broad approaches to role and permissions-based authorization:
- Immediately blocking unauthorized users.
- Use the
<Protect>
component to prevent content from rendering if the active user is unauthorized. - Call
auth().protect()
to throw an error if the active user is unauthorized.
- *Configuring custom behavior for unauthorized users.
- The
has()
helper returnsfalse
if the active user lacks the role or permissions you're checking for. You can choose how your app responds without immediately throwing an error or preventing content from rendering.
Authorization in Client Components
The examples below work for both SSR and CSR. Examples are written for Next.js App Router but they are supported by any React meta framework, such as Remix or Gatsby.
The following snippet uses Clerk's <Protect>
component to only render the form for users with the org:team_settings:manage
permission.
The useAuth()
hook can help you access what permissions a user has by using has()
. In the example below, has({ permission: "org:team_settings:manage" })
returns false
if the user does not have the org:team_settings:manage
permission.
The following example uses has()
to inspect a user's permissions granularly. If the user doesn't have the org:team_settings:read
permission, the component returns null
instead of rendering its children.
The following snippet uses <Protect>
's condition
prop to conditionally render its children if the user has the org:team_settings:read
permission.
Authorization in JS SDK
If you are not using React or any of the meta-frameworks we support, there's a good chance that you are using Clerk.js directly. In that case, the following example can help.
You can pass a role
the same way you can pass a permission
in all the examples above.
The following example uses <Protect>
's condition
prop to conditionally render its children if the user is either an org:admin
or an org:billing_manager
.
The following snippet uses useAuth()
to inspect a user's roles granularly. If the user doesn't have either an org:admin
or an org:billing_manager
role, the component returns null
instead of rendering its children.
How to add types for roles and permissions
In order to enhance typesafety in your project, you can define a global ClerkAuthorization
interface, which defines the acceptable values for roles and permissions.
In the example below, ClerkAuthorization
is defined with the default roles that Clerk provides.
Because Clerk supports custom roles and permissions, you can modify ClerkAuthorization
to align with the roles and permissions configured in your Clerk application. See how in the example below, the default Clerk roles org:admin
and org:member
are replaced with custom roles org:super_admin
, org:teacher
, and org:student
.
Feedback
Last updated on