Saya mencoba menerapkan rute yang diautentikasi tetapi menemukan bahwa React Router 4 sekarang mencegah ini berfungsi:
<Route exact path="/" component={Index} />
<Route path="/auth" component={UnauthenticatedWrapper}>
<Route path="/auth/login" component={LoginBotBot} />
</Route>
<Route path="/domains" component={AuthenticatedWrapper}>
<Route exact path="/domains" component={DomainsIndex} />
</Route>
Kesalahannya adalah:
Peringatan: Anda tidak boleh menggunakan
<Route component>
dan<Route children>
di rute yang sama;<Route children>
akan diabaikan
Dalam hal ini, bagaimana cara yang benar untuk mengimplementasikannya?
Itu muncul di react-router
(v4) dokumen, itu menyarankan sesuatu seperti
<Router>
<div>
<AuthButton/>
<ul>
<li><Link to="/public">Public Page</Link></li>
<li><Link to="/protected">Protected Page</Link></li>
</ul>
<Route path="/public" component={Public}/>
<Route path="/login" component={Login}/>
<PrivateRoute path="/protected" component={Protected}/>
</div>
</Router>
Tetapi apakah mungkin untuk mencapai ini sambil mengelompokkan sekelompok rute bersama?
MEMPERBARUI
Oke, setelah beberapa penelitian, saya menemukan ini:
import React, {PropTypes} from "react"
import {Route} from "react-router-dom"
export default class AuthenticatedRoute extends React.Component {
render() {
if (!this.props.isLoggedIn) {
this.props.redirectToLogin()
return null
}
return <Route {...this.props} />
}
}
AuthenticatedRoute.propTypes = {
isLoggedIn: PropTypes.bool.isRequired,
component: PropTypes.element,
redirectToLogin: PropTypes.func.isRequired
}
Apakah benar mengirim tindakan di render()
dalamnya terasa salah. Ini tidak benar-benar terlihat benar dengan componentDidMount
atau beberapa kait lain juga?
javascript
reactjs
react-router
react-router-v4
Jiew Meng
sumber
sumber
componentWillMount
, apakah mereka akan pernah melihat keluaran yang diberikan bahkan untuk sepersekian detik?componentWillMount()
tidak disebut di SSR, itucomponentDidMount()
yang tidak disebut. seperticomponentWillMount()
yang dipanggil sebelumnyarender()
, sehingga pengguna tidak akan melihat apa pun dari komponen baru. jadi ini adalah tempat terbaik untuk diperiksa.<Redirect to="/auth">
dari dokumen alih-alih memanggil tindakan pengirimanJawaban:
Anda akan ingin menggunakan
Redirect
komponen tersebut. Ada beberapa pendekatan berbeda untuk masalah ini. Ini yang saya suka, memiliki komponen PrivateRoute yang mengambilauthed
prop dan kemudian merender berdasarkan props itu.Sekarang
Route
s Anda dapat terlihat seperti iniJika Anda masih bingung, saya menulis posting ini yang mungkin membantu - Rute terlindungi dan otentikasi dengan React Router v4
sumber
<Redirect />
. Masalahnya adalah<Redirect />
tampaknya tidak berfungsi dengan redux dalam kasus saya? Saya perlu mengirimkan tindakanstate: {from: props.location}}}
menyebabkan amaximum call stack exceeded
. Saya harus menghapusnya. Bisakah Anda menjelaskan mengapa opsi ini berguna @Tyler McGinnis?({component: Component, ...rest})
sintaks. Saya punya pertanyaan yang sama lol! stackoverflow.com/a/43484565/6502003Tnx Tyler McGinnis untuk solusinya. Saya membuat ide saya dari ide Tyler McGinnis.
Anda dapat menerapkannya seperti ini
decisionFunc hanya sebuah fungsi yang mengembalikan true atau false
sumber
(Menggunakan Redux untuk manajemen negara)
Jika pengguna mencoba mengakses url apa pun, pertama-tama saya akan memeriksa apakah token akses tersedia, jika tidak dialihkan ke halaman login, Setelah pengguna masuk menggunakan halaman login, kami menyimpannya di penyimpanan lokal dan juga di status redux kami. (penyimpanan lokal atau cookie..kami merahasiakan topik ini dari konteksnya untuk saat ini).
karena status redux sebagai diperbarui dan privateroutes akan dirender. sekarang kami memiliki token akses sehingga kami akan mengarahkan ke halaman beranda.
Simpan juga data payload otorisasi yang didekode dalam status redux dan teruskan ke konteks reaksi. (Kami tidak harus menggunakan konteks tetapi untuk mengakses otorisasi di salah satu komponen turunan bersarang kami, ini memudahkan akses dari konteks alih-alih menghubungkan setiap komponen turunan ke redux) ..
Semua rute yang tidak memerlukan peran khusus dapat diakses langsung setelah login .. Jika membutuhkan peran seperti admin (kami membuat rute yang dilindungi yang memeriksa apakah dia memiliki peran yang diinginkan jika tidak dialihkan ke komponen yang tidak sah)
Demikian pula di salah satu komponen Anda jika Anda harus menonaktifkan tombol atau sesuatu berdasarkan peran.
sederhana yang dapat Anda lakukan dengan cara ini
Jadi bagaimana jika pengguna mencoba memasukkan token dummy di penyimpanan lokal. Karena kami memiliki token akses, kami akan mengarahkan ke komponen rumah. Komponen rumah saya akan membuat panggilan istirahat untuk mengambil data, karena token jwt adalah dummy, panggilan istirahat akan mengembalikan pengguna yang tidak sah. Jadi saya memanggil logout (yang akan menghapus penyimpanan lokal dan mengarahkan ke halaman login lagi). Jika halaman beranda memiliki data statis dan tidak melakukan panggilan api apa pun (maka Anda harus memiliki panggilan api verifikasi-token di backend sehingga Anda dapat memeriksa apakah token itu NYATA sebelum memuat halaman beranda)
index.js
History.js
Privateroutes.js
checkAuth.js
CONTOH JWT TOKEN DEKODASI
sumber
Signin
? Jika pengguna tahu dia tidak masuk, dia seharusnya memiliki opsi untuk langsung mengakses Masuk, bukan?instal react-router-dom
lalu buat dua komponen, satu untuk pengguna valid dan lainnya untuk pengguna tidak valid.
coba ini di app.js
sumber
Berdasarkan jawaban dari @Tyler McGinnis . Saya membuat pendekatan berbeda menggunakan sintaks ES6 dan rute bersarang dengan komponen yang dibungkus:
Dan menggunakannya:
sumber
Saya tahu ini sudah lama tetapi saya telah mengerjakan paket npm untuk rute pribadi dan umum.
Berikut cara membuat rute pribadi:
Dan Anda juga dapat membuat rute Umum yang hanya dapat diakses oleh pengguna yang tidak sah
Saya harap ini membantu!
sumber
Saya menerapkan menggunakan-
alat peraga otentikasi akan diteruskan ke komponen misalnya pendaftaran menggunakan status pengguna mana yang dapat diubah. AppRoutes lengkap-
Periksa proyek lengkapnya di sini: https://github.com/varunon9/hello-react
sumber
Tampaknya ragu-ragu Anda dalam membuat komponen Anda sendiri dan kemudian mengirimkannya ke metode render? Anda bisa menghindari keduanya dengan hanya menggunakan
render
metode<Route>
komponen. Tidak perlu membuat<AuthenticatedRoute>
komponen kecuali Anda benar-benar menginginkannya. Ini bisa sesederhana di bawah ini. Perhatikan{...routeProps}
penyebarannya dengan memastikan Anda terus mengirim properti<Route>
komponen ke komponen anak (<MyComponent>
dalam kasus ini).Lihat dokumentasi render React Router V4
Jika Anda memang ingin membuat komponen khusus, sepertinya Anda berada di jalur yang benar. Karena React Router V4 adalah perutean deklaratif murni (dikatakan begitu tepat dalam deskripsi) saya rasa Anda tidak akan lolos dengan meletakkan kode pengalihan di luar siklus hidup komponen normal. Melihat kode untuk React Router itu sendiri , mereka melakukan pengalihan di salah satu
componentWillMount
ataucomponentDidMount
tergantung pada apakah itu rendering sisi server atau tidak. Berikut adalah kode di bawah ini, yang cukup sederhana dan mungkin membantu Anda merasa lebih nyaman dengan tempat meletakkan logika pengalihan Anda.sumber
Jawaban saya sebelumnya tidak dapat diskalakan. Inilah yang menurut saya pendekatan yang baik-
Rute Anda-
Idenya adalah menggunakan pembungkus dalam
component
props yang akan mengembalikan komponen asli jika tidak ada auth diperlukan atau sudah diautentikasi jika tidak akan mengembalikan komponen default misalnya Login.sumber
Berikut adalah rute sederhana yang dilindungi dan bersih
isTokenVerified
adalah panggilan metode untuk memeriksa token otorisasi yang pada dasarnya mengembalikan boolean.sumber
Inilah cara saya menyelesaikannya dengan React dan Typecript. Semoga membantu!
sumber
sumber
Saya juga mencari jawaban. Di sini semua jawaban cukup bagus, tetapi tidak ada yang memberikan jawaban bagaimana kami dapat menggunakannya jika pengguna memulai aplikasi setelah membukanya kembali. (Maksud saya menggunakan cookie bersama-sama).
Tidak perlu membuat Komponen privateRoute yang berbeda. Di bawah ini adalah kode saya
Dan inilah authComponent
Di bawah saya telah menulis blog, Anda juga bisa mendapatkan penjelasan yang lebih mendalam di sana.
Buat rute yang dilindungi di ReactJS
sumber
Solusi yang pada akhirnya bekerja paling baik untuk organisasi saya dirinci di bawah ini, itu hanya menambahkan pemeriksaan pada render untuk rute sysadmin dan mengarahkan pengguna ke jalur utama aplikasi yang berbeda jika mereka tidak diizinkan untuk berada di halaman.
SysAdminRoute.tsx
Ada 3 rute utama untuk implementasi kami, publik / situs, klien / aplikasi yang masuk, dan alat admin sys di / sysadmin. Anda dialihkan berdasarkan 'keaslian' Anda dan ini adalah halaman di / sysadmin.
SysAdminNav.tsx
sumber