2
私はreact、react-router、およびreduxを使用して新しいフロントエンドプロジェクトを設定しようとしていますが、うまく動作し、多くのページで動作するログインワークフローを設定することに悩まされています。ここでreact/reduxの認証ワークフロー
は、私が持っているしたいロジックです:
- は、私がログインしたりないよ場合と言うReduxのストア内の変数を持っています。簡略化すると、
logged: true/false
があるとします。 - ログインページから
logged
がtrueに設定されている場合、リダイレクトされたページにリダイレクトするか、定義されていない場合は/
にリダイレクトします。前の場所はnextPathname
に格納されています。 - authが必要なコンポーネントで
logged
がfalse
に設定されている場合は、/
にリダイレクトします。
このワークフローの主な問題は、アクションを送信し(ログに記録された値を設定して)、リダイレクトしたいということです。
- チェック
logged==true
もし私のログイン・コンポーネントのcomponentWillReceiveProps
で、それはケースだ場合リダイレクト:ここ は、私が調査してきたいくつかの選択肢があります。これはログインワークフローでうまくいきますが、ログアウトコンポーネントのロジックを実装する必要がある場合は、認証が必要なコンポーネントごとに行う必要があります。 (ミックスはES6の反応コンポーネントのおかげでうまくいかない...)。 - ミドルウェアのリダイレクトを処理します。アクションがログインに関するものである場合、アクションを実行してからリダイレクトします。しかし、これがベストプラクティスかどうかは分かりません。
私の質問は、どのように私は制限されているすべてのページであまりにも多くのオーバーヘッドなしで認証作業を行うのですか?
コードのビットは:
app.js:
function requireAuth(nextState, replace) {
if(store.getState().Login.logged === false) {
replace({
pathname: "/login",
state: { nextPathname: nextState.location.pathname }
});
}
}
const history = syncHistoryWithStore(browserHistory, store);
ReactDOM.render(
<Provider store={store}>
<Router history={history}>
<Route path="/" component={Archives} onEnter={requireAuth}></Route>
<Route path="/login" component={LoginComponent}></Route>
</Router>
</Provider>,
document.getElementById("app")
);
LoginComponent:
class LoginComponent extends React.Component<LoginProps, any> {
componentWillReceiveProps(newProps) {
if(newProps.logged) {
let nextPath = "/";
const {location, history} = newProps;
if (location.state && location.state.nextPathname) {
nextPath = location.state.nextPathname;
}
history.pushState({}, nextPath);
}
}
render() {
return <div>This is a login form</div>
}
}
うわーは簡単で簡単に見えます!私はこれを試してみよう! –
あなたが私のアプリを起動するために使用しているので、私がそこに行っている認証フローを改善するために何らかの手段で遭遇した場合はお知らせください。がんばろう! –
チャームのように動作します!ありがとう!私の唯一の提案は、readmeファイルに少しの文書を追加することです。 –