Как мне ограничить определенные пути на моей веб-странице, ограниченные admin? [React, Firebase для авторизации]

#reactjs #firebase-authentication

#reactjs #firebase-аутентификация

Вопрос:

Я пытаюсь создать веб-приложение для управления студентами. В том же приложении есть раздел «путь / администратор». Я хочу знать, как мне ограничить доступ к этой странице только для нескольких пользователей.

Моя идея заключается в том, что я извлекаю uid пользователя и сохраняю его в коде (звучит небезопасно). При входе в систему я проверяю его с помощью …. «if(CurrentUser.uid === storedAdminUid) {path / admin} else {path / student}».

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

Ответ №1:

Есть много способов, как вы можете этого добиться, мне особенно нравится тот, который предложил Робин Вирух в своей удивительной статье об использовании React с Firebase. Но здесь биты, связанные с вашим вопросом:

 import React, { useContext, useEffect } from "react";
import { useHistory } from "react-router-dom";
import * as ROUTES from "../../constants/routes";
import { FirebaseContext } from "../../firebase";
import useAuthUser from "./useAuthUser";

const withAuthorization = condition => Component => {
  function WithAuthorization(props) {
    const firebase = useContext(FirebaseContext);
    const user = useAuthUser();
    const history = useHistory();

    useEffect(() => {
      const releaseAuthListener = firebase.onAuthUserListener(
        authUser => {
          if (!condition(authUser)) {
            history.push(ROUTES.SIGN_IN);
          }
        },
        () => {
          history.push(ROUTES.SIGN_IN);
        }
      );

      return () => releaseAuthListener();
    }, []);

    return condition(user) amp;amp; <Component {...props} />;
  }

  return WithAuthorization;
};

export default withAuthorization;
  

Здесь у нас есть withAuthorization HOC, который в основном обертывает компонент в условие для доступа к этому компоненту.

Вот как мы можем это использовать:

 function AccountPage() {
    const authUser = useAuthUser();

    if(!authUser) return <h1>User Unknown</h1>

    return (
        <div>
            <h1>Account: {authUser.email}</h1>
            {/* <PasswordForgetForm />
            <PasswordChangeForm /> */}
        </div>
    )
}

const condition = authUser => !!authUser;

export default withAuthorization(condition)(AccountPage);
  

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

 function AdminPage() {
   // ... IMPLEMENTATION
}    

const condition = authUser => authUser amp;amp; !!authUser.roles[ROLES.ADMIN];
    
export default withAuthorization(condition)(AdminPage);
  

Здесь мы разрешаем доступ не только при аутентификации пользователя, но и при авторизации пользователя, поскольку для этого пользователя установлена определенная роль.

Пожалуйста, взгляните на этот репозиторий, где вы можете увидеть все в контексте. И прочитайте оригинальную статью Робина.

Также, я думаю, вы можете упростить еще больше, просто использовать хуки, не записывая HOC.