Skip to content

Commit 02ed4ab

Browse files
authored
docs: provide complete TaskAuthorizationProvider example (#1146)
* docs: make authorization example complete * docs: share ownership checks in authorization examples This fixes #1143
1 parent 355f39d commit 02ed4ab

2 files changed

Lines changed: 44 additions & 10 deletions

File tree

‎docs/content/dev/authorization.md‎

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,34 @@ layout: page
1313
Implement `TaskAuthorizationProvider` to control per-user access:
1414

1515
```java
16+
import java.util.concurrent.ConcurrentHashMap;
17+
import java.util.concurrent.ConcurrentMap;
18+
19+
import jakarta.enterprise.context.ApplicationScoped;
20+
21+
import org.a2aproject.sdk.server.ServerCallContext;
22+
import org.a2aproject.sdk.server.auth.TaskAuthorizationProvider;
23+
import org.a2aproject.sdk.server.auth.TaskOperation;
24+
1625
@ApplicationScoped
1726
public class MyTaskAuthorizationProvider implements TaskAuthorizationProvider {
27+
private final ConcurrentMap<String, String> ownershipStore = new ConcurrentHashMap<>();
1828

1929
@Override
2030
public boolean checkRead(ServerCallContext context, String taskId, TaskOperation op) {
21-
return isOwner(context.getUser(), taskId);
31+
return isOwner(context, taskId);
32+
}
33+
34+
private boolean isOwner(ServerCallContext context, String taskId) {
35+
String owner = ownershipStore.get(taskId);
36+
return owner != null
37+
&& context.getUser() != null
38+
&& owner.equals(context.getUser().getUsername());
2239
}
2340

2441
@Override
2542
public boolean checkWrite(ServerCallContext context, String taskId, TaskOperation op) {
26-
return isOwner(context.getUser(), taskId);
43+
return isOwner(context, taskId);
2744
}
2845

2946
@Override
@@ -39,7 +56,7 @@ public class MyTaskAuthorizationProvider implements TaskAuthorizationProvider {
3956
@Override
4057
public void recordOwnership(ServerCallContext context, String taskId, TaskOperation op) {
4158
if (context.getUser() != null) {
42-
ownershipStore.put(taskId, context.getUser().getUsername());
59+
ownershipStore.putIfAbsent(taskId, context.getUser().getUsername());
4360
}
4461
}
4562
}

‎server-common/src/main/java/org/a2aproject/sdk/server/auth/TaskAuthorizationProvider.java‎

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,34 +21,51 @@
2121
* configuration is required.
2222
*
2323
* <pre>{@code
24+
* import java.util.concurrent.ConcurrentHashMap;
25+
* import java.util.concurrent.ConcurrentMap;
26+
*
27+
* import jakarta.enterprise.context.ApplicationScoped;
28+
*
29+
* import org.a2aproject.sdk.server.ServerCallContext;
30+
* import org.a2aproject.sdk.server.auth.TaskAuthorizationProvider;
31+
* import org.a2aproject.sdk.server.auth.TaskOperation;
32+
*
2433
* @ApplicationScoped
2534
* public class MyTaskAuthorizationProvider implements TaskAuthorizationProvider {
35+
* private final ConcurrentMap<String, String> ownershipStore = new ConcurrentHashMap<>();
2636
*
2737
* @Override
2838
* public boolean checkRead(ServerCallContext context, String taskId, TaskOperation op) {
29-
* User user = context.getUser();
30-
* // look up ownership in your backing store
31-
* return isOwner(user, taskId);
39+
* return isOwner(context, taskId);
40+
* }
41+
*
42+
* private boolean isOwner(ServerCallContext context, String taskId) {
43+
* String owner = ownershipStore.get(taskId);
44+
* return owner != null
45+
* && context.getUser() != null
46+
* && owner.equals(context.getUser().getUsername());
3247
* }
3348
*
3449
* @Override
3550
* public boolean checkWrite(ServerCallContext context, String taskId, TaskOperation op) {
36-
* return checkRead(context, taskId, op); // same rule
51+
* return isOwner(context, taskId);
3752
* }
3853
*
3954
* @Override
4055
* public boolean checkCreate(ServerCallContext context, TaskOperation op) {
41-
* return context.getUser().isAuthenticated();
56+
* return context.getUser() != null && context.getUser().isAuthenticated();
4257
* }
4358
*
4459
* @Override
4560
* public boolean isTaskRecorded(String taskId) {
46-
* return ownershipStore.contains(taskId);
61+
* return ownershipStore.containsKey(taskId);
4762
* }
4863
*
4964
* @Override
5065
* public void recordOwnership(ServerCallContext context, String taskId, TaskOperation op) {
51-
* ownershipStore.put(taskId, context.getUser().getUsername());
66+
* if (context.getUser() != null) {
67+
* ownershipStore.putIfAbsent(taskId, context.getUser().getUsername());
68+
* }
5269
* }
5370
* }
5471
* }</pre>

0 commit comments

Comments
 (0)