Skip to content

feat(core): add asyncapi security-defined lint rule#2759

Open
harshit078 wants to merge 77 commits into
Redocly:mainfrom
harshit078:add-asyncapi-rule
Open

feat(core): add asyncapi security-defined lint rule#2759
harshit078 wants to merge 77 commits into
Redocly:mainfrom
harshit078:add-asyncapi-rule

Conversation

@harshit078

@harshit078 harshit078 commented Apr 21, 2026

Copy link
Copy Markdown
Contributor

What/Why/How?

  • Added asyncapi-operation-security-defined rule for AsyncAPI 2.x which reports when a security scheme referenced from an operation or server security array is not defined in ``components.securitySchemes.

Reference

#2667

Testing

Screenshots (optional)

Check yourself

  • This PR follows the contributing guide
  • All new/updated code is covered by tests
  • Core code changed? - Tested with other Redocly products (internal contributions only)
  • New package installed? - Tested in different environments (browser/node)
  • Documentation update has been considered

Security

  • The security impact of the change has been considered
  • Code follows company security practices and guidelines

Note

Medium Risk
New default error in recommended AsyncAPI rulesets can break existing CI for specs with loose security; the rule touches security semantics (refs, server applicability, traits) where edge-case behavior matters.

Overview
Adds a built-in security-defined lint rule for AsyncAPI 2.x and 3.0, mirroring the OpenAPI rule’s intent: catch bad or missing security configuration at lint time instead of at runtime.

For AsyncAPI 2.x, the rule validates scheme names on operation/server security against components.securitySchemes, and flags operations with no operation-level security when every applicable server also lacks security (with channel server bindings, traits, and component servers handled).

For AsyncAPI 3.0, it validates $refs under security (must target #/components/securitySchemes/... and resolve), and applies the same “operation must be secured” checks on root operations (including $ref into components.operations), while skipping reusable definitions under components.operations.

The rule is registered in async2/async3 rule sets, included in minimal/recommended/all presets (error in recommended; warn in minimal), and documented (new async rule page, guides, sidebars). Visitor typings and isOperationSecured support trait-aware checks.

Breaking note: with recommended, AsyncAPI specs that previously passed may now fail on undefined security refs or unsecured operations.

Minor unrelated changes: AsyncAPI split CLI code gets stricter components typing; respect-core gains a test for Arazzo workflow context resolution without a workflows path segment.

Reviewed by Cursor Bugbot for commit 959b639. Bugbot is set up for automated code reviews on this repo. Configure here.

@changeset-bot

changeset-bot Bot commented Apr 21, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 959b639

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 3 packages
Name Type
@redocly/openapi-core Minor
@redocly/cli Minor
@redocly/respect-core Minor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@harshit078 harshit078 changed the title feat: Add asyncapi-operation-security-defined lint rule feat(core): Add asyncapi-operation-security-defined lint rule Apr 24, 2026
@harshit078 harshit078 marked this pull request as ready for review April 24, 2026 07:51
@harshit078 harshit078 requested review from a team as code owners April 24, 2026 07:51
@harshit078 harshit078 changed the title feat(core): Add asyncapi-operation-security-defined lint rule feat(core): add asyncapi-operation-security-defined lint rule Apr 24, 2026

@vadyvas vadyvas left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would suggest a slightly different approach:

  1. keep the AsyncAPI logic separate and do not reuse shared logic from the OAS rule
  2. use the same rule name, security-defined, for AsyncAPI as well, and register the AsyncAPI implementation in the AsyncAPI ruleset
  3. do not update the v1 docs in this PR

I think this would make the change smaller, clearer, and safer.

Thank you for the contribution, overall the PR looks good

Comment thread packages/core/src/rules/async2/asyncapi-operation-security-defined.ts Outdated
Comment thread packages/core/src/rules/common/security-scheme-references.ts Outdated
Comment thread packages/core/src/rules/async2/index.ts Outdated
Comment thread docs/@v1/guides/lint-asyncapi.md Outdated
Comment thread packages/core/src/config/__tests__/__snapshots__/config-resolvers.test.ts.snap Outdated
@harshit078 harshit078 requested a review from vadyvas April 30, 2026 12:45

@vadyvas vadyvas left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

left a few comments, could you take a look?

'info-contact': InfoContact as Async2Rule,
'info-license-strict': InfoLicenseStrict as Async2Rule,
'operation-operationId': OperationOperationId as Async2Rule,
'security-defined': SecurityDefined,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add support for AsyncAPI 3 as well. Right now the rule only applies to AsyncAPI2

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

okay sure !

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The code uses the rule name security-defined, but the docs still say asyncapi-operation-security-defined
Can you update related changes?

@@ -0,0 +1,83 @@
# asyncapi-operation-security-defined

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please don’t add this rule to the v1 docs

Comment thread docs/@v1/v1.sidebars.yaml Outdated
Comment thread packages/core/src/rules/async2/index.ts
Comment thread packages/core/src/rules/async3/security-defined.ts
Comment thread packages/core/src/rules/async3/security-defined.ts Outdated
Comment thread packages/core/src/rules/async2/security-defined.ts
Comment thread packages/core/src/rules/async2/security-defined.ts
@harshit078

Copy link
Copy Markdown
Contributor Author

Hi @AlbinaBlazhko17 , I have addressed all the refactoring you mentioned and fixed all comments by cursor. Can you check again ? Thanks for the patience to go back and forth !

Comment thread .changeset/stupid-dryers-add.md Outdated
---

Added `security-defined` rule for AsyncAPI 2.x and 3.x.
This rule reports when a security scheme referenced from an operation or server `security` array is not defined in `components.securitySchemes`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please, add warning here, because it is breaking change due to adding new rule in recommended ruleset with error severity.
e.g.
**Warning**: this change may break workflows that relied on root-level server inheritance.
And, i think, we need to remove second sentence, which explain how rule works.

Comment thread packages/cli/src/commands/split/asyncapi/gather-asyncapi-component-files.ts Outdated

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit cc37359. Configure here.

Comment thread packages/core/src/rules/async3/security-defined.ts Outdated
Comment thread .changeset/stupid-dryers-add.md Outdated
@harshit078

Copy link
Copy Markdown
Contributor Author

Hi @AlbinaBlazhko17 , I have addressed all the last comments you left and Pr is good to review again. Thanks !

type SecuredOperation = Async2Operation | Async3Operation;
type SecuredTrait = Async2OperationTrait | Async3OperationTrait;

export function isOperationSecured(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This function seems to work only with Async2 and Async3 but located in utils and have general naming.
If it is only work with Async, will it make sense to change its name to isAsyncOperationSecured ?
Also please consider file ranaming.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @DmitryAnansky , I renamed and shifted this function to utils for a shared logic as guided by -

#2759 (comment)

@tatomyr tatomyr changed the title feat(core): add asyncapi-operation-security-defined lint rule feat(core): add asyncapi security-defined lint rule Jun 12, 2026
Comment thread packages/core/src/typings/asyncapi3.ts Outdated
Comment thread packages/core/src/typings/asyncapi3.ts Outdated
Comment thread packages/core/src/typings/asyncapi3.ts Outdated
@harshit078 harshit078 requested a review from DmitryAnansky June 15, 2026 08:49
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.

5 participants