我想创建一个权限系统,在其中保存了用户访问特定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访问路由数据的方法。我真的需要帮助!
答案 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可以在运行中查看它