

Role-Based Access Control (RBAC) provides a powerful and flexible way to manage access to resources and actions in applications, helping to improve security, ease of use, and scalability. It helps ensure that employees or users can only access the information they should have access to. One of the ways for the developers to create a system with a secure RBAC system is to use functions enabled in ReactJS.
ReactJS is a popular JavaScript library for building user interfaces. One of the key features of ReactJS is the ability to create reusable components that can be easily composed to build complex user interfaces. To support this, ReactJS provides several powerful tools, including hooks.
Hooks in ReactJS
In ReactJS, hooks are functions that allow you to add state and other React features to functional components. They were introduced in React 16.8 and provide an alternative to writing class-based components. Hooks are used to manage the state, handle side effects, and share logic between components, among other things. The most commonly used hooks include useState, useEffect, and useContext. Here’s the basic example of how to use the useState hook:

In addition to the built-in hooks provided by ReactJS, it is possible to create custom hooks. Custom hooks allow you to share logic between components, just like built-in hooks, but with a level of abstraction and reusability that is impossible with traditional component logic.
Custom hooks are JavaScript functions that start with the word “use” and can call other hooks inside. They can accept arguments and return values like any JavaScript function. The important part here is the naming convention.
Authentication and Authorization
Authentication and authorization are two related but distinct concepts in security.
Authentication is the process of verifying the identity of a user. It is concerned with determining whether someone is who they claim to be. This is often done by requiring a user to provide a username and password and then checking that information against a database of registered users. If the information is correct, the user is considered authenticated and is granted access to the system.
On the other hand, authorization is the process of determining what actions an authenticated user is allowed to perform. It is concerned with determining what users can do once they have been authenticated. For example, a user with the role of ADMINISTRATOR might be authorized to access sensitive data. In contrast, a user with the role of GUEST might only be authorized to view public information.
In short, authentication verifies who you are, while authorization determines what you can do.
Keeping that in mind, let’s try to build our role-based authentication in React using custom hooks.

Let’s start with the configuration of our roles, permissions and routes. The following approach with flat objects and enum as role containers is very universal. It provides an easy way to use correct permissions. After typing the function’s name responsible for checking permissions, our IDE will automatically propose available keys. Also, this structure makes it easy to share permissions config across the backend and frontend.

In the example above userRole is fetched from the Redux state, but the place where it’s stored depends on our needs. It could be context, localStorage or some other external state modules as well. The hasPermission function is very straightforward. It takes the permission name and verifies if the user role is permitted to access particular resources.

JSX makes conditional rendering very easy. In the above example, the “&&” operator was used. If the user has permission, the button will be visible. If not – it wouldn’t be rendered in DOM (Document object model). Now let’s protect our routing before accessing inappropriate pages by the wrong person.

The ProtectedRoute component works as a wrapper for our main route component. Its work is to determine whether the user has access to the selected route or not. If the condition is fulfilled, the children component, which, in our case, is a proper page component, will be rendered for the user. If the condition is unfulfilled, the user will be redirected to the home page, as we specified in the Navigate component.

The last step will be to add the ProtectedRoute component in our template model and pass the permissions string as props, and this is it. Simple as that. Our custom hook can be used in any other component in our React application to check proper permissions to resources.
The solutions presented above in the article can be used to help improve the systems with Role-Based Access Control and help ensure that the authentication and authorization are conducted smoothly and securely. ReactJS aids in building a secure environment allowing access for different roles.
Tymon Duraj
Frontend Developer
Frontend developer with experience in Node.js. He is trying to fill his free time with sports activities and improving his development skills.