Я использую Angular 15, я поддерживаю маршруты пользователей, как показано ниже. Защита работает очень хорошо, но есть небольшая проблема. Страница по-прежнему открывается, если у пользователя нет привилегии «CompanyRole».
Итак, если у пользователя нет авторизации, как я могу заставить console.info(' ') написать сообщение в консоли?
Я исследовал эту ситуацию в течение недели, но я никак не мог решить ее.
приложение-routing.module.ts
const routes: Routes = [
{
path: '', component: AppLayoutComponent,
children: [
{ path: '', loadChildren: () => import('./applications/components/dashboard/dashboard.module').then(m => m.DashboardModule), canActivate: [RoleGuard], data: {roles: ['DashboardRole', 'AdminRole'] } },
{ path: 'company', loadChildren: () => import('./applications/components/company/company.module').then(m => m.CompanyModule), canActivate: [RoleGuard], data: {roles: ['CompanyRole'] }},
{ path: 'inventory', loadChildren: () => import('./applications/components/inventory/inventory.module').then(m => m.InventoryModule) },
{ path: 'category', loadChildren: () => import('./applications/components/category/category.module').then(m => m.CategoryModule), canActivate: [RoleGuard], data: {roles: ['CategoryRole'] }},
{ path: 'brand', loadChildren: () => import('./applications/components/brand/brand.module').then(m => m.BrandModule), canActivate: [RoleGuard], data: {roles: ['BrandRole'] } }
],
},
{ path: 'auth', loadChildren: () => import('./applications/components/auth/auth.module').then(m => m.AuthModule)},
{ path: 'notfound', component: NotfoundComponent, canActivate: [RoleGuard]}, //AuthGuard
{ path: '**', redirectTo: '/notfound', canActivate: [RoleGuard]} //AuthGuard
];
РольГард
import { Injectable } from '@angular/core';
import {ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree} from '@angular/router';
import {AuthService} from "../service/auth/auth.service";
import {Observable} from "rxjs";
@Injectable({
providedIn: 'root'
})
export class RoleGuard {
constructor(private service: AuthService, private route: Router) {
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
//if (this.service.IsLoggedIn()) {
console.info('RoleGuard: login olundu');
const userRoles = this.service.getRoles();
console.info(userRoles);
if (userRoles) {
// check if route is restricted by role
const { roles } = route.data;
if (!roles) {
// role not authorized so redirect to home page
//this.route.navigate(['']);
console.info(roles)
console.info(roles.includes(userRoles))
console.info('RoleGuard: user not authorized')
return false;
}
// authorized so return true
console.info('RoleGuard: user authorized')
return true;
}
console.info('RoleGuard: login değil');
//this.route.navigate(['auth/login'])
this.route.navigate(['auth/login'], { queryParams: { returnUrl: state.url } });
return false;
//} else {
// console.info('RoleGuard: not login');
// this.route.navigate(['auth/login'])
// return false;
//}
}
}
АутСервис
getRoles() {
const loginToken = window.sessionStorage.getItem('access_permission_token') || '';
const _extractedToken=loginToken.split('.')[1];
const _atobData=atob(_extractedToken);
const _finalData=JSON.parse(_atobData);
return _finalData.resource_access.api_inventory.roles;
}
Таким образом приходят роли пользователя, и я перенаправляю их на страницу route-guard, но он продолжает получать «false», несмотря на авторизацию.
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
const user = this.service.getRoles();
if (user) {
console.info(route.data['roles'])
console.info(user)
// check if route is restricted by role
if (route.data['roles'] && route.data['roles'].indexOf(user) === -1) {
// role not authorised so redirect to home page
console.info('false')
this.route.navigate(['/']);
return false;
}
console.info('true')
// authorised so return true
return true;
}
// not logged in so redirect to login page with the return url
this.route.navigate(['auth/login'], { queryParams: { returnUrl: state.url } });
return false;
}
Предполагая, что пользователи получат доступ к маршруту, если у них есть какая-либо из ролей, которыми защищен маршрут. Вы можете попробовать что-то вроде
export class RoleGuard {
constructor(private service: AuthService, private route: Router) {
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
const roles = route.data.roles;//make sure you are getting the roles here
if (!roles.length){
return true; //no role applied on route so just return true
}
const userRoles = this.service.getRoles();
let isAuthrised=!!userRoles?.length && roles.some(r=>userRoles.includes(r))
if (isAuthrised) {
// authorized so return true
console.info('RoleGuard: user authorized')
return true;
}
console.info('RoleGuard: login değil');
this.route.navigate(['auth/login'], { queryParams: { returnUrl: state.url } });
return false;
}
прочитайте комментарий, а затем напишите ответ... хорошая работа
@Den не уверен, что вы пытаетесь сказать здесь !!userRoles?.length && roles.some(r=>userRoles.includes(r))
Это строка, которая выполняет основную проверку, также могут быть тысячи людей, которые могут думать так же, поэтому нет необходимости, если кто-то включает часть вашего комментария, скопирован, это может быть есть и собственное мышление
Я думаю, что проблема в const { roles } = route.data, вы используете деконструктор, тогда вам нужно сделать const roles = route.data.roles; и в случае необходимости добавить проверку || роли.длина === 0; Дайте мне знать