Как получить доступ к защищенным маршрутам / отключить Auth Guard, зная статус авторизации - PullRequest
3 голосов
/ 20 июня 2020

сценарий : здесь я создаю приложение, в котором в настоящее время у меня есть страница с именем информация о продуктах , где URL-адрес отправляется клиенту, и при нажатии на ссылку он может напрямую откройте эту конкретную страницу продукта и посмотрите информацию, и та же самая страница будет там в приложении.

проблема : здесь я защищаю маршруты с помощью Auth Guard, поэтому без регистрации пользователь не может доступ к странице. Если я отправил тот же URL-адрес страницы пользователю по электронной почте, он должен иметь возможность просматривать только страницу.

Итак, в моем приложении есть:

  1. страница входа
  2. страница продуктов
  3. страница информации о продуктах

Обычно, если пользователь входит в систему, эта страница будет видна, но когда администратор отправит URL-адрес как mobiledot.com / products-info на электронную почту пользователя, пользователь нажимает на нее, и приложение не хочет входить в систему и не хочет отображать информацию о выходе или других страницах только на этой странице c. ниже мой код:

router.module.ts

const routes: Routes = [
  { path: '', component: LoginComponent },
  { path: 'main/:role', component: MainComponent, canActivate: [RouteGuard] },
  { path: 'admin', component: AdminComponent},
  { path: 'user', component: userComponent,canActivate: [RouteGuard]}
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule],
  providers: [RouteGuard]
})
export class AppRoutingModule { }

auth guard

@Injectable()
export class RouteGuard implements CanActivate {

    constructor(private service: accessService, private router: Router) {}

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable<boolean> | Promise<boolean> {
        const isAllowed = this.service.getAuthenticated();
        if (!isAllowed) {
            this.router.navigate(['/']);
        }
        return isAllowed;
    }

}

  

Так что я тоже подумал о некоторых вещах вроде если пользователь входит в приложение. Мой модуль маршрутизатора:

if(user loginin){     
      { path: 'main/:role', component: MainComponent, canActivate: [RouteGuard] },    
    }
     else {
          { path: 'main/:token', component: MainComponent }, 
          ex:  www.mobiledot.com/product-info?toke="ssdsdsdsdSDSD"
}

Возможно ли это или у нас есть другой способ?

Короче говоря, если администратор отправил тот же URL-адрес страницы в приложении, которое защищено защитниками авторизации, в пользователь по электронной почте, затем пользователь щелкнет ссылку и откроет страницу, и он не должен запрашивать логин.

Есть еще одна проблема , которая касается сохраненного токена в localstorage. Итак, прежде чем двигаться, нужно ли нам очистить этот токен и разместить новый, чтобы он не перенаправлялся на главную страницу?

Ответы [ 2 ]

4 голосов
/ 26 июня 2020

Вы имеете в виду, что информация о продуктах должна быть видна зарегистрированным пользователям, так как они могут получить соответствующую ссылку в своей электронной почте, в то время как они могут быть неавторизованными (возможно, по истечении срока действия токена), поэтому вам нужно решение для покрытия это.

Прежде всего, это плохая практика, показывать что-то вроде token в качестве параметра URL. Так что избегайте этого.

Во-вторых, попробуйте использовать правильное решение вместо того, чтобы изменять базовое c поведение в вашем приложении. AuthGuard разработан, чтобы решить, можно ли активировать маршрут . Он использует хранилище браузера, и в случае истечения срока действия токена вы можете только обновить sh его до истечения срока , в противном случае пользователю придется снова войти в систему.

Мое решение создание sth как идентификатор билета, который можно добавить к отправленной ссылке (например, mobiledot.com/products-info/928f5f8b663571b7f3d829921c9079939c2d0319). Вы можете сделать его одноразовым или более действительным для пользователей. хранить его в базе данных и проверять, когда пользователь использует. Таким образом, нет необходимости использовать AuthGuard, просто контролировать права доступа к контенту на стороне сервера.

0 голосов
/ 20 июня 2020

Поскольку у вас есть защита маршрута, вам нужен случай, когда он должен возвращать истину, даже если вы не вошли в систему.

Итак, просто вы можете использовать подход, который вы придумали www.mobiledot.com/product-info?toke= "ssdsdsdsdSDSD" .

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable<boolean> | Promise<boolean> {
// check if there is a query param , like token in the url  and url is your without token one. 
           if(queryParamToken && urlpath === 'view'){
// as you have token hit the api to check if required to check token is a valid one.
or can simply return true as per your need / requirement


 -- checkout this link if you need referece
         } else {

            const isAllowed = this.service.getAuthenticated();
            if (!isAllowed) {
                this.router.navigate(['/']);
            }
            return isAllowed;
  }
        }

Проверить токен с помощью API в Angular8 canActivate метод AuthGuard - проверьте эту ссылку, если вам нужна ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...