AuthWrapper and AuthorizationChecker Integration
Use these utilities to standardize authorization handling around edit operations.
AuthorizationChecker Contract
Implement checker methods with your domain rules.
public class PageAuthorizationChecker implements AuthorizationChecker {
@Override
public boolean canEdit(String resourceId, String username) {
return aclService.userCanEdit(resourceId, username);
}
@Override
public boolean canDelete(String resourceId, String username) {
return aclService.userCanDelete(resourceId, username);
}
@Override
public EditMode getEditMode(String resourceId, String username) {
return aclService.userGetsOwnerEdit(resourceId, username)
? EditMode.OWNER_EDIT
: EditMode.USER_EDIT;
}
}
Wrap Endpoints with AuthWrapper
@GetMapping("/modules/{id}/edit")
@ResponseBody
public String edit(@PathVariable String id, Principal principal) {
return AuthWrapper.requireForEdit(
() -> authChecker.canEdit(id, principal.getName()),
() -> editUiService.buildEditModal(id)
);
}
@DeleteMapping("/modules/{id}")
@ResponseBody
public String delete(@PathVariable String id, Principal principal) {
return AuthWrapper.requireForDelete(
() -> authChecker.canDelete(id, principal.getName()),
() -> moduleService.deleteAndRenderResponse(id)
);
}
Practical Guidance
- Keep checker logic in service layer, not in components.
- Keep error messaging consistent.
- Log authorization denials with request context.