Angular AuthGuard - это правильное решение? - PullRequest
0 голосов
/ 28 апреля 2019

Я хотел бы создать средство защиты маршрутов для защиты маршрутов от неавторизованных пользователей.

Я использую jsonwebtoken для авторизации и в данный момент сохраняю это в localStorage.

Моя идея заключается в том, что когда пользователь хочет получить доступ к защищенному маршруту администратора, authguard отправляет токен для проверки на сервер nodeJS / Express, который после проверки возвращает значение true или 401 (независимо от того, является ли пользователь администратором)на стороне клиента.

служба аутентификации:

isLoggedIn(){
  let headers = new HttpHeaders().set('x-auth-token',localStorage.getItem('token') || '');
  return this.http.post('http://localhost:3000/api/users/check-auth', {}, { headers: headers }).toPromise();
}

служба аутентификации:

canActivate(){
    return this.sign.isLoggedIn().then(res => {return res;}).catch(ex => {return ex});
}

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

Не могли бы вы проверить, является ли это хорошей или плохой идеей, и предложить лучшее решение на стороне безопасности?Большое спасибо!

1 Ответ

1 голос
/ 28 апреля 2019

Хорошей практикой будет управление ролями (или разрешениями) на уровне модели на стороне сервера. Например, класс User может иметь свойство role, например:

auth.service.ts
myUser.roles = ['ROLE_ADMIN']

Таким образом, когда ваш пользователь входит в систему, вы можете сохранить информацию в своем auth.service.ts

// auth.service.ts
get isAdmin() {
    return this.user.roles.includes('ROLE_ADMIN')
}

Обратите внимание, что обычно вы хотите сохранить эту информацию в управлении состоянием вашего приложения, будь то обычные rxjs, ngrx, ngxs ...

Наконец, вы бы добавили AuthInterceptor, который перенаправлял бы вашего пользователя, если ваш API возвращает 401.

...