agent-exec transport 9a972977c78e74d4c92c9978a0a916ac/15be41c34e62

This commit is contained in:
agent-exec-transport
2026-10-19 15:59:23 +00:00
parent cf9c35aa0a
commit 03646b568b
@@ -274,6 +274,43 @@ func TestProjectAccessIgnoresSystemGrantWithoutRole(t *testing.T) {
}
}
func TestProjectCreateFailsClosedWithoutRoleProvider(t *testing.T) {
srv, st := newAuthTestServer(t)
h := srv.Handler()
superAdmin := bootSuperAdmin(t, h, st)
if err := st.CreateAccount("engineer", "Engineer", "", false); err != nil {
t.Fatal(err)
}
key, err := st.CreateAPIKey("engineer", "engineer-test")
if err != nil {
t.Fatal(err)
}
if rec := bearerRequest(h, "POST", "/api/projects", `{"name":"无职位项目"}`, key); rec.Code != http.StatusForbidden ||
!strings.Contains(rec.Body.String(), "not-granted") {
t.Fatalf("project created without role: %d %s", rec.Code, rec.Body.String())
}
if allowed, _, reason := systemDecisionFixture(t, bearerRequest(h, "GET", "/api/authz/explain?action=project.create", "", key)); allowed || reason != "not-granted" {
t.Fatalf("missing role project.create allowed=%v reason=%s", allowed, reason)
}
createAssignedRoleFixture(t, h, st, superAdmin, "engineer", "工程师", true)
if rec := bearerRequest(h, "POST", "/api/projects", `{"name":"职位授权项目"}`, key); rec.Code != http.StatusOK {
t.Fatalf("role project create: %d %s", rec.Code, rec.Body.String())
}
if _, err := st.DB().Exec(`DROP TABLE role_permissions`); err != nil {
t.Fatal(err)
}
if rec := bearerRequest(h, "POST", "/api/projects", `{"name":"职位不可用项目"}`, key); rec.Code != http.StatusForbidden ||
!strings.Contains(rec.Body.String(), "authority-unavailable") {
t.Fatalf("project created with unavailable role provider: %d %s", rec.Code, rec.Body.String())
}
if allowed, source, reason := systemDecisionFixture(t, bearerRequest(h, "GET", "/api/authz/explain?action=project.create", "", key)); allowed || source != "" || reason != "authority-unavailable" {
t.Fatalf("unavailable role project.create allowed=%v source=%s reason=%s", allowed, source, reason)
}
}
func TestLegacyRoleRowsDoNotAuthorizeSystemActionsOrAccess(t *testing.T) {
srv, st := newAuthTestServer(t)
h := srv.Handler()