अपडेट (अगस्त 16, 2019)
प्रतिक्रिया-राउटर v4 और रिएक्ट हुक का उपयोग करने में यह थोड़ा अलग दिखता है। चलो अपने साथ शुरू करते हैं App.js
।
export default function App() {
const [isAuthenticated, userHasAuthenticated] = useState(false);
useEffect(() => {
onLoad();
}, []);
async function onLoad() {
try {
await Auth.currentSession();
userHasAuthenticated(true);
} catch (e) {
alert(e);
}
}
return (
<div className="App container">
<h1>Welcome to my app</h1>
<Switch>
<UnauthenticatedRoute
path="/login"
component={Login}
appProps={{ isAuthenticated }}
/>
<AuthenticatedRoute
path="/todos"
component={Todos}
appProps={{ isAuthenticated }}
/>
<Route component={NotFound} />
</Switch>
</div>
);
}
Auth
यदि उपयोगकर्ता वर्तमान में प्रमाणित है, तो हम यह जांचने के लिए लाइब्रेरी का उपयोग कर रहे हैं । इसे अपने ऑर्टिकल चेक फंक्शन से बदलें। यदि ऐसा है तो हम isAuthenticated
ध्वज को स्थापित करते हैं true
। हम ऐसा तब करते हैं जब हमारा ऐप पहले लोड होता है। यह भी उल्लेख के लायक है, आप अपने ऐप पर एक लोडिंग साइन जोड़ना चाहते हैं, जबकि दूसरा चेक रन किया जा रहा है, इसलिए जब भी आप पेज को रिफ्रेश करते हैं, तो आप हर बार लॉगिन पेज को फ्लैश नहीं करते हैं।
फिर हम ध्वज को अपने मार्गों से पास करते हैं। हम दो प्रकार के मार्ग बनाते हैं AuthenticatedRoute
और UnauthenticatedRoute
।
इस AuthenticatedRoute.js
तरह दिखता है।
export default function AuthenticatedRoute({ component: C, appProps, ...rest }) {
return (
<Route
{...rest}
render={props =>
appProps.isAuthenticated
? <C {...props} {...appProps} />
: <Redirect
to={`/login?redirect=${props.location.pathname}${props.location.search}`}
/>}
/>
);
}
यह जाँच करता है कि isAuthenticated
क्या सेट किया गया है true
। यदि यह है, तो यह वांछित घटक को प्रस्तुत करेगा। यदि नहीं, तो यह लॉगिन पृष्ठ पर रीडायरेक्ट करेगा।
UnauthenticatedRoute.js
दूसरी ओर इस तरह दिखता है।
export default ({ component: C, appProps, ...rest }) =>
<Route
{...rest}
render={props =>
!appProps.isAuthenticated
? <C {...props} {...appProps} />
: <Redirect to="/" />}
/>;
इस स्थिति में, यदि isAuthenticated
इसे सेट किया जाता है false
, तो यह वांछित घटक प्रदान करेगा। और अगर यह सच है, तो यह आपको मुखपृष्ठ पर भेज देगा।
इसके विस्तृत संस्करण आप हमारे गाइड - https://serverless-stack.com/chapters/create-a-route-that-redirects.html पर पा सकते हैं ।
पुराना संस्करण
स्वीकृत उत्तर सही है लेकिन मिक्सिंस को रिएक्ट टीम द्वारा हानिकारक ( https://facebook.github.io/react/blog/2016/07/13/mixins-considered-harmful.html ) माना जाता है ।
यदि कोई व्यक्ति इस सवाल पर आता है और ऐसा करने के लिए अनुशंसित तरीके की तलाश में है, तो मैं मिक्सिंस के बजाय उच्च आदेश घटकों का उपयोग करने का सुझाव दूंगा।
यहां एचओसी का एक उदाहरण है जो जांच करेगा कि उपयोगकर्ता आगे बढ़ने से पहले लॉग इन है या नहीं। और अगर उपयोगकर्ता लॉग इन नहीं है, तो यह आपको लॉगिन पेज पर रीडायरेक्ट करेगा। यह घटक एक प्रोप नाम से लेता है isLoggedIn
, जो मूल रूप से एक ध्वज है जिसे उपयोगकर्ता द्वारा लॉग इन करने पर आपका एप्लिकेशन यह दर्शाने के लिए स्टोर कर सकता है।
import React from 'react';
import { withRouter } from 'react-router';
export default function requireAuth(Component) {
class AuthenticatedComponent extends React.Component {
componentWillMount() {
this.checkAuth();
}
checkAuth() {
if ( ! this.props.isLoggedIn) {
const location = this.props.location;
const redirect = location.pathname + location.search;
this.props.router.push(`/login?redirect=${redirect}`);
}
}
render() {
return this.props.isLoggedIn
? <Component { ...this.props } />
: null;
}
}
return withRouter(AuthenticatedComponent);
}
और इस HOC का उपयोग करने के लिए, बस इसे अपने मार्गों के चारों ओर लपेटें। आपके उदाहरण के मामले में, यह होगा:
<Route handler={requireAuth(Todos)} name="todos"/>
मैं इस और कुछ अन्य विषयों को एक विस्तृत चरण-दर-चरण ट्यूटोरियल में शामिल करता हूं - https://serverless-stack.com/chapters/create-a-hoc-that-checks-auth.html