[jaxrs-spec][quarkus] Emit @PermitAll for unauthenticated operations (op/global empty security, anonymous OR alternative, no security defined)#23782
Merged
Conversation
Contributor
There was a problem hiding this comment.
1 issue found across 37 files
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="samples/server/petstore/jaxrs-spec/quarkus-security/src/main/docker/Dockerfile.native">
<violation number="1" location="samples/server/petstore/jaxrs-spec/quarkus-security/src/main/docker/Dockerfile.native:17">
P1: Container runs as root because no non-root `USER` is set. The sibling `Dockerfile.jvm` in the same directory explicitly uses `USER 1001`, but this native Dockerfile is missing the non-root user hardening.</violation>
</file>
Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.
…e security handling for unauthenticated operations
0b60e56 to
27b61d5
Compare
Contributor
Author
|
@wing328 - This is the final MR for #23691. Whilst technically it doesn't have any functional impact because emits a no-op annotation Tested in a separate project:
|
Member
|
@Ignacio-Vidal just merged. Thanks for all your contributions 👍 |
Contributor
Author
|
Perfect, thank you for the quick reviews |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

This is part 4 of #23691 to improve authentication and authorisation support in the
jaxrs-spec/quarkusserver generator, building on #23680 and #23752.What this PR does
Extends the
useJakartaSecurityAnnotationsflag (Quarkus library only, requiresuseJakartaEe=true) to emit@jakarta.annotation.security.PermitAllon JAX-RS interface methods and implementation stubs for operations whose OpenAPI security requirements mean no authentication is required.This PR covers the unauthenticated case (
@PermitAll). The generator has 3 mutually exclusive emission per operation:@PermitAll: No authentication is requiredSemantic rules
When
@PermitAllis emittedsecurity: [](explicit opt-out)@PermitAll— overrides any global settingsecurityAND globalsecurity: []@PermitAll— inherits empty listsecurityAND no globalsecurityblock at all@PermitAll— entire API is unauthenticated- {}@PermitAll— least-restrictive alternative winsWARNlog (does not fall through to@PermitAll)Anonymous OR alternative (
- {}) — least restrictive winsOpenAPI 3 allows an empty
SecurityRequirementinside the OR list to indicate anonymous access is acceptable alongside other alternatives. When present, the least-restrictive alternative is "no auth required":This was previously deferred (PR #23680 left these operations unannotated). They now emit
@PermitAll.Global vs per-operation security
securitysecurity[](empty)@PermitAll@PermitAll[](empty)@PermitAll@RolesAllowedpaths@RolesAllowedpathsWhy mixed-scope AND groups do not fall through
PR #23752 already returns
nulland logs aWARNfor AND groups with more than one scoped scheme — Jakarta annotations cannot express AND-of-different-scope-sets. Silently emitting@PermitAllin that case would turn an authorisation gap into a security hole, so the processor explicitly evaluates only the unauthenticated cases above and leaves the operation unannotated otherwise.Implementation notes
New vendor extension. The processor sets
x-jakarta-permit-all = true(mutually exclusive withx-jakarta-roles-allowed) on qualifying operations. The shared partialjakartaSecurityAnnotations.mustache(and the equivalent blocks inapiInterface.mustache/apiMethod.mustache) gains a section guarded by the new extension to emit@jakarta.annotation.security.PermitAll.Processor changes in
JakartaSecurityAnnotationProcessor:qualifiesForPermitAll(rawOp, openAPI, effectiveRequirements)that inspects the raw op-level and globalsecurityfields (not the already-resolved effective list) so it can distinguish explicit op-level opt-out from inherited global. This is necessary because the resolved list collapsesop.security == []and "no op.security, inherits global == []" into the same value.applyTonow has three short-circuit branches: wildcard@RolesAllowed({"**"})→ scoped@RolesAllowed({scopes})→@PermitAll. The first match wins; subsequent branches are skipped.x-jakarta-roles-allowedandx-jakarta-permit-allis ever set on a given operation.No changes to
JavaJAXRSSpecServerCodegen. The existingfromOperationoverride from #23680 already delegates to the processor.CI sample fixture
bin/configs/jaxrs-spec-quarkus-security.yamlandsamples/server/petstore/jaxrs-spec/quarkus-security/(added in #23752) gain aPublicApiendpoint that exercises the@PermitAllpath end-to-end alongside the existing scoped and wildcard endpoints, so the four annotation outcomes (@PermitAll,@RolesAllowed({"**"}),@RolesAllowed({scope}),@RolesAllowed({scope1,scope2})) all render in the committed sample.Test coverage
The existing
quarkusJakartaSecurityCasesdata provider (introduced in #23680) is extended with 10 new rows covering the four@PermitAllcases acrossinterfaceOnly={true,false}anduseJakartaSecurityAnnotations={true,false}:security: [](overrides non-empty global)quarkus-permit-all-op-empty-security.yamlsecurity: []AND globalsecurity: []quarkus-permit-all-op-empty-global-empty.yamlsecurity: []AND non-empty global (per-op opt-out only)quarkus-permit-all-op-empty-global-non-empty.yamlsecurityfield anywhere in the specquarkus-permit-all-no-security-defined.yamlPlus targeted tests:
quarkusGlobalEmptySecurityListEmitsPermitAll— globalsecurity: []inheritance.quarkusOrAnonymousAlternativeEmitsPermitAll— OR list containing- {}.quarkusNoSecurityDefinedAnywhereEmitsPermitAll— entire spec unauthenticated.quarkusMixedAndGroupDoesNotFallThroughToPermitAll— guards the security-hole regression: mixed-scope AND groups must emit nothing, not@PermitAll.quarkusPermitAllCoexistsWithMicroProfileAnnotations—@PermitAllrenders alongside MicroProfile@SecurityRequirementannotations on the same method (quarkus-permit-all-microprofile-coexist.yaml).quarkusMixedSecuritySampleEmitsAllExpectedAnnotations— end-to-end check against the committed CI sample asserting all four annotation outcomes render inPublicApi,AuthenticatedApi,AdminApi,AdminOrUserApi,AnonymousOrAuthenticatedApi.All test rows from #23680 and #23752 continue to pass unchanged.
Closes #23691
PR checklist
Commit all changed files.
This is important, as CI jobs will verify all generator outputs of your HEAD commit as it would merge with master.
These must match the expectations made by your contribution.
You may regenerate an individual generator by passing the relevant config(s) as an argument to the script, for example
./bin/generate-samples.sh bin/configs/java*.IMPORTANT: Do NOT purge/delete any folders/files (e.g. tests) when regenerating the samples as manually written tests may be removed.
master(upcoming7.x.0minor release - breaking changes with fallbacks),8.0.x(breaking changes without fallbacks)"fixes #123"present in the PR description)Summary by cubic
Generate
@PermitAllfor unauthenticated endpoints in thejaxrs-specquarkusgenerator, and keep Jakarta security annotations mutually exclusive with wildcard or scoped@RolesAllowed. Generated APIs now cleanly mirror OpenAPI security: public, any-authenticated, or role-scoped.@PermitAllwhen an operation is unauthenticated: op-levelsecurity: [], globalsecurity: [], no security anywhere, or an OR list with{}.@RolesAllowed({"**"})for “any authenticated user”; emit scoped@RolesAllowed({"admin","user"})when all OR alternatives are scoped (unioned/deduped/sorted). For mixed-scope AND groups, log and emit nothing.@PermitAll, wildcard@RolesAllowed, and scoped@RolesAllowed, driven byx-jakarta-permit-allandx-jakarta-roles-allowed. UpdatedapiInterface.mustacheandapiMethod.mustacheto render them.AnonymousOrAuthenticatedApiand new test fixtures to cover global empty security, op-level opt-out, anonymous OR alternatives, “no security defined,” and coexistence with MicroProfile annotations.Written for commit 27b61d5. Summary will update on new commits.