Skip to content

[Security] Add ability for authenticators to explain why they didn’t support a request #60538

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: 7.4
Choose a base branch
from

Conversation

MatTheCat
Copy link
Contributor

@MatTheCat MatTheCat commented May 25, 2025

Q A
Branch? 7.4
Bug fix? no
New feature? yes
Deprecations? no
Issues N/A
License MIT

Inspired by #59771 this PR allows authenticators to advertise why they didn’t support a request by passing a new RequestSupport argument to their supports method. Calling its addReason method will cause the profiler to display them:

If this is accepted, this will pave the way for firewall listeners to expose informations about their calls to supports (this is why the RequestSupport class also holds $result and $lazy properties) and authenticate, thus closing #36668.

@MatTheCat MatTheCat requested a review from chalasr as a code owner May 25, 2025 13:18
@carsonbot carsonbot added this to the 7.3 milestone May 25, 2025
@MatTheCat MatTheCat changed the title [Security] Add ability for authenticators to explain why they support the request or not [Security] Add ability for authenticators to explain why they supported the request or not May 25, 2025
@MatTheCat MatTheCat force-pushed the authenticator-support-reason branch 2 times, most recently from a175f93 to b0cdff7 Compare May 25, 2025 13:20
@@ -11,6 +11,7 @@ CHANGELOG
* Add support for closures in `#[IsGranted]`
* Add `OAuth2TokenHandler` with OAuth2 Token Introspection support for `AccessTokenAuthenticator`
* Add discovery support to `OidcTokenHandler` and `OidcUserInfoTokenHandler`
* Add ability for authenticators to explain why they support the request or not
Copy link
Contributor

@OskarStark OskarStark May 25, 2025

Choose a reason for hiding this comment

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

Suggested change
* Add ability for authenticators to explain why they support the request or not
* Add ability for authenticators to explain why they do not support the request

If they support it, no reason is set, right?

Copy link
Member

Choose a reason for hiding this comment

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

s/does/do

Copy link
Contributor

Choose a reason for hiding this comment

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

Updated, thanks

Copy link
Contributor Author

Choose a reason for hiding this comment

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

If they support it, no reason is set, right?

I was not sure if the userland could benefit from it, but since it is only displayed when the authenticator doesn’t support the request let’s not advertise it indeed.

@MatTheCat MatTheCat changed the title [Security] Add ability for authenticators to explain why they supported the request or not [Security] Add ability for authenticators to explain why they didn’t support a request May 26, 2025
@MatTheCat MatTheCat force-pushed the authenticator-support-reason branch 6 times, most recently from 12f9679 to cc4097b Compare May 26, 2025 13:15
@alexandre-daubois

This comment has been minimized.

@MatTheCat

This comment has been minimized.

@fabpot fabpot modified the milestones: 7.3, 7.4 May 26, 2025
@MatTheCat MatTheCat force-pushed the authenticator-support-reason branch 4 times, most recently from 541085e to 66af8a6 Compare May 30, 2025 10:01
Copy link
Member

@nicolas-grekas nicolas-grekas left a comment

Choose a reason for hiding this comment

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

Nice :)

I'm just wondering about the name. What about RequestDecision instead?

@MatTheCat
Copy link
Contributor Author

I'm just wondering about the name. What about RequestDecision instead?

Why not; then what about

  • the parameter’s name? $requestDecision? Or just $decision?
  • TraceableAuthenticator’s property? Still $supportReasons?

@nicolas-grekas
Copy link
Member

nicolas-grekas commented May 30, 2025

It'd say $requestDecision and $decisionReasons.
(One could also use addReason to explain why they decided to ACCEPT the request, isn't it?)

@MatTheCat
Copy link
Contributor Author

MatTheCat commented May 30, 2025

One could also use addReason to explain why they decided to ACCEPT the request, isn't it?

It wouldn’t serve any purpose in the current state of this PR but yes.

The problem I have with $decisionReasons is that it doesn’t mention the decision is about request support (could also be about authentication).

@nicolas-grekas
Copy link
Member

$requestDecisionReasons?

@MatTheCat MatTheCat force-pushed the authenticator-support-reason branch from f4ade34 to 0cecef5 Compare May 30, 2025 16:23
@MatTheCat
Copy link
Contributor Author

Fine by me; just pushed the changes.

@MatTheCat MatTheCat force-pushed the authenticator-support-reason branch from 0cecef5 to 9bdf856 Compare May 30, 2025 16:26
Copy link
Member

@nicolas-grekas nicolas-grekas left a comment

Choose a reason for hiding this comment

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

One more iteration :)

class RequestDecision
{
public bool $support;
public ?bool $lazy = null;
Copy link
Member

Choose a reason for hiding this comment

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

when is this used? what could be built with that?

Suggested change
public ?bool $lazy = null;
public bool $isLazy;

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I planned to use this class for firewall listeners.

Copy link
Member

Choose a reason for hiding this comment

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

Oh, so let's remove it from this PR and add it in the one about listeners then.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Should the TraceableAuthenticator set them then?

Comment on lines 78 to 83
if ($this->supports === false) {
$requestDecision->support = false;
} else {
$requestDecision->support = true;
$requestDecision->lazy = null === $this->supports;
}
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
if ($this->supports === false) {
$requestDecision->support = false;
} else {
$requestDecision->support = true;
$requestDecision->lazy = null === $this->supports;
}
$requestDecision->isSupported = false !== $this->supports;
$requestDecision->isLazy = null === $this->supports;

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I think isLazy should stay null if the request is not supported.

Copy link
Member

Choose a reason for hiding this comment

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

the decision was not lazy, so why?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Cause lazy only makes sense if the request is supported.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

BTW it is not the decision which is lazy but the request support; not sure about this naming then 🤔

@MatTheCat MatTheCat force-pushed the authenticator-support-reason branch from 9bdf856 to f7520a5 Compare May 30, 2025 16:38
@MatTheCat MatTheCat force-pushed the authenticator-support-reason branch from f7520a5 to 50a70cb Compare May 30, 2025 16:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants