2015-10-01 17 views
52

Các phương pháp hay nhất để kiểm tra ủy quyền trước khi lắp đặt thành phần là gì?Cấp phép cho bộ phận phản ứng của bộ định tuyến

tôi sử dụng phản ứng-router 1.x

Dưới đây là tuyến đường của tôi

React.render((
    <Router history={History.createHistory()}> 
    <Route path="/" component={Dashboard}></Route> 
    <Route path="/login" component={LoginForm}></Route> 
    </Router> 
), document.body); 

Đây là thành phần Bảng điều khiển của tôi:

var Dashboard = React.createClass({ 
    componentWillMount: function() { 
    // I want to check authorization here 
    // If the user is not authorized they should be redirected to the login page. 
    // What is the right way to perform this check? 
    }, 

    render: function() { 
    return (
     <h1>Welcome</h1> 
    ); 
    } 
}); 
+3

https://github.com/rackt/react-router/tree/master/examples/auth-flow làm thế nào bạn kiểm tra mặc dù? từ cookie? từ cuộc gọi máy chủ? Tôi nghĩ rằng nó thường được thực hiện trong 'onEnter' của' Route', thay vì 'componentWillMount'. ' Dylan

Trả lời

53

giải pháp cập nhật cho Phản ứng Router v4

<Route 
    path="/some-path" 
    render={() => !isAuthenticated ? 
    <Login/> : 
    <Redirect to="/some-path" /> 
}/> 

Phản ứng router lên để v3

Sử dụng 'OnEnter' sự kiện và trong tầm kiểm soát gọi lại nếu người dùng được phép:

<Route path="/" component={App} onEnter={someAuthCheck}> 

const someAuthCheck = (nextState, transition) => { ... } 
+5

Mọi thứ trở nên tồi tệ hơn về các ví dụ và tài liệu. Ví dụ "auth-flow" không hoạt động đối với tôi và không dễ dàng tìm thấy thông tin về tham số thứ hai của trình xử lý nên chấp nhận để tôi có thể thử những thứ khác nhau. – backdesk

+0

onEnter (nextState, thay thế, gọi lại?) "Được gọi khi một tuyến đường sắp được nhập. Nó cung cấp trạng thái bộ định tuyến tiếp theo và * một hàm * để chuyển hướng đến một đường dẫn khác. . " – backdesk

+0

Bạn có thể trỏ đến tài liệu và phiên bản tôi sẽ thực hiện cập nhật hay không. – Pawel

5

Với phản ứng-router 4 bạn có quyền truy cập vào các Route props bên trong thành phần. Để chuyển hướng người dùng, bạn chỉ cần đẩy URL mới vào lịch sử. Trong ví dụ của bạn, mã sẽ là:

var Dashboard = React.createClass({ 
    componentWillMount: function() { 
    const history = this.props.history; // you'll have this available 
    // You have your user information, probably from the state 
    // We let the user in only if the role is 'admin' 
    if (user.role !== 'admin') { 
     history.push('/'); // redirects the user to '/' 
    } 
    }, 

    render: function() { 
    return (
     <h1>Welcome</h1> 
    ); 
    } 
}); 

Tại các tài liệu, chúng cho thấy another way to do it, bằng cách sử dụng các render bất động sản, thay vì component. Chúng xác định PrivateRoute, làm cho mã rất rõ ràng khi bạn xác định tất cả tuyến đường của mình.

0

Nếu bạn muốn áp dụng ủy quyền trên nhiều thành phần thì bạn có thể làm như thế này.

<Route onEnter={requireAuth} component={Header}> 
    <Route path='dashboard' component={Dashboard} /> 
    <Route path='events' component={Events} /> 
</Route> 

Đối với thành phần duy nhất bạn có thể làm

<Route onEnter={requireAuth} component={Header}/> 

function requireAuth(nextState, replaceState) { 
    if (token || or your any condition to pass login test) 
    replaceState({ nextPathname: nextState.location.pathname }, 
    '/login') 
} 
Các vấn đề liên quan