Защита страниц в реакции, не блокируя маршрут - PullRequest
0 голосов
/ 26 марта 2020

Следующая проблема: я пытаюсь создать систему аутентификации в реакции, которая позволяет пользователю войти в систему, зарегистрироваться и сбросить пароль. Проблема в том, что я хочу позволить пользователю go определенные маршруты, такие как / profile, но отображать содержимое, если он вошел в систему. Если он не вошел в систему, я хочу просто отобразить панель навигации и небольшой компонент входа ,

До сих пор я пробовал что-то вроде этого: (Чтобы сделать его более читабельным, я пропустил блоки действий)

const Profile = ({ history }) => {
  const [values, setValues] = useState({
    username: "",
    email: "",
    password: ""
  });

  const [isShowingAuth, setIsShowingAuth] = useState(null);

  const { username, email, password } = values;


  useEffect(() => {

    if (!isLoggedIn()) {
      setIsShowingAuth("login");
    } else {
      loadProfileData();
    }
  }, []);

  const loadProfileData = () => {
    const userEmail = isLoggedIn().email;
    const token = getCookie("token");

    axios({
      method: "GET",
      url: `${process.env.REACT_APP_BACKEND_URL}/user`,
      headers: { Authorization: `Bearer ${token}` },
      data: { userEmail }
    })
      .then(response => {
        // Do something
      })
      .catch(error => {
        // Do something
      });
  };

  const handleChange = name => event => {
    setValues({ ...values, [name]: event.target.value });
  };

  const handleUpdateUserSubmit = e => {
    e.preventDefault();

    const token = getCookie("token");

    axios({
      method: "PUT",
      url: `${process.env.REACT_APP_BACKEND_URL}/user/update`,
      headers: { Authorization: `Bearer ${token}` },
      data: { username, password, email }
    })
      .then(response => {
        // Do something 
      })
      .catch(error => {
        // Do something
        }

        store.addNotification({
          ...defaultSettings,
          type: "danger",
          title: "User update error",
          message: error.response.data.errorMsg
        });
      });
  };


  const deleteAccount = () => {
    const token = getCookie("token");

    axios({
      method: "DELETE",
      url: `${process.env.REACT_APP_BACKEND_URL}/user`,
      headers: { Authorization: `Bearer ${token}` }
    })
      .then(response => {
        // Do something
      })
      .catch(error => {
        // Do something
  };

  const showDeleteConfirmation = () => {
      // Do something
  };

  return (
    <Layout isShowingAuth={isShowingAuth}>
      {isLoggedIn() && isLoggedIn().role === "member" ? (
        <>
          <ReactNotifications />
          <h1 className='mt-5 pl-3'>Profile</h1>
          <form className='form col-md-6 mt-3'>
            <div className='form-group'>
              <label>Name</label>
              <input
                type='text'
                className='form-control'
                value={username}
                onChange={handleChange("username")}
              />
            </div>
            <div className='form-group'>
              <label>Email</label>
              <input
                type='email'
                className='form-control'
                value={email}
                onChange={handleChange("email")}
                disabled
              />
            </div>
            <div className='form-group'>
              <label>Password</label>
              <input
                type='password'
                className='form-control'
                value={password}
                onChange={handleChange("password")}
                placeholder='Enter your new password'
                autoComplete='on'
              />
            </div>
            <button type='submit' className='btn btn-outline-primary' onClick={handleUpdateUserSubmit}>
              Update User
            </button>
            <button type='button' className='btn btn-outline-danger ml-3' onClick={showDeleteConfirmation}>
              Delete account
            </button>
            <button type='button' className='btn btn-outline-danger ml-3 mt-2 mt-md-0'>
              Want to change your email?
            </button>
          </form>
          {showAlert}
        </>
      ) : null}
    </Layout>
  );
};

В основном я проверяю метод isLoggedIn(), если пользователь вошел в систему. Если он есть, я хочу визуализировать контент, если нет, я возвращаю только макет. Макет содержит панель навигации.

Проблема теперь в том, что, как только пользователь входит в систему, находясь на маршруте / профиле, компонент не перемонтируется, что означает, что useEffect(()=> {},[]) больше не вызывается и Данные моего профиля не загружены.

Я уже пытался обновить sh страницу после входа в систему через history.push(history.location.pathname), но это также не вызывает перемонтажа.

Мне не интересно, как правильно вызвать перемонтировать после входа в систему, и если способ настройки моей системы аутентификации безопасен или если есть лучшие решения.

Любая помощь / обратная связь приветствуется спасибо:)

...