Skip to content

Commit 8de1120

Browse files
committed
add endpoint to retrieve user permissions
Signed-off-by: Josh Hootman <[email protected]>
1 parent 37f57e6 commit 8de1120

File tree

1 file changed

+59
-10
lines changed

1 file changed

+59
-10
lines changed

UnityAuth/src/main/java/io/unityfoundation/auth/AuthController.java

Lines changed: 59 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@
33
import io.micronaut.core.annotation.Introspected;
44
import io.micronaut.core.annotation.Nullable;
55
import io.micronaut.http.HttpResponse;
6+
import io.micronaut.http.HttpStatus;
67
import io.micronaut.http.annotation.Body;
78
import io.micronaut.http.annotation.Controller;
9+
import io.micronaut.http.annotation.Get;
810
import io.micronaut.http.annotation.Post;
11+
import io.micronaut.http.exceptions.HttpStatusException;
912
import io.micronaut.security.annotation.Secured;
1013
import io.micronaut.security.authentication.Authentication;
1114
import io.micronaut.security.rules.SecurityRule;
@@ -15,11 +18,14 @@
1518
import io.unityfoundation.auth.entities.Service.ServiceStatus;
1619
import io.unityfoundation.auth.entities.ServiceRepo;
1720
import io.unityfoundation.auth.entities.Tenant;
21+
import io.unityfoundation.auth.entities.Tenant.TenantStatus;
1822
import io.unityfoundation.auth.entities.TenantRepo;
1923
import io.unityfoundation.auth.entities.User;
2024
import io.unityfoundation.auth.entities.UserRepo;
25+
import jakarta.validation.constraints.NotNull;
2126
import java.util.List;
2227
import java.util.Optional;
28+
import java.util.function.BiPredicate;
2329

2430
@Secured(SecurityRule.IS_AUTHENTICATED)
2531
@Controller("/api")
@@ -35,6 +41,34 @@ public AuthController(UserRepo userRepo, ServiceRepo serviceRepo, TenantRepo ten
3541
this.tenantRepo = tenantRepo;
3642
}
3743

44+
@Get("/permissions")
45+
public HttpResponse<UserPermissionsResponse> permissions(@Body UserPermissionsRequest requestDTO,
46+
Authentication authentication) {
47+
Tenant tenant = tenantRepo.findById(requestDTO.tenantId())
48+
.orElseThrow(() -> new HttpStatusException(HttpStatus.NOT_FOUND, "No tenant found."));
49+
50+
if (!tenant.getStatus().equals(TenantStatus.ENABLED)){
51+
throw new HttpStatusException(HttpStatus.FORBIDDEN, "The tenant is not enabled.");
52+
}
53+
54+
User user = userRepo.findByEmail(authentication.getName()).orElse(null);
55+
if (checkUserStatus(user)) {
56+
throw new HttpStatusException(HttpStatus.FORBIDDEN, "The user's account has been disabled.");
57+
}
58+
59+
Service service = serviceRepo.findById(requestDTO.serviceId())
60+
.orElseThrow(() -> new HttpStatusException(HttpStatus.NOT_FOUND, "Service not found."));
61+
62+
if (service.getStatus() == ServiceStatus.DISABLED) {
63+
throw new HttpStatusException(HttpStatus.FORBIDDEN, "The service is disabled.");
64+
} else if (service.getStatus() == ServiceStatus.DOWN_FOR_MAINTENANCE) {
65+
throw new HttpStatusException(HttpStatus.SERVICE_UNAVAILABLE,
66+
"The service is down for maintenance.");
67+
}
68+
69+
return HttpResponse.ok(new UserPermissionsResponse(getPermissionsFor(user, tenant)));
70+
}
71+
3872
@Post("/hasPermission")
3973
public HttpResponse<HasPermissionResponse> hasPermission(@Body HasPermissionRequest requestDTO,
4074
Authentication authentication) {
@@ -87,20 +121,26 @@ private String checkServiceStatus(Optional<Service> service) {
87121
return null;
88122
}
89123

124+
private final BiPredicate<TenantPermission, Tenant> isTenantOrSystemOrSubtenantScopeAndBelongsToTenant = (tp, t) ->
125+
PermissionScope.SYSTEM.equals(tp.permissionScope()) || (
126+
(PermissionScope.TENANT.equals(tp.permissionScope())
127+
|| PermissionScope.SUBTENANT.equals(tp.permissionScope()))
128+
&& tp.tenantId == t.getId());
129+
130+
90131
private List<String> checkUserPermission(User user, Tenant tenant, List<String> permissions) {
91-
List<TenantPermission> userPermissions = userRepo.getTenantPermissionsFor(user.getId()).stream()
92-
.filter(tenantPermission ->
93-
PermissionScope.SYSTEM.equals(tenantPermission.permissionScope()) ||
94-
((PermissionScope.TENANT.equals(tenantPermission.permissionScope()) || PermissionScope.SUBTENANT.equals(tenantPermission.permissionScope()))
95-
&& tenantPermission.tenantId == tenant.getId()))
96-
.toList();
132+
List<String> commonPermissions = getPermissionsFor(user, tenant).stream()
133+
.filter(permissions::contains).toList();
97134

98-
List<String> commonPermissions = userPermissions.stream()
135+
return commonPermissions;
136+
}
137+
138+
private List<String> getPermissionsFor(User user, Tenant tenant) {
139+
return userRepo.getTenantPermissionsFor(user.getId()).stream()
140+
.filter(tenantPermission ->
141+
isTenantOrSystemOrSubtenantScopeAndBelongsToTenant.test(tenantPermission, tenant))
99142
.map(TenantPermission::permissionName)
100-
.filter(permissions::contains)
101143
.toList();
102-
103-
return commonPermissions;
104144
}
105145

106146
private HttpResponse<HasPermissionResponse> createHasPermissionResponse(boolean hasPermission,
@@ -129,4 +169,13 @@ public record TenantPermission(
129169

130170
}
131171

172+
@Serdeable
173+
public record UserPermissionsRequest(@NotNull Long tenantId,
174+
@NotNull Long serviceId) {
175+
176+
}
177+
178+
@Serdeable
179+
public record UserPermissionsResponse(List<String> permissions){}
180+
132181
}

0 commit comments

Comments
 (0)