Cập nhật (16 tháng 8, 2019)
Trong react-router v4 và sử dụng React Hooks, điều này trông hơi khác một chút. Hãy bắt đầu với của bạn 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>
);
}
Chúng tôi đang sử dụng một Auth
thư viện để kiểm tra xem người dùng hiện đã được xác thực hay chưa. Thay thế điều này bằng chức năng kiểm tra xác thực của bạn. Nếu vậy thì chúng tôi đặt isAuthenticated
cờ thành true
. Chúng tôi thực hiện việc này khi Ứng dụng của chúng tôi tải lần đầu tiên. Cũng đáng nói hơn, bạn có thể muốn thêm dấu hiệu đang tải trên ứng dụng của mình trong khi quá trình kiểm tra xác thực đang được chạy, vì vậy bạn không nhấp nháy trang đăng nhập mỗi khi làm mới trang.
Sau đó, chúng tôi chuyển cờ cho các tuyến đường của chúng tôi. Chúng tôi tạo ra hai loại tuyến đường AuthenticatedRoute
và UnauthenticatedRoute
.
Các AuthenticatedRoute.js
ngoại hình như thế này.
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}`}
/>}
/>
);
}
Nó kiểm tra nếu isAuthenticated
được đặt thành true
. Nếu đúng như vậy, thì nó sẽ hiển thị thành phần mong muốn. Nếu không, thì nó sẽ chuyển hướng đến trang đăng nhập.
Mặt UnauthenticatedRoute.js
khác trông như thế này.
export default ({ component: C, appProps, ...rest }) =>
<Route
{...rest}
render={props =>
!appProps.isAuthenticated
? <C {...props} {...appProps} />
: <Redirect to="/" />}
/>;
Trong trường hợp này, nếu isAuthenticated
được đặt thành false
, nó sẽ hiển thị thành phần mong muốn. Và nếu nó được đặt thành true, nó sẽ đưa bạn đến trang chủ.
Bạn có thể tìm thấy các phiên bản chi tiết của điều này trên hướng dẫn của chúng tôi - https://serverless-stack.com/cha Chapter/create -a- route - that - redirects.html .
Phiên bản cũ hơn
Câu trả lời được chấp nhận là đúng nhưng Mixin được coi là có hại ( https://facebook.github.io/react/blog/2016/07/13/mixins-considered-harmful.html ) bởi nhóm React.
Nếu ai đó gặp câu hỏi này và đang tìm kiếm cách được khuyến nghị để làm điều này, tôi khuyên bạn nên sử dụng Thành phần thứ tự cao hơn thay vì Mixin.
Đây là một ví dụ về HOC sẽ kiểm tra xem người dùng đã đăng nhập hay chưa trước khi tiếp tục. Và nếu người dùng chưa đăng nhập, thì nó sẽ chuyển hướng bạn đến trang đăng nhập. Thành phần này có một chỗ dựa được gọi là isLoggedIn
, về cơ bản là một cờ mà ứng dụng của bạn có thể lưu trữ để biểu thị nếu người dùng đã đăng nhập.
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);
}
Và để sử dụng HOC này, chỉ cần quấn nó quanh các tuyến đường của bạn. Trong trường hợp ví dụ của bạn, nó sẽ là:
<Route handler={requireAuth(Todos)} name="todos"/>
Tôi đề cập đến vấn đề này và một số chủ đề khác trong hướng dẫn chi tiết từng bước tại đây - https://serverless-stack.com/cha Chapter/create -a-hoc-that-checks- auth.html