<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Amit Kumar Rout's blog]]></title><description><![CDATA[Amit Kumar Rout's blog]]></description><link>https://amitkrout.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Tue, 01 Sep 2026 17:24:40 GMT</lastBuildDate><atom:link href="https://amitkrout.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[How to protect routes for different user roles with restricted access?]]></title><description><![CDATA[Introduction
Web applications often require different levels of access for various users. For instance, an administrator may need access to specific features that a regular user may not. One way to manage user access in your web application is by set...]]></description><link>https://amitkrout.hashnode.dev/how-to-protect-routes-for-different-user-roles-with-restricted-access</link><guid isPermaLink="true">https://amitkrout.hashnode.dev/how-to-protect-routes-for-different-user-roles-with-restricted-access</guid><category><![CDATA[React]]></category><category><![CDATA[react router]]></category><category><![CDATA[Node.js]]></category><category><![CDATA[protected-routes]]></category><dc:creator><![CDATA[Amit Kumar Rout]]></dc:creator><pubDate>Tue, 16 Jan 2024 10:14:10 GMT</pubDate><content:encoded><![CDATA[<p><strong>Introduction</strong></p>
<p>Web applications often require different levels of access for various users. For instance, an administrator may need access to specific features that a regular user may not. One way to manage user access in your web application is by setting up protected routes.</p>
<p>In React, we use the 'react-router' package to set up public and protected routes. To install 'react-router' in a React application, you can use the following command: <code>npm i react-router</code>.</p>
<p><strong>Prerequisites</strong></p>
<ol>
<li><p>Knowledge on React,React-Router</p>
</li>
<li><p>node &gt; = 16.19.0</p>
</li>
<li><p>react &gt;= 18.2.0</p>
</li>
<li><p>react-router-dom &gt;= 6.9.0</p>
</li>
</ol>
<p><strong>Protected Route</strong> In most cases, for protected routes, users are logged out automatically if they are not authenticated. However, in a role-based application, if an authenticated user of a different role tries to access a route that is not permitted, the protection mechanism may be violated.</p>
<p>The goal is to redirect the user back to the previous URL if they try to access a route that is not permitted for their role. Firstly, the project file structure</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/auwed3zl1h1az5ohqi8d.png" alt="Project Directory" /></p>
<p>In <code>PageRouter.js</code></p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> {
    BrowserRouter <span class="hljs-keyword">as</span> Router,
    Route,
    Routes,
} <span class="hljs-keyword">from</span> <span class="hljs-string">"react-router-dom"</span>;

<span class="hljs-keyword">import</span> LoginPage <span class="hljs-keyword">from</span> <span class="hljs-string">"../pages/LoginPage"</span>;
<span class="hljs-keyword">import</span> UserRegistration <span class="hljs-keyword">from</span> <span class="hljs-string">"../pages/UserRegistration"</span>;
<span class="hljs-keyword">import</span> AdminPage <span class="hljs-keyword">from</span> <span class="hljs-string">"../pages/admin/AdminPage"</span>
mport UserPage <span class="hljs-keyword">from</span> <span class="hljs-string">"../pages/user/UserPage"</span>

