mirror of
https://github.com/bitwarden/browser
synced 2025-12-17 16:53:34 +00:00
[EC-451] Org Admin Refresh Permissions Refactor (#3320)
* [EC-451] Update new org permissions for new tabs * [EC-451] Remove redudant route guards * [EC-451] Remove canAccessManageTab() * [EC-451] Use canAccess* callbacks in org routing module
This commit is contained in:
@@ -1,10 +1,9 @@
|
|||||||
import { NgModule } from "@angular/core";
|
import { NgModule } from "@angular/core";
|
||||||
import { RouterModule, Routes } from "@angular/router";
|
import { RouterModule, Routes } from "@angular/router";
|
||||||
|
|
||||||
import { Organization } from "@bitwarden/common/models/domain/organization";
|
|
||||||
|
|
||||||
import { PaymentMethodComponent } from "../../settings/payment-method.component";
|
import { PaymentMethodComponent } from "../../settings/payment-method.component";
|
||||||
import { OrganizationPermissionsGuard } from "../guards/org-permissions.guard";
|
import { OrganizationPermissionsGuard } from "../guards/org-permissions.guard";
|
||||||
|
import { canAccessBillingTab } from "../navigation-permissions";
|
||||||
|
|
||||||
import { OrgBillingHistoryViewComponent } from "./organization-billing-history-view.component";
|
import { OrgBillingHistoryViewComponent } from "./organization-billing-history-view.component";
|
||||||
import { OrganizationBillingTabComponent } from "./organization-billing-tab.component";
|
import { OrganizationBillingTabComponent } from "./organization-billing-tab.component";
|
||||||
@@ -15,7 +14,7 @@ const routes: Routes = [
|
|||||||
path: "",
|
path: "",
|
||||||
component: OrganizationBillingTabComponent,
|
component: OrganizationBillingTabComponent,
|
||||||
canActivate: [OrganizationPermissionsGuard],
|
canActivate: [OrganizationPermissionsGuard],
|
||||||
data: { organizationPermissions: (org: Organization) => org.canManageBilling },
|
data: { organizationPermissions: canAccessBillingTab },
|
||||||
children: [
|
children: [
|
||||||
{ path: "", pathMatch: "full", redirectTo: "subscription" },
|
{ path: "", pathMatch: "full", redirectTo: "subscription" },
|
||||||
{
|
{
|
||||||
@@ -26,19 +25,15 @@ const routes: Routes = [
|
|||||||
{
|
{
|
||||||
path: "payment-method",
|
path: "payment-method",
|
||||||
component: PaymentMethodComponent,
|
component: PaymentMethodComponent,
|
||||||
canActivate: [OrganizationPermissionsGuard],
|
|
||||||
data: {
|
data: {
|
||||||
titleId: "paymentMethod",
|
titleId: "paymentMethod",
|
||||||
organizationPermissions: (org: Organization) => org.canManageBilling,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "history",
|
path: "history",
|
||||||
component: OrgBillingHistoryViewComponent,
|
component: OrgBillingHistoryViewComponent,
|
||||||
canActivate: [OrganizationPermissionsGuard],
|
|
||||||
data: {
|
data: {
|
||||||
titleId: "billingHistory",
|
titleId: "billingHistory",
|
||||||
organizationPermissions: (org: Organization) => org.canManageBilling,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -5,7 +5,13 @@ import { BroadcasterService } from "@bitwarden/common/abstractions/broadcaster.s
|
|||||||
import { OrganizationService } from "@bitwarden/common/abstractions/organization.service";
|
import { OrganizationService } from "@bitwarden/common/abstractions/organization.service";
|
||||||
import { Organization } from "@bitwarden/common/models/domain/organization";
|
import { Organization } from "@bitwarden/common/models/domain/organization";
|
||||||
|
|
||||||
import { canAccessSettingsTab } from "../navigation-permissions";
|
import {
|
||||||
|
canAccessBillingTab,
|
||||||
|
canAccessGroupsTab,
|
||||||
|
canAccessMembersTab,
|
||||||
|
canAccessReportingTab,
|
||||||
|
canAccessSettingsTab,
|
||||||
|
} from "../navigation-permissions";
|
||||||
|
|
||||||
const BroadcasterSubscriptionId = "OrganizationLayoutComponent";
|
const BroadcasterSubscriptionId = "OrganizationLayoutComponent";
|
||||||
|
|
||||||
@@ -55,19 +61,19 @@ export class OrganizationLayoutComponent implements OnInit, OnDestroy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get showMembersTab(): boolean {
|
get showMembersTab(): boolean {
|
||||||
return this.organization.canManageUsers;
|
return canAccessMembersTab(this.organization);
|
||||||
}
|
}
|
||||||
|
|
||||||
get showGroupsTab(): boolean {
|
get showGroupsTab(): boolean {
|
||||||
return this.organization.canManageGroups;
|
return canAccessGroupsTab(this.organization);
|
||||||
}
|
}
|
||||||
|
|
||||||
get showReportsTab(): boolean {
|
get showReportsTab(): boolean {
|
||||||
return this.organization.canAccessReports;
|
return canAccessReportingTab(this.organization);
|
||||||
}
|
}
|
||||||
|
|
||||||
get showBillingTab(): boolean {
|
get showBillingTab(): boolean {
|
||||||
return this.organization.canManageBilling;
|
return canAccessBillingTab(this.organization);
|
||||||
}
|
}
|
||||||
|
|
||||||
get reportTabLabel(): string {
|
get reportTabLabel(): string {
|
||||||
|
|||||||
@@ -1,29 +1,31 @@
|
|||||||
import { Organization } from "@bitwarden/common/models/domain/organization";
|
import { Organization } from "@bitwarden/common/models/domain/organization";
|
||||||
|
|
||||||
export function canAccessToolsTab(org: Organization): boolean {
|
export function canAccessMembersTab(org: Organization): boolean {
|
||||||
return org.canAccessImportExport || org.canAccessReports;
|
return org.canManageUsers || org.canManageUsersPassword;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function canAccessGroupsTab(org: Organization): boolean {
|
||||||
|
return org.canManageGroups;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function canAccessReportingTab(org: Organization): boolean {
|
||||||
|
return org.canAccessReports || org.canAccessEventLogs;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function canAccessBillingTab(org: Organization): boolean {
|
||||||
|
return org.canManageBilling;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function canAccessSettingsTab(org: Organization): boolean {
|
export function canAccessSettingsTab(org: Organization): boolean {
|
||||||
return org.isOwner;
|
return org.isOwner;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function canAccessManageTab(org: Organization): boolean {
|
export function canAccessOrgAdmin(org: Organization): boolean {
|
||||||
return (
|
return (
|
||||||
org.canCreateNewCollections ||
|
canAccessMembersTab(org) ||
|
||||||
org.canEditAnyCollection ||
|
canAccessGroupsTab(org) ||
|
||||||
org.canDeleteAnyCollection ||
|
canAccessReportingTab(org) ||
|
||||||
org.canEditAssignedCollections ||
|
canAccessBillingTab(org) ||
|
||||||
org.canDeleteAssignedCollections ||
|
canAccessSettingsTab(org)
|
||||||
org.canAccessEventLogs ||
|
|
||||||
org.canManageGroups ||
|
|
||||||
org.canManageUsers ||
|
|
||||||
org.canManagePolicies ||
|
|
||||||
org.canManageSso ||
|
|
||||||
org.canManageScim
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function canAccessOrgAdmin(org: Organization): boolean {
|
|
||||||
return canAccessToolsTab(org) || canAccessSettingsTab(org) || canAccessManageTab(org);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -2,13 +2,17 @@ import { NgModule } from "@angular/core";
|
|||||||
import { RouterModule, Routes } from "@angular/router";
|
import { RouterModule, Routes } from "@angular/router";
|
||||||
|
|
||||||
import { AuthGuard } from "@bitwarden/angular/guards/auth.guard";
|
import { AuthGuard } from "@bitwarden/angular/guards/auth.guard";
|
||||||
import { Organization } from "@bitwarden/common/models/domain/organization";
|
|
||||||
|
|
||||||
import { OrganizationPermissionsGuard } from "./guards/org-permissions.guard";
|
import { OrganizationPermissionsGuard } from "./guards/org-permissions.guard";
|
||||||
import { OrganizationLayoutComponent } from "./layouts/organization-layout.component";
|
import { OrganizationLayoutComponent } from "./layouts/organization-layout.component";
|
||||||
import { GroupsComponent } from "./manage/groups.component";
|
import { GroupsComponent } from "./manage/groups.component";
|
||||||
import { PeopleComponent } from "./manage/people.component";
|
import { PeopleComponent } from "./manage/people.component";
|
||||||
import { canAccessOrgAdmin, canAccessSettingsTab } from "./navigation-permissions";
|
import {
|
||||||
|
canAccessGroupsTab,
|
||||||
|
canAccessMembersTab,
|
||||||
|
canAccessOrgAdmin,
|
||||||
|
canAccessSettingsTab,
|
||||||
|
} from "./navigation-permissions";
|
||||||
import { AccountComponent } from "./settings/account.component";
|
import { AccountComponent } from "./settings/account.component";
|
||||||
import { SettingsComponent } from "./settings/settings.component";
|
import { SettingsComponent } from "./settings/settings.component";
|
||||||
import { TwoFactorSetupComponent } from "./settings/two-factor-setup.component";
|
import { TwoFactorSetupComponent } from "./settings/two-factor-setup.component";
|
||||||
@@ -49,7 +53,7 @@ const routes: Routes = [
|
|||||||
canActivate: [OrganizationPermissionsGuard],
|
canActivate: [OrganizationPermissionsGuard],
|
||||||
data: {
|
data: {
|
||||||
titleId: "members",
|
titleId: "members",
|
||||||
organizationPermissions: (org: Organization) => org.canManageUsers,
|
organizationPermissions: canAccessMembersTab,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -58,7 +62,7 @@ const routes: Routes = [
|
|||||||
canActivate: [OrganizationPermissionsGuard],
|
canActivate: [OrganizationPermissionsGuard],
|
||||||
data: {
|
data: {
|
||||||
titleId: "groups",
|
titleId: "groups",
|
||||||
organizationPermissions: (org: Organization) => org.canManageGroups,
|
organizationPermissions: canAccessGroupsTab,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import { Organization } from "@bitwarden/common/models/domain/organization";
|
|||||||
|
|
||||||
import { OrganizationPermissionsGuard } from "../guards/org-permissions.guard";
|
import { OrganizationPermissionsGuard } from "../guards/org-permissions.guard";
|
||||||
import { EventsComponent } from "../manage/events.component";
|
import { EventsComponent } from "../manage/events.component";
|
||||||
|
import { canAccessReportingTab } from "../navigation-permissions";
|
||||||
import { ExposedPasswordsReportComponent } from "../tools/exposed-passwords-report.component";
|
import { ExposedPasswordsReportComponent } from "../tools/exposed-passwords-report.component";
|
||||||
import { InactiveTwoFactorReportComponent } from "../tools/inactive-two-factor-report.component";
|
import { InactiveTwoFactorReportComponent } from "../tools/inactive-two-factor-report.component";
|
||||||
import { ReusedPasswordsReportComponent } from "../tools/reused-passwords-report.component";
|
import { ReusedPasswordsReportComponent } from "../tools/reused-passwords-report.component";
|
||||||
@@ -19,7 +20,7 @@ const routes: Routes = [
|
|||||||
path: "",
|
path: "",
|
||||||
component: ReportingComponent,
|
component: ReportingComponent,
|
||||||
canActivate: [OrganizationPermissionsGuard],
|
canActivate: [OrganizationPermissionsGuard],
|
||||||
data: { organizationPermissions: (org: Organization) => org.canAccessReports },
|
data: { organizationPermissions: canAccessReportingTab },
|
||||||
children: [
|
children: [
|
||||||
{ path: "", pathMatch: "full", redirectTo: "reports" },
|
{ path: "", pathMatch: "full", redirectTo: "reports" },
|
||||||
{
|
{
|
||||||
@@ -28,52 +29,41 @@ const routes: Routes = [
|
|||||||
canActivate: [OrganizationPermissionsGuard],
|
canActivate: [OrganizationPermissionsGuard],
|
||||||
data: {
|
data: {
|
||||||
titleId: "reports",
|
titleId: "reports",
|
||||||
organizationPermissions: (org: Organization) => org.canAccessReports,
|
|
||||||
},
|
},
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: "exposed-passwords-report",
|
path: "exposed-passwords-report",
|
||||||
component: ExposedPasswordsReportComponent,
|
component: ExposedPasswordsReportComponent,
|
||||||
canActivate: [OrganizationPermissionsGuard],
|
|
||||||
data: {
|
data: {
|
||||||
titleId: "exposedPasswordsReport",
|
titleId: "exposedPasswordsReport",
|
||||||
organizationPermissions: (org: Organization) => org.canAccessReports,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "inactive-two-factor-report",
|
path: "inactive-two-factor-report",
|
||||||
component: InactiveTwoFactorReportComponent,
|
component: InactiveTwoFactorReportComponent,
|
||||||
canActivate: [OrganizationPermissionsGuard],
|
|
||||||
data: {
|
data: {
|
||||||
titleId: "inactive2faReport",
|
titleId: "inactive2faReport",
|
||||||
organizationPermissions: (org: Organization) => org.canAccessReports,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "reused-passwords-report",
|
path: "reused-passwords-report",
|
||||||
component: ReusedPasswordsReportComponent,
|
component: ReusedPasswordsReportComponent,
|
||||||
canActivate: [OrganizationPermissionsGuard],
|
|
||||||
data: {
|
data: {
|
||||||
titleId: "reusedPasswordsReport",
|
titleId: "reusedPasswordsReport",
|
||||||
organizationPermissions: (org: Organization) => org.canAccessReports,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "unsecured-websites-report",
|
path: "unsecured-websites-report",
|
||||||
component: UnsecuredWebsitesReportComponent,
|
component: UnsecuredWebsitesReportComponent,
|
||||||
canActivate: [OrganizationPermissionsGuard],
|
|
||||||
data: {
|
data: {
|
||||||
titleId: "unsecuredWebsitesReport",
|
titleId: "unsecuredWebsitesReport",
|
||||||
organizationPermissions: (org: Organization) => org.canAccessReports,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "weak-passwords-report",
|
path: "weak-passwords-report",
|
||||||
component: WeakPasswordsReportComponent,
|
component: WeakPasswordsReportComponent,
|
||||||
canActivate: [OrganizationPermissionsGuard],
|
|
||||||
data: {
|
data: {
|
||||||
titleId: "weakPasswordsReport",
|
titleId: "weakPasswordsReport",
|
||||||
organizationPermissions: (org: Organization) => org.canAccessReports,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import { Organization } from "@bitwarden/common/models/domain/organization";
|
|||||||
import { OrganizationPermissionsGuard } from "src/app/organizations/guards/org-permissions.guard";
|
import { OrganizationPermissionsGuard } from "src/app/organizations/guards/org-permissions.guard";
|
||||||
import { OrganizationLayoutComponent } from "src/app/organizations/layouts/organization-layout.component";
|
import { OrganizationLayoutComponent } from "src/app/organizations/layouts/organization-layout.component";
|
||||||
import { ManageComponent } from "src/app/organizations/manage/manage.component";
|
import { ManageComponent } from "src/app/organizations/manage/manage.component";
|
||||||
import { canAccessManageTab } from "src/app/organizations/navigation-permissions";
|
|
||||||
|
|
||||||
import { ScimComponent } from "./manage/scim.component";
|
import { ScimComponent } from "./manage/scim.component";
|
||||||
import { SsoComponent } from "./manage/sso.component";
|
import { SsoComponent } from "./manage/sso.component";
|
||||||
@@ -21,10 +20,6 @@ const routes: Routes = [
|
|||||||
{
|
{
|
||||||
path: "manage",
|
path: "manage",
|
||||||
component: ManageComponent,
|
component: ManageComponent,
|
||||||
canActivate: [OrganizationPermissionsGuard],
|
|
||||||
data: {
|
|
||||||
organizationPermissions: canAccessManageTab,
|
|
||||||
},
|
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: "sso",
|
path: "sso",
|
||||||
|
|||||||
Reference in New Issue
Block a user