06

Sharing, Roles, Provisioning, and Revocation

Define exactly who can see and change a Workboard board, apply the same policy to every delivery path, automate enterprise membership lifecycle with SCIM, and prove bounded revocation without claiming that downloaded information can be recalled.

Choose public, unlisted, organization, or private visibility

Visibility describes who may discover and read a Workboard board; it does not grant mutation rights. Precise modes prevent a UI label from promising more confidentiality than the APIs, caches, exports, or links actually enforce.

ModeAnonymous readDiscoveryAuthenticated readMutation
PublicAllowedListed in public catalog and searchAllowedActive membership and role required
UnlistedAllowed to a valid link holderExcluded from catalog and ordinary discoveryAllowed to a valid link holderActive membership and role required
OrganizationDeniedVisible only inside the organizationCurrent organization membership requiredRole and resource policy required
PrivateDeniedVisible only to explicitly granted membersActive tenant membership plus an explicit board grant requiredRole and resource policy required

public means anonymous reading is intentionally permitted; it never means anonymous create, update, delete, comment, export administration, or settings access. unlisted means possession of the URL or capability token permits anonymous reading. It is not a confidentiality boundary: recipients can forward the link, browsers can retain it, and referrers or logs can expose it. If Workboard implements unlisted access as a capability—a secret whose possession grants access—the capability must be high entropy, stored and logged safely, scoped to one resource, and rotatable.

organization requires a current active membership in the board’s tenant, even when the person knows the URL. private narrows access further to an active tenant membership plus an explicit board-scoped grant. The grant is resource-policy data, not a second tenant Membership, and it cannot create a tenant role by itself. A person can belong to Tenant Alpha and still be denied an Alpha private board.

Default to private for new enterprise boards. Missing or unknown visibility, tenant, membership, capability, or policy version produces denial, not a fallback to public. Visibility changes are security-sensitive writes that require authorization, audit events, cache invalidation, and subscription reauthorization.

Anonymous modes limit person-specific revocation. Workboard cannot block one revoked person from reading a board that remains public, because public read does not identify that person. Revoking access to an unlisted board requires rotating its capability link and purging old cache variants; revoking a membership alone does not invalidate a URL the person still holds. To stop anonymous reading entirely, change the board to organization or private visibility and invalidate every delivery path, while still acknowledging copies already downloaded.

Model invitations as a membership state machine

An invitation is a request to create a relationship, not proof that the recipient already has access. Model it as a state transition so duplicate emails, expired links, identity mismatches, suspension, and revocation behave predictably.

The Workboard tenant Membership record has { tenantId, principalId, role, state, invitedAt, activatedAt, revokedAt }. When the recipient is not yet bound to a verified principal, keep the Invited and Expired states in a separate invitation record; create the principal-keyed membership as Active only after verified acceptance. The diagram below is the combined lifecycle view across those records. Bind acceptance to the authenticated principal and intended tenant, use a one-time expiring token, and record who invited whom.

Only an Active membership can satisfy an authorization decision. Invitation states and Suspended or Revoked memberships all deny. State changes use compare-and-set or another concurrency control so accepting and revoking the same invitation cannot accidentally reactivate it. Reinvitation creates a new invitation and token; it does not erase the audit history or mutate a revoked membership back to active.

Tenant owners may invite members and issue private-board grants only within policy; they cannot delegate a role or resource scope wider than their own authority. Require step-up authentication or a recent session for high-impact owner grants. Notify the affected person and tenant owners, but do not include secret invitation or capability values in general-purpose logs.

Grant the smallest useful role

A role is a named bundle of allowed actions. Least privilege means assigning only the actions needed for a person’s job and limiting them to the correct tenant and resource rather than treating a role name as global power.

Tenant roleRead boardsCreate or edit todosExport boardManage tenant members and board grantsDelete board
ViewerAllowed by visibility and any required board grantDenyPolicy-controlledDenyDeny
EditorAllowed by visibility and any required board grantAllow on accessible boardsPolicy-controlledDenyDeny
OwnerAll tenant boardsAllowAllowAllowAllow with confirmation

The table is a policy input, not authorization by itself. Every decision still binds principalId, tenantId, resource, action, membership state, policy version, and expiry. A board grant can narrow which private boards a viewer or editor may use, but it cannot elevate that tenant role. An Alpha owner has no Beta permissions unless Beta independently grants them.

Keep organization administration separate from content work. Tenant owners manage organization memberships, approved domains, and private-board grants; editors change todos on accessible boards; viewers read accessible boards. Service accounts and API keys receive purpose-specific actions and expiry rather than being squeezed into human roles. Deny role self-escalation, the removal of the last required owner without a transfer flow, and grants wider than the granting principal is allowed to make.

Review dormant and high-impact memberships periodically. Record grants, changes, suspensions, and revocations as immutable audit events with actor, tenant, target, old and new role, policy version, reason, and trace identifier.

Enforce sharing at every access path

