angular 15 对指定页面进行访问限制
原本的访问控制是通过实现 CanActivate 接口完成的,当时并不支持 Observable 异步返回判断结果,现在终于实现了!
例如:需要登录才能访问
/**
 * 需要登录才能访问的页面控制
 * @param _ 
 * @param state 
 * @returns 
 */
export const CanActivateViaAuthGuard: CanActivateFn = (_, state) => {
    return inject(AuthService).canActivate(state.url);
};
// 使用注册到路由上
const routes: Routes = [
    {
        path: 'finance',
        canActivate: [CanActivateViaAuthGuard],
        component: HomeComponent
    },
]
@NgModule({
    imports: [RouterModule.forChild(routes)],
    exports: [RouterModule]
})
export class BackendModule {}
    
例如:需要登录且需要相关权限才能访问
/**
 * 需要有某种权限才能访问的页面控制
 * @param roles 
 * @returns 
 */
export function CanActivateAuthRole(...roles: string[]): CanActivateFn {
    return (_, state) => {
        return inject(AuthService).canActivate(state.url, ...roles);
    }
}
// 使用注册到路由上
const routes: Routes = [
    {
        path: 'finance',
        canActivate: [CanActivateAuthRole('admin')],
        component: HomeComponent
    },
]
@NgModule({
    imports: [RouterModule.forChild(routes)],
    exports: [RouterModule]
})
export class BackendModule {}
    
AuthService 实现
@Injectable()
export class AuthService {
    constructor(
        // 使用 ngrx-store 保存全局数据的
        private store: Store<AppState>,
        // 生成登录网址
        private router: Router,
        // 消息提示组件
        private toastrService: DialogService) {}
    public canActivate(uri: string, ...roles: string[]) {
        return this.store
        .select(selectAuth)
        .pipe(map(res => {
            /*
            * res: {
                guest: boolean, // 是否是游客状态
                roles: string[], // 保存当前用户的所有权限
            }
            */
            if (res.guest) {
                // 跳转到登录页面,并指定登录后的返回网址
                return this.router.createUrlTree(['/auth'], {queryParams: {redirect_uri: uri}});
            }
            if (roles.length === 0) {
                return true;
            }
            if (res.roles) {
                for (const item of roles) {
                    if (res.roles.indexOf(item)) {
                        return true;
                    }
                }
            }
            this.toastrService.error('无权限访问');
            return false;
        }));
    }
}
    
完整代码
转载请保留原文链接: https://zodream.cn/blog/id/240.html