使用路线网址获取路线数据

时间:2018-10-17 19:31:38

标签: angular angular-routing

我想创建一个权限系统,在其中保存了用户访问特定URL所需的权限。

赞:

{ path: '/path/to/page', canActivate: [CustomGuard], data: {'permissions': ['can_edit','can_delete']}}

后卫工作正常,我可以通过那里访问路线数据。但是现在我想根据这些权限在菜单中隐藏一些项目。

因此,我正在考虑创建一种接收URL(/path/to/page)的方法,然后将用户的权限与路由权限进行比较。像这样:

canAccess(url: string) {
    const data = getRouteData(url); // I need this method
    return compare(this.userPermissions, data['permissions']) // true or false
}

但是我仍然没有找到如何从URL访问路由数据的方法。我真的需要帮助!

2 个答案:

答案 0 :(得分:1)

您可以使用CREATE OR REPLACE PROCEDURE PR_Q3 (P_Domain Varchar2) AS V_Old Varchar2(30); V_New Varchar2(30); EmailDomain Broker%ROWTYPE; CURSOR DomainCursor IS SELECT Email_Address FROM Broker WHERE Email_Address = SUBSTR(Email_address,'@') -1; BEGIN OPEN DomainCursor; LOOP FETCH DomainCursor INTO V_Old; EXIT WHEN DomainCursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE(EmailDomain.Email_Address || ' , ' ); UPDATE Broker SET Email_Address = V_New WHERE Email_Address = SUBSTR(Email_Address, '@' ) - 1; END LOOP; CLOSE DomainCursor; END PR_Q3; / SHOW ERROR; EXEC('now.ca','gmail.com') 访问路由数组:

Router

您可以在其中读取 constructor(router: Router) { console.log(router.config); } 属性。但是,您这种方法不适用于延迟加载的模块。另外,您将必须自己匹配URL。

Afaik无法从路由器获取此信息。相反,我建议您实施允许卫兵和隐藏/显示链接的指令使用的权限系统。

或使用现有的解决方案,例如ngx-permissions

答案 1 :(得分:0)

那么您可以使用的是Resolver,基本上,它可以帮助您在实际路由到路线之前进行处理,在实际呈现任何内容之前处理您想要的一切。因此,基本上将服务注入到解析器,然后在您使用的菜单组件中使用相同的服务。

更新

正如评论中所讨论的,您可以在警卫中简单地注入权限服务,如下例所示(请注意构造函数中的服务):

@Injectable()
export class AuthGuardService implements CanActivate {

    constructor(private userPermissions: PermissionService, private router: Router) { }

    canActivate() {


        if (compare(this.userPermissions.permissions, route.config.data.permissions) ) {

            return true;
        }

        return false;
    }

    private compare(userPermissions:any, routePermissions): boolean {
        // compare permissions and return true or false
    }
}

然后在路由完成后阅读权限,使用注入到您的组件或服务中的路由器服务

@Component({
  selector: 'app-page1',
  templateUrl: './page1.component.html',
  styleUrls: ['./page1.component.css']
})
export class Page1Component implements OnInit {

  public permissions: Data;

  constructor(private route: Router) {
   }

  ngOnInit() {
    this.permissions = this.route.config[1].data.permissions;
  }

}

这里有一个stackblitz可以在运行中查看它