A sharing policy is only as strong as its least protected delivery path. Workboard must make the same visibility and authorization decision wherever board information can be rendered, queried, derived, copied, cached, streamed, or processed later.

Access pathRequired enforcement
Server-side rendered pageResolve current policy before rendering; private data never enters denied HTML
Direct APIAuthenticate when required, derive tenant, authorize resource and action
Catalog, list, and searchApply discovery semantics and tenant filters before ranking or counting
ExportAuthorize at request and execution; scope output and download capability
Attachment or blobAuthorize before redirect/signing; short expiry and resource scope
Link preview or unfurlTreat crawler as anonymous; do not reveal restricted title or image
CDN and application cacheKey by visibility, tenant, subject/policy class and policy version; purge on change
Background jobCarry tenant/resource context and reauthorize when work starts
Websocket or subscriptionAuthorize handshake and topic; reauthorize on reconnect and relevant policy change

For public content, caches can be shared anonymously only after policy explicitly returns public-read. Organization and private responses must not share cache entries across tenants or principals. Unlisted entries must not appear in sitemaps, catalog pages, ordinary search, analytics labels, or previews; cache keys must include the capability version so rotation makes older cache entries unreachable.

Authorize exports twice when queued: once when requested and again when generated or downloaded. Scope blob URLs narrowly and expire them quickly, but recognize that a recipient can copy downloaded bytes. For subscriptions, authorize the exact board topic rather than trusting a client-provided channel name, and stop delivery when membership or visibility changes.

Provision and deprovision users with SCIM

System for Cross-domain Identity Management (SCIM) is an HTTP protocol for provisioning and managing identity resources such as users and groups across administrative domains. It lets an enterprise identity system drive Workboard lifecycle changes without manual account-by-account administration.

Map a configured SCIM client to exactly one Workboard tenant before processing resources. Authenticate and authorize the client, use TLS, validate schemas and tenant-scoped uniqueness, and make create and update operations idempotent. The SCIM external identifier helps correlate records but does not itself prove tenant or application authorization.

Group mapping can assign a maximum role allowed by tenant configuration, but changes remain subject to least privilege. Unknown groups grant nothing. A SCIM user becoming inactive triggers membership deactivation and the complete revocation workflow; deleting the directory record should not destroy audit evidence. Handle duplicate and out-of-order delivery through version checks, idempotency keys, and monotonic state rules so an older “active” update cannot undo a newer deactivation.

SCIM automates lifecycle signals; it does not replace OIDC authentication, Workboard authorization, or access-path enforcement. Monitor provisioning failures and expose actionable tenant-scoped status without leaking another tenant’s directory data.

Treat revocation as a distributed workflow

Revocation removes future service access that was previously granted. Because a Workboard grant can be represented in memberships, sessions, tokens, keys, caches, live connections, and leased jobs, revocation is an idempotent fan-out workflow with observable completion—not one database update and not an instant universal guarantee.

Start by setting the relevant membership to revoked or inactive in the authoritative store. Every authorization decision that consults that source now denies, while cached decisions and already-running work remain explicit revocation legs until invalidated. Emit a RevocationEvent carrying the principal, tenant, affected membership IDs, server sessions, access and refresh tokens, API keys, cache namespaces, websocket connections, background leases, start time, completion time, and residualAccessUntil. completedAt remains empty until every required leg reaches a terminal result; residualAccessUntil bounds only future access through Workboard-controlled services, not possession of previously delivered data.

Each consumer performs its leg:

  • Terminate server sessions and rotate or invalidate session families.
  • Revoke refresh tokens and their authorization grants so no new access tokens can be minted.
  • Expire, introspect, or denylist access tokens according to their format and the chosen security/availability trade-off.
  • Disable human and service API keys, including derived keys and automation credentials.
  • Evict or version subject, tenant, resource, permission, CDN, and capability-link caches; rotate the capability itself when unlisted access is being revoked.
  • Close active websocket connections and require fresh authentication and authorization on reconnect.
  • Cancel background leases, exports, scheduled jobs, and queued work; reauthorize before any retry.

Make consumers idempotent because events may be delivered more than once. Record per-leg attempt, result, timestamp, and error, retry transient failures within a bound, and escalate incomplete critical legs. A completed event means the defined controls reached their denial conditions; it does not mean information already copied outside Workboard ceased to exist.

Prove the revocation service-level objective

A service-level objective (SLO) is a measurable reliability target over a defined time window. A revocation SLO states how quickly each controllable access mechanism must deny after the authoritative revocation start, making “access removed” testable instead of rhetorical.

Define separate targets rather than one vague number. For example, new API and page decisions might deny within 10 seconds at the 99th percentile; server sessions, refresh tokens, API keys, caches, websockets, and job leases within 60 seconds; self-contained access tokens no later than their five-minute expiry unless the risk tier requires online introspection or a denylist. The real targets depend on Workboard’s threat model and system capabilities, but they must be explicit before testing.

