Implementing Authorization

1. Defining User Permissions

ElementExample
Roleadmin, user, guest
Scopechat:read, chat:write
Resourceroom:42
Actioncreate, read, update, delete

2. Checking Message Permissions

Example: Per-message check

ws.on("message", async (raw) => {
  const m = JSON.parse(raw);
  if (!can(ws.session.user, m.type, m.payload)) {
    return ws.send(JSON.stringify({ "type":"err", "code":403, "id":m.id }));
  }
  handle(m);
});
LayerCheck
ConnectCan use WS?
SubscribeCan read topic?
PublishCan write topic?
RPCCan invoke method?

3. Implementing Role-Based Access Control

RoleAllows
guestread public topics
memberread+write public
moderatordelete messages
adminall

4. Implementing Attribute-Based Access Control

Example: ABAC predicate

function canEdit(user, doc) {
  return doc.ownerId === user.id
      || user.roles.includes("admin")
      || (doc.team && user.teams.includes(doc.team));
}
AttributeSource
Userid, roles, teams
Resourceowner, visibility, tags
Envtime, IP, geo
Actionread/write/admin

5. Validating Topic Access

PatternRule
public.*Anyone
user.{id}.*Only that user
team.{id}.*Team members
admin.*Role: admin

6. Implementing Resource Ownership

FieldUse
ownerIdDirect ownership
parentIdInherit from parent
aclPer-user permissions

7. Handling Permission Denied

StrategyDetail
Reply error{type:"err",code:403,id}
Silently dropFor abuse-prone endpoints
Close 4403Repeated violations
Audit logAlways record denials

8. Implementing Dynamic Permissions

SourceDetail
Policy engineOPA / Cedar
Feature flagsLaunchDarkly, Unleash
Db lookupPer-request ACL fetch (cache!)

9. Auditing Authorization Events

FieldPurpose
actorWho
actionWhat
resourceOn what
decisionallow/deny
reasonPolicy rule
ts/ip/uaContext

10. Testing Authorization Logic

TestDetail
Allow matrixRole × action × resource expected outcomes
Deny matrixSame, asserting denial
Privilege escalationTry forged tokens
IDOROther user's resource IDs