<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> PageRouter = <span class="hljs-function">() =&gt;</span> {

    <span class="hljs-keyword">return</span> (
        <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">Router</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">Routes</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">Route</span> <span class="hljs-attr">exact</span> <span class="hljs-attr">path</span>=<span class="hljs-string">"/"</span> <span class="hljs-attr">element</span>=<span class="hljs-string">{</span>&lt;<span class="hljs-attr">LoginPage</span> /&gt;</span>} /&gt;
                <span class="hljs-tag">&lt;<span class="hljs-name">Route</span> <span class="hljs-attr">exact</span> <span class="hljs-attr">path</span>=<span class="hljs-string">"/userReg"</span> <span class="hljs-attr">element</span>=<span class="hljs-string">{</span>&lt;<span class="hljs-attr">UserRegistration</span> /&gt;</span>} /&gt;
                <span class="hljs-tag">&lt;<span class="hljs-name">Route</span> <span class="hljs-attr">exact</span> <span class="hljs-attr">path</span>=<span class="hljs-string">"/adminPage"</span> <span class="hljs-attr">element</span>=<span class="hljs-string">{</span>&lt;<span class="hljs-attr">AdminPage</span> /&gt;</span>} /&gt;
                <span class="hljs-tag">&lt;<span class="hljs-name">Route</span> <span class="hljs-attr">exact</span> <span class="hljs-attr">path</span>=<span class="hljs-string">"/userPage"</span> <span class="hljs-attr">element</span>=<span class="hljs-string">{</span>&lt;<span class="hljs-attr">UserPage</span> /&gt;</span>} /&gt;
            <span class="hljs-tag">&lt;/<span class="hljs-name">Routes</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">Router</span>&gt;</span></span>
    )
}
</code></pre>
<p><em>Import PageRouter.js in app.js</em></p>
<p>Currently, there are two roles - "Admin" and "User" - for which we have created two files, <code>ProtectedRouteAdmin.js</code> and <code>ProtectedRouteUser.js</code>.</p>
<p>In <code>ProtectedRouteAdmin.js</code></p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> {useEffect} <span class="hljs-keyword">from</span> <span class="hljs-string">"react"</span>;
<span class="hljs-keyword">import</span> { Route,Redirect, Navigate, Outlet, useNavigate, useLocation} <span class="hljs-keyword">from</span> <span class="hljs-string">"react-router-dom"</span>;
<span class="hljs-keyword">import</span> jwtDecode <span class="hljs-keyword">from</span> <span class="hljs-string">"jwt-decode"</span>;
<span class="hljs-keyword">import</span> axios <span class="hljs-keyword">from</span> <span class="hljs-string">"axios"</span>;

<span class="hljs-keyword">const</span> ProtectedRouteAdmin = <span class="hljs-function">(<span class="hljs-params">props</span>) =&gt;</span> {
  <span class="hljs-keyword">const</span> token = <span class="hljs-built_in">localStorage</span>.getItem(<span class="hljs-string">"token"</span>);
  <span class="hljs-keyword">const</span> navigate = useNavigate();
  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">presentPage</span>(<span class="hljs-params"></span>) </span>{
    navigate(<span class="hljs-number">-1</span>);
  }

  <span class="hljs-keyword">if</span> (!token) <span class="hljs-keyword">return</span> <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">Navigate</span> <span class="hljs-attr">to</span>=<span class="hljs-string">"/"</span> /&gt;</span></span>;

  useEffect(<span class="hljs-function">()=&gt;</span>{
    <span class="hljs-keyword">if</span>(token &amp;&amp; jwtDecode(token).role!== <span class="hljs-string">"admin"</span>){ 
      presentPage()
      }
  },[token &amp;&amp; jwtDecode(token).role!== <span class="hljs-string">"admin"</span>])

  <span class="hljs-keyword">const</span> decodedData = jwtDecode(token);


  <span class="hljs-keyword">if</span> (decodedData.role === <span class="hljs-string">"admin"</span>) {
    <span class="hljs-keyword">return</span> <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">Outlet</span> {<span class="hljs-attr">...props</span>} /&gt;</span></span>;
  }
 <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(decodedData.role!==<span class="hljs-string">"admin"</span>){
   presentPage()
  }
};

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> ProtectedRouteAdmin;
</code></pre>
<p>And in <code>ProtectedRouteUser.js</code></p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> {useEffect} <span class="hljs-keyword">from</span> <span class="hljs-string">"react"</span>;
<span class="hljs-keyword">import</span> { Route,Redirect, Navigate, Outlet, useNavigate, useLocation} <span class="hljs-keyword">from</span> <span class="hljs-string">"react-router-dom"</span>;
<span class="hljs-keyword">import</span> jwtDecode <span class="hljs-keyword">from</span> <span class="hljs-string">"jwt-decode"</span>;
<span class="hljs-keyword">import</span> axios <span class="hljs-keyword">from</span> <span class="hljs-string">"axios"</span>;