Build a test that starts an active session, access/refresh tokens, API key, warmed cache entry, websocket subscription, and leased export job for the same principal. Record startedAt, revoke the membership, and continuously attempt SSR, API reads and writes, discovery, export download, blob access, preview, cached delivery, subscription messages, refresh, API-key calls, and job completion. Capture the first uniform denial timestamp for each leg and compare it with its objective. One run proves that the fan-out is wired; a percentile claim requires repeated trials over a named window and representative load, including failure and retry conditions.

LegDenial proofHonest residual limit
Membership and new decisionsAuthoritative state and API denialReplicas may have bounded propagation delay
Server sessionCookie no longer maps to an active sessionAlready rendered pages remain in browser memory
Refresh tokenRefresh fails and family is marked revokedPreviously minted access token is separate
Access tokenIntrospection/denylist denies or expiry passesSelf-contained token may work until expiry
API keyAll key IDs and descendants denyExternal copies of returned data remain
Cache/CDNOld variant unreachable after version/purgeA client may have stored a prior response
WebsocketConnection closes; reconnect deniesA received message cannot be recalled
Background leaseWork stops before publish; retry deniesCompleted prior export may already be downloaded

Do not claim retroactive erasure. Offline devices may retain synchronized todos, recipients may keep exports, browsers may cache content, and screenshots or copied text cannot be clawed back. Policy and contracts can govern handling of those copies, but the technical revocation promise is bounded future access to Workboard-controlled services within the measured SLO.

Further reading

These primary standards define provisioning, token revocation and status, and zero-trust access decisions. Dates and status make their authority explicit; all links were accessed on 2026-07-26.

  • IETF RFC 7644, SCIM Protocol — Proposed Standard from September 2015 for cross-domain identity provisioning; the RFC index records later updates, and the linked datatracker page is the authoritative status source; accessed 2026-07-26.
  • IETF RFC 7009, OAuth 2.0 Token Revocation — Proposed Standard from August 2013 defining a token-revocation endpoint and related behavior; accessed 2026-07-26.
  • IETF RFC 7662, OAuth 2.0 Token Introspection — Proposed Standard from October 2015 defining an online way to query token active state and metadata; accessed 2026-07-26.
  • NIST SP 800-207, Zero Trust Architecture — final NIST publication from August 2020 emphasizing per-request access decisions rather than implicit trust from network location; accessed 2026-07-26.
  • OWASP WebSocket Security Cheat Sheet — living official OWASP guidance for handshake authorization, session expiry, message controls, and connection lifecycle; accessed 2026-07-26.

Key takeaways

Sharing is an authorization contract that must remain consistent across every representation of Workboard data. Revocation is the measured removal of future access through all controllable mechanisms, with explicit acknowledgement of tokens and copies that cannot disappear immediately.

  • Public permits anonymous reading and discovery, while mutation still requires membership and role.
  • Unlisted link possession permits reading but is not confidentiality; capability-style links need rotation.
  • Organization requires current tenant membership; private requires active tenant membership plus an explicit board grant.
  • Invitation and membership states prevent an email or stale token from becoming accidental active access.
  • Every SSR, API, discovery, export, blob, preview, cache, job, and subscription path enforces the same fail-closed policy.
  • SCIM automates tenant-scoped user and group lifecycle but does not replace authentication or authorization.
  • Revocation fans out to memberships, sessions, tokens, keys, caches, websockets, and leases, with per-leg evidence.
  • Self-contained tokens, offline data, exports, browser memory, and screenshots impose residual limits that must be stated plainly.

Checklist

Use this checklist to review Workboard’s sharing and removal controls before enabling enterprise collaboration. A checked item should have policy tests and observable denial evidence, not only a user-interface setting.

  • [ ] Public, unlisted, organization, and private modes match the exact read, discovery, and mutation semantics.
  • [ ] Unknown or missing visibility, tenant, membership, capability, or policy version denies by default.
  • [ ] Invitations bind a verified principal to a tenant and follow an auditable state machine.
  • [ ] Viewer, editor, owner, board-grant, service-account, and API-key permissions remain least privilege and resource-scoped.
  • [ ] SSR, API, list/search, export, blob, preview, CDN/cache, job, and subscription paths share policy tests.
  • [ ] SCIM clients are tenant-bound, idempotent, version-aware, and unable to reactivate a newer deactivation with stale data.
  • [ ] Revocation deactivates membership first and covers sessions, refresh/access tokens, API keys, caches, websockets, and leases.
  • [ ] Each revocation leg has a target, start timestamp, denial timestamp, percentile measurement, and escalation path.
  • [ ] Public and unlisted limitations are explicit: person-specific anonymous public access cannot be revoked, and unlisted revocation rotates the capability and invalidates caches.
  • [ ] Reconnects, retries, exports, and blob downloads reauthorize at the relevant execution seam.
  • [ ] Documentation states the remaining access window for self-contained tokens and the irreversibility of offline copies, exports, and screenshots.