Once you done configure keycloak with react using keycloak adapter you can use keycloak default functions to create protected routes based on realm roles , client roles , user privileges , resource type.
below i share react code to demonstrate the inbuilt functions in keycloak-js library
to use library
npm i keycloak-js@12.0.1
import './App.css'; import { BrowserRouter as Router, Switch, Route, Link } from "react-router-dom"; import ClientAdmin from './component/ClientAdmin'; import ClientUser from './component/ClientUser'; import RealmAdmin from './component/RealmAdmin'; import SuperAdmin from './component/SuperAdmin'; import Unprotected from './component/Unprotected'; import Protected from './component/Protected'; import NoPermission from './component/NoPermission'; function App(props) { return ( <Router> <div className="main-container"> <nav> <h1>Demo App</h1> <p>Note : You will only see navigation menu based on your user privileges assigned by keycloak</p> <button onClick={()=>props.keycloak.logout()}>LOGOUT</button> <ul> <li> <Link to="/unprotected">Unprotected</Link> </li> <li> {props.keycloak.hasResourceRole('client1-admin') && !!props.keycloak.token ? <Link to="/client1-admin">client1-admin</Link>: <span> /client1-admin [no access] </span>} </li> <li> {props.keycloak.hasResourceRole('client1-user') && !!props.keycloak.token ? <Link to="/client1-user">Client1-User</Link>:<span> /client1-user [no access] </span>} </li> <li> {props.keycloak.hasRealmRole('realm-client1') && !!props.keycloak.token ? <Link to="/realm-client">Realm-client1</Link>:<span> /realm-client [no access] </span>} </li> <li> {props.keycloak.hasRealmRole('super-admin') && !!props.keycloak.token ? <Link to="/super-admin">Super-Admin</Link>:<span> /super-admin [no access] </span>} </li> <li> {props.keycloak.hasResourceRole('client1-admin') && props.keycloak.hasRealmRole('realm-client1') && !!props.keycloak.token ? <Link to="/protected">Protected</Link>:<span> /protected [no access] </span>} </li> </ul> </nav> <h1>kEYCLOAK DEMO : SEE COMPONENT CHANGE BELOW</h1> {/* A <Switch> looks through its children <Route>s and renders the first one that matches the current URL. */} <Switch> <Route path="/unprotected"> <Unprotected/> </Route> <Route path="/client1-admin"> {props.keycloak.hasResourceRole('client1-admin') && !!props.keycloak.token ? <ClientAdmin/> : <NoPermission/> } </Route> <Route path="/client1-user"> {props.keycloak.hasResourceRole('client1-user') && !!props.keycloak.token ?<ClientUser/>: <NoPermission/> } </Route> <Route path="/realm-client"> {props.keycloak.hasRealmRole('realm-client1') && !!props.keycloak.token ?<RealmAdmin/>: <NoPermission/> } </Route> <Route path="/super-admin"> {props.keycloak.hasRealmRole('super-admin') && !!props.keycloak.token ?<SuperAdmin/>: <NoPermission/> } </Route> <Route path="/protected"> {props.keycloak.hasResourceRole('client1-admin') && props.keycloak.hasRealmRole('realm-client1') && !!props.keycloak.token ? <Protected/>: <NoPermission/> } </Route> </Switch> </div> </Router> ); } export default App;
Top comments (0)