Eu estava tentando implementar rotas autenticadas, mas descobri que o React Router 4 agora impede que isso funcione:
<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>
O erro é:
Atenção: Você não deve usar
<Route component>
e<Route children>
na mesma rota;<Route children>
será ignorado
Nesse caso, qual é a maneira correta de implementar isso?
Ele aparece nos react-router
documentos (v4) e sugere algo como
<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>
Mas é possível fazer isso agrupando várias rotas?
ATUALIZAR
Ok, depois de alguma pesquisa, descobri o seguinte:
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
}
É correto despachar uma ação, render()
pois parece errado. Realmente não parece correto com componentDidMount
ou algum outro gancho?
javascript
reactjs
react-router
react-router-v4
Jiew Meng
fonte
fonte
componentWillMount
, ele conseguirá ver a saída renderizada mesmo por uma fração de segundo?componentWillMount()
não é chamado no SSR, écomponentDidMount()
que não é chamado. comocomponentWillMount()
é chamado antesrender()
, então o usuário não verá nada do novo componente. portanto, é o melhor lugar para verificar.<Redirect to="/auth">
partir dos documentos em vez de chamar a ação de despachoRespostas:
Você vai querer usar o
Redirect
componente. Existem algumas abordagens diferentes para esse problema. Aqui está um que eu gosto, tem um componente PrivateRoute que leva em umauthed
adereço e então renderiza com base adereços.Agora seus
Route
s podem ser parecidos com esteSe você ainda está confuso, escrevi este post que pode ajudar - Rotas protegidas e autenticação com React Router v4
fonte
<Redirect />
. O problema é<Redirect />
que não parece funcionar com redux no meu caso? Preciso despachar uma açãostate: {from: props.location}}}
causou amaximum call stack exceeded
. Eu tive que removê-lo. Você poderia explicar por que essa opção é útil @Tyler McGinnis?({component: Component, ...rest})
sintaxe. Eu tinha a mesma pergunta lol! stackoverflow.com/a/43484565/6502003Tnx Tyler McGinnis para solução. Eu faço minha ideia a partir da ideia de Tyler McGinnis.
Você pode implementar isso assim
decisãoFunc apenas uma função que retorna verdadeiro ou falso
fonte
(Usando Redux para gerenciamento de estado)
Se o usuário tentar acessar qualquer url, primeiro vou verificar se o token de acesso está disponível, se não redirecionar para a página de login. Assim que o usuário fizer login usando a página de login, armazenamos isso no armazenamento local e também em nosso estado de redux. (armazenamento local ou cookies ... mantemos este tópico fora do contexto por enquanto).
uma vez que redux estado como atualizado e privateroutes serão renderizados novamente. agora temos token de acesso, então vamos redirecionar para a página inicial.
Armazene os dados de carga útil de autorização decodificados também em estado redux e passe-os para o contexto de reação. (Não temos que usar contexto, mas para acessar a autorização em qualquer um de nossos componentes filhos aninhados, torna-se fácil acessar a partir do contexto, em vez de conectar cada um dos componentes filhos ao redux).
Todas as rotas que não precisam de funções especiais podem ser acessadas diretamente após o login. Se precisar de uma função como admin (fizemos uma rota protegida que verifica se ele tinha a função desejada, se não redireciona para o componente não autorizado)
da mesma forma em qualquer um dos seus componentes se você tiver que desabilitar o botão ou algo baseado na função.
simplesmente você pode fazer desta maneira
E daí se o usuário tentar inserir um token fictício no armazenamento local. Como temos token de acesso, redirecionaremos para o componente inicial. Meu componente inicial fará uma chamada de descanso para obter dados, já que o token jwt era fictício, a chamada de descanso retornará o usuário não autorizado. Então, eu chamo o logout (que limpará localstorage e redirecionará para a página de login novamente). Se a página inicial tiver dados estáticos e não fizer nenhuma chamada de api (então você deve ter uma chamada de api de verificação de token no back-end para que possa verificar se o token é REAL antes de carregar a página inicial)
index.js
History.js
Privateroutes.js
checkAuth.js
AMOSTRA DE TOKEN JWT DECODIFICADA
fonte
Signin
? Se um usuário souber que não está conectado, ele deve ter a opção de acessar o Signin diretamente, certo?instalar react-router-dom
em seguida, crie dois componentes, um para usuários válidos e outro para usuários inválidos.
tente isso no app.js
fonte
Com base na resposta de @Tyler McGinnis . Fiz uma abordagem diferente usando a sintaxe ES6 e rotas aninhadas com componentes agrupados:
E usando:
fonte
Eu sei que já faz um tempo, mas estou trabalhando em um pacote npm para rotas privadas e públicas.
Veja como fazer uma rota particular:
E você também pode fazer rotas públicas que apenas usuários não autorizados podem acessar
Espero que ajude!
fonte
Eu implementei usando-
autenticar props será passado para componentes, por exemplo, inscrição usando qual estado do usuário pode ser alterado. AppRoutes completos-
Confira o projeto completo aqui: https://github.com/varunon9/hello-react
fonte
Parece que sua hesitação está em criar seu próprio componente e, em seguida, despachá-lo no método de renderização? Bem, você pode evitar ambos usando apenas o
render
método do<Route>
componente. Não há necessidade de criar um<AuthenticatedRoute>
componente, a menos que você realmente queira. Pode ser tão simples quanto abaixo. Observe a{...routeProps}
propagação, certificando-se de continuar a enviar as propriedades do<Route>
componente para o componente filho (<MyComponent>
neste caso).Consulte a documentação de renderização do React Router V4
Se você deseja criar um componente dedicado, parece que está no caminho certo. Como o React Router V4 é um roteamento puramente declarativo (isso está escrito na descrição), não acho que você se safará colocando seu código de redirecionamento fora do ciclo de vida normal do componente. Olhando para o código do próprio React Router , eles executam o redirecionamento em um
componentWillMount
oucomponentDidMount
dependendo se é ou não renderização do lado do servidor. Aqui está o código abaixo, que é muito simples e pode ajudá-lo a se sentir mais confortável com onde colocar sua lógica de redirecionamento.fonte
Minha resposta anterior não é escalonável. Aqui está o que considero uma boa abordagem-
Suas Rotas-
A ideia é usar um wrapper em
component
adereços que retornaria o componente original se nenhuma autenticação for necessária ou já autenticado, caso contrário, retornaria o componente padrão, por exemplo, Login.fonte
Aqui está a rota limpa e protegida simples
isTokenVerified
é uma chamada de método para verificar o token de autorização basicamente retorna booleano.fonte
Veja como resolvi isso com React e Typescript. Espero que ajude !
fonte
fonte
Eu também estava procurando uma resposta. Aqui todas as respostas são muito boas, mas nenhuma delas dá respostas sobre como podemos usá-lo se o usuário iniciar o aplicativo depois de abri-lo novamente. (Eu quis dizer usando cookies juntos).
Não há necessidade de criar nenhum componente privateRoute diferente. Abaixo está o meu código
E aqui está authComponent
Abaixo eu escrevi um blog, você pode obter uma explicação mais detalhada lá também.
Crie rotas protegidas no ReactJS
fonte
A solução que funcionou melhor para minha organização é detalhada a seguir; ela apenas adiciona uma verificação na renderização para a rota sysadmin e redireciona o usuário para um caminho principal diferente do aplicativo se ele não tiver permissão para estar na página.
SysAdminRoute.tsx
Existem 3 rotas principais para nossa implementação, o público / site, o cliente / aplicativo conectado e as ferramentas de administração de sistema em / sysadmin. Você é redirecionado com base na sua 'autoridade' e esta é a página em / sysadmin.
SysAdminNav.tsx
fonte