更新(2019年8月16日)
react-routerv4とReactHooksを使用すると、これは少し異なります。あなたのから始めましょう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
ます。これは、アプリが最初に読み込まれるときに行います。また、認証チェックの実行中にアプリに読み込みサインを追加して、ページを更新するたびにログインページをフラッシュしないようにすることもできます。
次に、フラグをルートに渡します。2種類のルート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
と、目的のコンポーネントがレンダリングされます。また、trueに設定されている場合は、ホームページに移動します。
この詳細なバージョンは、ガイド(https://serverless-stack.com/chapters/create-a-route-that-redirects.html)にあります。
古いバージョン
受け入れられた答えは正しいですが、MixinsはReactチームによって有害であると見なされます(https://facebook.github.io/react/blog/2016/07/13/mixins-considered-harmful.html)。
誰かがこの質問に出くわし、これを行うための推奨される方法を探している場合は、Mixinの代わりに高次コンポーネントを使用することをお勧めします。
これは、続行する前にユーザーがログインしているかどうかを確認するHOCの例です。また、ユーザーがログインしていない場合は、ログインページにリダイレクトされます。このコンポーネントは、と呼ばれる小道具を取ります。これ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