Reputation: 139
I want to make secure routes using authentication. I have defined the routes in App.jsx file. I am using "Route" to define which component to render.
In App.jsx
<Route
path='/dashboard'
exact={true}
render={(props) => <Dashboard {...props} user={user}
handleChildFunc={this.handleChildFunc}/>}
/>
The above code works without any issue. I want to make that secured like below.
<PrivateRoute
path='/dashboard'
exact={true}
render={(props) => <Dashboard {...props} user={user}
handleChildFunc={this.handleChildFunc}/>}
/>
In PrivateRoute.jsx
const PrivateRoute = ( props ) => {
const user = "token from cookie"; // i will fetch token stored in cookie
if(user !== null) {
return <Route />;
}
else {
return <Redirect to="login" />
}
}
If the token is present, render a component. Otherwise, redirect to /login.
Upvotes: 5
Views: 9703
Reputation: 207
Simply !
export default function RouteComponent() {
const user = useContext(UserContext);
return (
<Router>
{user.islogin ? (
<div className="main_container">
<Nav />
<Switch>
<Route exact path="/">
<Home />
</Route>
<Route path="/NewActiv">
<NewActiv />
</Route>
</Switch>
</div>
) : (
<Switch>
<Route exact path="/">
<Login />
</Route>
</Switch>
)}
</Router>
);
}
export default function RouteComponent() {
const user = useContext(UserContext);
return (
<Router>
{user.islogin ? (
<div className="main_container">
<Nav />
<Switch>
<Route exact path="/">
<Home />
</Route>
<Route path="/NewActiv">
<NewActiv />
</Route>
</Switch>
</div>
) : (
<Switch>
<Route exact path="/">
<Login />
</Route>
</Switch>
)}
</Router>
);
}
Upvotes: 2
Reputation: 2838
The accepted answer is good, but it does NOT solve the problem when we need our component to reflect changes in URL.
Say, your component has the following code:
export const Customer = (props) => {
const history = useHistory();
...
}
And you change your URL:
const handleGoToPrev = () => {
history.push(`/app/customer/${prevId}`);
}
import React from 'react';
import { Redirect, Route } from 'react-router-dom';
import store from '../store/store';
export const PrivateRoute = ({ component: Component, ...rest }) => {
let isLoggedIn = !!store.getState().data.user;
return (
<Route {...rest} render={props => isLoggedIn
? (
<Component key={props.match.params.id || 'empty'} {...props} />
) : (
<Redirect to={{ pathname: '/login', state: { from: props.location } }} />
)
} />
)
}
<PrivateRoute exact path="/app/customer/:id" component={Customer} />
Upvotes: 3
Reputation: 20755
You can have your PrivateRoute
like,
<PrivateRoute
path='/dashboard'
exact={true}
component={Dashboard}
handleChildFunc={this.handleChildFunc}
/>
const PrivateRoute = ({ component: Component, handleChildFunc, ...rest }) => {
const user = "token from cookie";
return <Route {...rest} render={(props) => (
user !== null
? <Component {...props} user={user} handleChildFunc={handleChildFunc}/>
: <Redirect to='/login' />
)}
/>
}
Upvotes: 8