<span class="hljs-keyword">const</span> ProtectedRouteUser = <span class="hljs-function">(<span class="hljs-params">props</span>) =&gt;</span> {
  <span class="hljs-keyword">const</span> token = <span class="hljs-built_in">localStorage</span>.getItem(<span class="hljs-string">"token"</span>);
  <span class="hljs-keyword">const</span> navigate = useNavigate();
  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">presentPage</span>(<span class="hljs-params"></span>) </span>{
    navigate(<span class="hljs-number">-1</span>);
  }

  <span class="hljs-keyword">if</span> (!token) <span class="hljs-keyword">return</span> <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">Navigate</span> <span class="hljs-attr">to</span>=<span class="hljs-string">"/"</span> /&gt;</span></span>;

  useEffect(<span class="hljs-function">()=&gt;</span>{
    <span class="hljs-keyword">if</span>(token &amp;&amp; jwtDecode(token).role!== <span class="hljs-string">"user"</span>){ 
      presentPage()
      }
  },[token &amp;&amp; jwtDecode(token).role!== <span class="hljs-string">"user"</span>])

  <span class="hljs-keyword">const</span> decodedData = jwtDecode(token);


  <span class="hljs-keyword">if</span> (decodedData.role === <span class="hljs-string">"user"</span>) {
    <span class="hljs-keyword">return</span> <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">Outlet</span> {<span class="hljs-attr">...props</span>} /&gt;</span></span>;
  }
 <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(decodedData.role!==<span class="hljs-string">"admin"</span>){
   presentPage()
  }
};

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> ProtectedRouteUser;
</code></pre>
<p>Updating code in <code>PageRoute.js</code></p>
<pre><code class="lang-javascript"><span class="hljs-comment">//other imports</span>
<span class="hljs-keyword">import</span> ProtectedRouteAdmin <span class="hljs-keyword">from</span> <span class="hljs-string">"./ProtectedRouteAdmin"</span>;
<span class="hljs-keyword">import</span> ProtectedRouteUser <span class="hljs-keyword">from</span> <span class="hljs-string">"./ProtectedRouteUser"</span>;

<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> PageRouter = <span class="hljs-function">() =&gt;</span> {
    <span class="hljs-keyword">return</span> (
        <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">Router</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">Routes</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">Route</span> <span class="hljs-attr">exact</span> <span class="hljs-attr">path</span>=<span class="hljs-string">"/"</span> <span class="hljs-attr">element</span>=<span class="hljs-string">{</span>&lt;<span class="hljs-attr">LoginPage</span> /&gt;</span>} /&gt;
                <span class="hljs-tag">&lt;<span class="hljs-name">Route</span> <span class="hljs-attr">exact</span> <span class="hljs-attr">path</span>=<span class="hljs-string">"/userReg"</span> <span class="hljs-attr">element</span>=<span class="hljs-string">{</span>&lt;<span class="hljs-attr">UserRegistration</span> /&gt;</span>} /&gt;
               <span class="hljs-tag">&lt;<span class="hljs-name">Route</span> <span class="hljs-attr">element</span>=<span class="hljs-string">{</span>&lt;<span class="hljs-attr">ProtectedRouteAdmin</span>/&gt;</span>}&gt;
                  <span class="hljs-tag">&lt;<span class="hljs-name">Route</span> <span class="hljs-attr">exact</span> <span class="hljs-attr">path</span>=<span class="hljs-string">"/adminPage"</span> <span class="hljs-attr">element</span>=<span class="hljs-string">{</span>&lt;<span class="hljs-attr">AdminPage</span> /&gt;</span>} /&gt;
<span class="hljs-tag">&lt;/<span class="hljs-name">Route</span>&gt;</span>
               <span class="hljs-tag">&lt;<span class="hljs-name">Route</span> <span class="hljs-attr">element</span>=<span class="hljs-string">{</span>&lt;<span class="hljs-attr">ProtectedRouteUser</span>/&gt;</span>}&gt;
                  <span class="hljs-tag">&lt;<span class="hljs-name">Route</span> <span class="hljs-attr">exact</span> <span class="hljs-attr">path</span>=<span class="hljs-string">"/usPage"</span> <span class="hljs-attr">element</span>=<span class="hljs-string">{</span>&lt;<span class="hljs-attr">AdminPage</span> /&gt;</span>} /&gt;
<span class="hljs-tag">&lt;/<span class="hljs-name">Route</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">Routes</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">Router</span>&gt;</span></span>
    )
}
</code></pre>
<p><strong>Conclusion</strong> The protected routes have been set up. Test them to ensure they are working correctly by logging in with different user roles and checking if they have access to the appropriate routes. If necessary, you can add Redux to check authorized routes. I hope this helps you to write Protected Routes in a better way! If you have any suggestions for improving the code, please leave them in the comments section. If you found this post helpful, please like and share it.</p>
<p><strong>Happy Coding!</strong></p>
]]></content:encoded></item></channel></rss>