(রাষ্ট্র পরিচালনার জন্য রেডাক্স ব্যবহার করা)
ব্যবহারকারী যদি কোনও ইউআরএল অ্যাক্সেস করার চেষ্টা করেন, প্রথমে আমি লগইন পৃষ্ঠায় পুনর্নির্দেশ না করে অ্যাক্সেস টোকেন উপলব্ধ কিনা তা যাচাই করতে যাচ্ছি, একবার ব্যবহারকারী লগইন পৃষ্ঠা ব্যবহার করে লগইন করে, আমরা সেইটিকে স্থানীয় স্টোরেজে পাশাপাশি আমাদের রিডেক্স অবস্থায় সংরক্ষণ করি। (স্থানীয় স্টোরেজ বা কুকিজ..আমাদের জন্য এই বিষয়টিকে প্রসঙ্গের বাইরে রাখি)।
যেহেতু আপডেটেড এবং প্রাইভেটরউটিস হিসাবে রিডেক্স রাজ্যটি পুনরায় সরবরাহ করা হবে। এখন আমাদের অ্যাক্সেস টোকেন রয়েছে তাই আমরা হোম পৃষ্ঠায় পুনর্নির্দেশ করব।
ডিকোডযুক্ত অনুমোদনের পেডলোড ডেটা পাশাপাশি রিডুএক্স অবস্থায় সঞ্চয় করুন এবং প্রসঙ্গে প্রতিক্রিয়া জানাতে এটি পাস করুন। (আমাদের প্রসঙ্গ ব্যবহার করতে হবে না তবে আমাদের যে কোনও নেস্টেড শিশু উপাদানগুলিতে অনুমোদনের অ্যাক্সেসের জন্য প্রসঙ্গ থেকে অ্যাক্সেস করা সহজ করে প্রতিটি শিশু উপাদানকে রেডএক্সের সাথে সংযুক্ত করে) ..
যে সমস্ত রুটে বিশেষ ভূমিকার প্রয়োজন নেই সরাসরি লগইন করার পরে অ্যাক্সেস করা যায় .. যদি অ্যাডমিনের মতো ভূমিকার প্রয়োজন হয় (আমরা একটি সুরক্ষিত রুট তৈরি করেছি যা অননুমোদিত উপাদানগুলিতে পুনর্নির্দেশ না করে তবে তার ইচ্ছা ছিল কিনা তা পরীক্ষা করে নেওয়া হয়)
একইভাবে আপনার যে কোনও উপাদানতে যদি আপনাকে বোতাম বা ভূমিকার উপর ভিত্তি করে কিছু অক্ষম করতে হয়।
সহজভাবে আপনি এইভাবে করতে পারেন
const authorization = useContext(AuthContext);
const [hasAdminRole] = checkAuth({authorization, roleType:"admin"});
const [hasLeadRole] = checkAuth({authorization, roleType:"lead"});
<Button disable={!hasAdminRole} />Admin can access</Button>
<Button disable={!hasLeadRole || !hasAdminRole} />admin or lead can access</Button>
সুতরাং যদি ব্যবহারকারী লোকস্টোরেজে ডামি টোকেন sertোকানোর চেষ্টা করেন। আমাদের কাছে অ্যাক্সেস টোকেন রয়েছে তাই আমরা হোম উপাদানগুলিতে পুনর্নির্দেশ করব। আমার বাড়ির উপাদান ডেটা দখল করার জন্য বিশ্রাম কল করবে, যেহেতু jwt টোকেন ডামি ছিল, বিশ্রাম কলটি অননুমোদিত ব্যবহারকারীকে ফিরিয়ে দেবে। তাই আমি কল লগআউট করি (যা লোকালস্টোরগুলি সাফ করবে এবং আবার লগইন পৃষ্ঠায় পুনর্নির্দেশ করবে)। যদি হোম পৃষ্ঠায় স্থিত ডেটা থাকে এবং কোনও এপিআই কল না করে (তবে আপনার ব্যাকএন্ডে টোকেন-যাচাই করা এপিআই কলটি হওয়া উচিত যাতে আপনি হোম পৃষ্ঠা লোড করার আগে টোকেনটি সত্যই কিনা তা পরীক্ষা করতে পারেন))
index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { Router, Route, Switch } from 'react-router-dom';
import history from './utils/history';
import Store from './statemanagement/store/configureStore';
import Privateroutes from './Privateroutes';
import Logout from './components/auth/Logout';
ReactDOM.render(
<Store>
<Router history={history}>
<Switch>
<Route path="/logout" exact component={Logout} />
<Route path="/" exact component={Privateroutes} />
<Route path="/:someParam" component={Privateroutes} />
</Switch>
</Router>
</Store>,
document.querySelector('#root')
);
History.js
import { createBrowserHistory as history } from 'history';
export default history({});
Privateroutes.js
import React, { Fragment, useContext } from 'react';
import { Route, Switch, Redirect } from 'react-router-dom';
import { connect } from 'react-redux';
import { AuthContext, checkAuth } from './checkAuth';
import App from './components/App';
import Home from './components/home';
import Admin from './components/admin';
import Login from './components/auth/Login';
import Unauthorized from './components/Unauthorized ';
import Notfound from './components/404';
const ProtectedRoute = ({ component: Component, roleType, ...rest })=> {
const authorization = useContext(AuthContext);
const [hasRequiredRole] = checkAuth({authorization, roleType});
return (
<Route
{...rest}
render={props => hasRequiredRole ?
<Component {...props} /> :
<Unauthorized {...props} /> }
/>)};
const Privateroutes = props => {
const { accessToken, authorization } = props.authData;
if (accessToken) {
return (
<Fragment>
<AuthContext.Provider value={authorization}>
<App>
<Switch>
<Route exact path="/" component={Home} />
<Route path="/login" render={() => <Redirect to="/" />} />
<Route exact path="/home" component={Home} />
<ProtectedRoute
exact
path="/admin"
component={Admin}
roleType="admin"
/>
<Route path="/404" component={Notfound} />
<Route path="*" render={() => <Redirect to="/404" />} />
</Switch>
</App>
</AuthContext.Provider>
</Fragment>
);
} else {
return (
<Fragment>
<Route exact path="/login" component={Login} />
<Route exact path="*" render={() => <Redirect to="/login" />} />
</Fragment>
);
}
};
// my user reducer sample
// const accessToken = localStorage.getItem('token')
// ? JSON.parse(localStorage.getItem('token')).accessToken
// : false;
// const initialState = {
// accessToken: accessToken ? accessToken : null,
// authorization: accessToken
// ? jwtDecode(JSON.parse(localStorage.getItem('token')).accessToken)
// .authorization
// : null
// };
// export default function(state = initialState, action) {
// switch (action.type) {
// case actionTypes.FETCH_LOGIN_SUCCESS:
// let token = {
// accessToken: action.payload.token
// };
// localStorage.setItem('token', JSON.stringify(token))
// return {
// ...state,
// accessToken: action.payload.token,
// authorization: jwtDecode(action.payload.token).authorization
// };
// default:
// return state;
// }
// }
const mapStateToProps = state => {
const { authData } = state.user;
return {
authData: authData
};
};
export default connect(mapStateToProps)(Privateroutes);
checkAuth.js
import React from 'react';
export const AuthContext = React.createContext();
export const checkAuth = ({ authorization, roleType }) => {
let hasRequiredRole = false;
if (authorization.roles ) {
let roles = authorization.roles.map(item =>
item.toLowerCase()
);
hasRequiredRole = roles.includes(roleType);
}
return [hasRequiredRole];
};
JWT টোকেন নমুনা বাতিল
{
"authorization": {
"roles": [
"admin",
"operator"
]
},
"exp": 1591733170,
"user_id": 1,
"orig_iat": 1591646770,
"email": "hemanthvrm@stackoverflow",
"username": "hemanthvrm"
}