Skip to content

harden(admin): hard-redirect non-admins from /admin + robust guard test#155

Merged
mvalancy merged 1 commit into
devfrom
harden/admin-lockout
Jun 23, 2026
Merged

harden(admin): hard-redirect non-admins from /admin + robust guard test#155
mvalancy merged 1 commit into
devfrom
harden/admin-lockout

Conversation

@mvalancy

Copy link
Copy Markdown
Member

Admin section is fully locked for non-admins: nav entry hidden, /admin route redirects (RequireRole), Worker denies admin ops server-side. This makes Admin.tsx itself redirect (was a dead 'Access Denied' shell) so admin chrome/tabs can never mount for a non-admin, and hardens the RequireRole redirect test (cleanup + async). Verified live (guest+USER → /admin redirects to /). 6/6 guard tests, 228/228 web unit.

🤖 Generated with Claude Code

The /admin route is already gated by <RequireRole can={canAccessAdmin}> (redirects
non-admins) and the admin nav entry is hidden for non-admins (Layout +
MobileBottomNav), and the Worker rejects admin ops server-side — verified live:
a guest/USER hitting /admin lands back on / with no admin nav and no admin chrome.

Defense-in-depth: Admin.tsx previously rendered an "Access Denied" shell for
non-admins (dead code behind the route guard). Replace it with a hard
<Navigate to="/" replace /> using the shared canAccessAdmin, so the admin tabs/
chrome can NEVER mount for a non-admin even if the route guard is ever changed.

Also make RequireRole.test robust (explicit cleanup between renders + async
findByText) so the redirect assertions don't race the <Navigate> or bleed DOM
between cases — was green in CI but flaky locally. 6/6 pass; full web unit 228/228.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@mvalancy mvalancy merged commit 8a7de05 into dev Jun 23, 2026
@mvalancy mvalancy deleted the harden/admin-lockout branch June 23, 2026 02:16
@github-actions

Copy link
Copy Markdown

🧪 Comprehensive Test Suite

  • Unit suites (Node 18.x & 20.x) — core, web, server, mcp-server: ✅ passed
  • Installer & deploy config: ✅ passed

Full-stack smoke gate runs in the CI workflow.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant