8000 [Security] Refactor authentication success handling by asm89 · Pull Request #4599 · symfony/symfony · GitHub
[go: up one dir, main page]

Skip to content

[Security] Refactor authentication success handling #4599

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

Merged

Conversation

asm89
Copy link
Contributor
@asm89 asm89 commented Jun 17, 2012

Bug fix: no
Feature addition: no
Backwards compatibility break: yes
Symfony2 tests pass: Build Status
License of the code: MIT

This PR extracts the default authentication success handling to its own class as discussed in #4553. In the end the PR will basically revert #3183 (as suggested by @schmittjoh) and fix point one of #838.

There are a few noticeable changes in this PR:

  • This implementation changes the constructor signature of the AbstractAuthentictionListener and UsernamePasswordFormAuthenticationListener by making the AuthenticationSuccessHandler mandatory (BC break). If this WIP is approved I will refactor the failure handling logic too and then this will also move one place in the constructor
  • This PR reverts the change of making the returning of a Response optional in the AuthenticationSuccessHandlerInterface. Developers can now extend the default behavior themselves

@schmittjoh Any suggestions? Or a +1 to do the failure logic too?

@schmittjoh
Copy link
Contributor

+1 from me

@fabpot, what so you think?

@fabpot
Copy link
Member
fabpot commented Jun 19, 2012

Can you add a note in the CHANGELOG? Thanks.

@asm89
Copy link
Contributor Author
asm89 commented Jun 19, 2012

I will, but I'll first do the same for the failure logic.

@travisbot
Copy link

This pull request passes (merged 17c8f66f into 55c6df9).

// success handler
if (isset($config['success_handler'])) {
$listener->replaceArgument(6, new Reference($config['success_handler']));

Copy link
Member

Choose a reason for hiding this comment

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

extra empty line here

@asm89
Copy link
Contributor Author
asm89 commented Jun 21, 2012

👍 thank you @stof. I think this is good to go now.

@travisbot
Copy link

This pull request passes (merged 8982c769 into 55c6df9).

@asm89
Copy link
Contributor Author
asm89 commented Jun 21, 2012

@schmittjoh @fabpot The LogoutListener currently throws an exception when the successhandler doesn't return a Response (link). Should this code check for this too?

@schmittjoh
Copy link
Contributor

Yes, this code was removed, but needs to be re-added here as well.

@@ -18,3 +18,6 @@ CHANGELOG
* `ObjectIdentity::fromDomainObject`, `UserSecurityIdentity::fromAccount` and
`UserSecurityIdentity::fromToken` now return correct identities for proxies
objects (e.g. Doctrine proxies)
* [BC BREAK] moved the default authentication success and failure handling to
Copy link
Contributor

Choose a reason for hiding this comment

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

Why do we need to change the order?

I believe we could avoid that either by simply removing the = null part (PHP should not complain if there are required parameters after optional ones although it does not make sense), or the other alternative keep = null and simply instantiate the default handlers if none is passed.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

The contract of the class has changed as the handlers aren't optional anymore. I wasn't aware of the fact that you could have required parameters "after" optional ones.

So the options now are:

  1. BC break and change the order of the arguments
  2. Smaller BC break: only remove the = null from the constructor. People will still have to update their project to inject the failure/success handlers
  3. No BC break by instantiating the handlers when they're not passed

@schmittjoh For the third option, how would passing the options for the handlers work? I guess the listener gets them all and passes them all?
@fabpot Any preference?

Copy link
Member

Choose a reason for hiding this comment

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

@asm89 you cannot really have required parameters after optional ones. It will simply meant that the previous ones are not optional anyùore

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 know. So the BC break would then be that there are 3 extra required parameters, but no change of order. The last option wouldn't require a BC break at all I guess.

Copy link

Choose a reason for hiding this comment

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

If we have to do BC I'd vote for pt. 1. IMHO, optional parameters should be after the required ones.

Copy link
Member

Choose a reason for hiding this comment

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

The point 3 would be an issue to handle the options properly. I would also vote for point 1. This BC break only affects people using the Security component standalone, not the framework users anyway (as the class is configured by SecurityBundle). And the point 2 also breaks BC but leads to weird code.

@travisbot
Copy link

This pull request passes (merged 5afa240d into 55c6df9).

@asm89
Copy link
Contributor Author
asm89 commented Jun 26, 2012

@fabpot Can you make a final decision on this? If you decide on point 3, this code can be merged. I agree with the arguments of @stof about the option handling and it 'only' being a BC break for direct users of the security component. I even think these direct users should be really careful anyway, since the behavior of the success and failurehandlers now change back to how they acted in 2.0.

Now I am thinking about it, can't the optional parameters of this class move to setters anyway? That will make it cleaner to extend.

@asm89
Copy link
Contributor Author
asm89 commented Jun 28, 2012

ping @fabpot

* Can be optionally be extended from by the developer to alter the behaviour
* while keeping the default behaviour.
*
* @author Alexander <iam.asm89@gmail.com>
Copy link
Member

Choose a reason for hiding this comment

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

You should re-add the original authors here too.

@fabpot
Copy link
Member
fabpot commented Jun 28, 2012

I'm ok with option 1 (the BC break). After doing the last changes, can you squash your commits before I merge? Thanks.

@@ -77,7 +77,7 @@
* @param LoggerInterface $logger A LoggerInterface instance
* @param EventDispatcherInterface $dispatcher An EventDispatcherInterface instance
Copy link
Member

Choose a reason for hiding this comment

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

As the order of the arguments changed, you should update the phpdoc

@asm89
Copy link
Contributor Author
asm89 commented Jul 6, 2012

@fabpot I rebased the PR, added the authors and also ported the fix that was done in 8ffaafa to be contained in the default success handler. I also squashed all the CS and 'small blabla fix' commits. Is it ok now?

Edit: travisbot will probably say that the tests in this PR fail, but that is because current master fails on form things

@@ -37,15 +37,15 @@ class UsernamePasswordFormAuthenticationListener extends AbstractAuthenticationL
/**
* {@inheritdoc}
*/
public function __construct(SecurityContextInterface $securityContext, AuthenticationManagerInterface $authenticationManager, SessionAuthenticationStrategyInterface $sessionStrategy, HttpUtils $httpUtils, $providerKey, array $options = array(), AuthenticationSuccessHandlerInterface $successHandler = null, AuthenticationFailureHandlerInterface $failureHandler = null, LoggerInterface $logger = null, EventDispatcherInterface $dispatcher = null, CsrfProviderInterface $csrfProvider = null)
public function __construct(SecurityContextInterface $securityContext, AuthenticationManagerInterface $authenticationManager, SessionAuthenticationStrategyInterface $sessionStrategy, HttpUtils $httpUtils, $providerKey, AuthenticationSuccessHandlerInterface $successHandler = null, AuthenticationFailureHandlerInterface $failureHandler, array $options = array(), LoggerInterface $logger = null, EventDispatcherInterface $dispatcher = null, CsrfProviderInterface $csrfProvider = null)
Copy link
Contributor

Choose a reason for hiding this comment

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

It seems, $failureHandler should be as optional parameter.

Copy link
Member

Choose a reason for hiding this comment

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

no, it is the success handler which should now be mandatory as it is now mandatory in the parent class.

asm89 added 4 commits July 8, 2012 19:59
…eperate class

[Security] Update configuration for changes regarding default success handler
[Security] Fix + add AbstractFactory test
…eperate class

[Security] Update configuration for changes regarding default failure handler
[Security] Fixes + add AbstractFactory test for failure handler
…ure/success handling

[Security] Various CS + doc fixes
[Security] Exception when authentication failure/success handlers do not return a response
[Security] Add authors + fix docblock
@asm89
Copy link
Contributor Author
asm89 commented Jul 8, 2012

I rebased the PR, tests are green now: Build Status.

fabpot added a commit that referenced this pull request Jul 9, 2012
Commits
-------

bb138da [Security] Fix regression after rebase. Target url should be firewall dependent
eb19f2c [Security] Add note to CHANGELOG about refactored authentication failure/success handling [Security] Various CS + doc fixes [Security] Exception when authentication failure/success handlers do not return a response [Security] Add authors + fix docblock
f9d5606 [Security] Update AuthenticationFailureHandlerInterface docblock. Never return null
915704c [Security] Move default authentication failure handling strategy to seperate class [Security] Update configuration for changes regarding default failure handler [Security] Fixes + add AbstractFactory test for failure handler
c6aa392 [Security] Move default authentication success handling strategy to seperate class [Security] Update configuration for changes regarding default success handler [Security] Fix + add AbstractFactory test

Discussion
----------

[Security] Refactor authentication success handling

Bug fix: no
Feature addition: no
Backwards compatibility break: yes
Symfony2 tests pass: [![Build Status](https://secure.travis-ci.org/asm89/symfony.png?branch=refactor-authentication-success-handling)](http://travis-ci.org/asm89/symfony)
License of the code: MIT

This PR extracts the default authentication success handling to its own class as discussed in #4553. In the end the PR will basically revert #3183 (as suggested by @schmittjoh) and fix point one of #838.

There are a few noticeable changes in this PR:
- This implementation changes the constructor signature of the `AbstractAuthentictionListener` and `UsernamePasswordFormAuthenticationListener` by making the `AuthenticationSuccessHandler` mandatory (BC break). If this WIP is approved I will refactor the failure handling logic too and then this will also move one place in the constructor
- This PR reverts the change of making the returning of a `Response` optional in the `AuthenticationSuccessHandlerInterface`. Developers can now extend the default behavior themselves

@schmittjoh Any suggestions? Or a +1 to do the failure logic too?

---------------------------------------------------------------------------

by schmittjoh at 2012-06-17T23:53:07Z

+1 from me

@fabpot, what so you think?

---------------------------------------------------------------------------

by fabpot at 2012-06-19T08:15:48Z

Can you add a note in the CHANGELOG? Thanks.

---------------------------------------------------------------------------

by asm89 at 2012-06-19T10:22:20Z

I will, but I'll first do the same for the failure logic.

---------------------------------------------------------------------------

by travisbot at 2012-06-21T08:03:14Z

This pull request [passes](http://travis-ci.org/symfony/symfony/builds/1671555) (merged 17c8f66f into 55c6df9).

---------------------------------------------------------------------------

by asm89 at 2012-06-21T08:45:38Z

:+1: thank you @stof. I think this is good to go now.

---------------------------------------------------------------------------

by travisbot at 2012-06-21T08:50:28Z

This pull request [passes](http://travis-ci.org/symfony/symfony/builds/1671817) (merged 8982c769 into 55c6df9).

---------------------------------------------------------------------------

by asm89 at 2012-06-21T14:23:58Z

@schmittjoh @fabpot The `LogoutListener` currently throws an exception when the successhandler doesn't return a `Response` ([link](https://github.com/symfony/symfony/blob/9e9519913d2c5e2bef96070bcb9106e1e389c3bd/src/Symfony/Component/Security/Http/Firewall/LogoutListener.php#L101)). Should this code check for this too?

---------------------------------------------------------------------------

by schmittjoh at 2012-06-21T14:26:49Z

Yes, this code was removed, but needs to be re-added here as well.

---------------------------------------------------------------------------

by travisbot at 2012-06-21T15:08:59Z

This pull request [passes](http://travis-ci.org/symfony/symfony/builds/1674437) (merged 5afa240d into 55c6df9).

---------------------------------------------------------------------------

by asm89 at 2012-06-26T06:01:02Z

@fabpot Can you make a final decision on this? If you decide on point 3, this code can be merged.  I agree with the arguments of @stof about the option handling and it 'only' being a BC break for direct users of the security component. I even think these direct users should be really careful anyway, since the behavior of the success and failurehandlers now change back to how they acted in 2.0.

Now I am thinking about it, can't the optional parameters of this class move to setters anyway? That will make it cleaner to extend.

---------------------------------------------------------------------------

by asm89 at 2012-06-28T10:29:50Z

ping @fabpot

---------------------------------------------------------------------------

by fabpot at 2012-06-28T17:23:02Z

I'm ok with option 1 (the BC break). After doing the last changes, can you squash your commits before I merge? Thanks.

---------------------------------------------------------------------------

by asm89 at 2012-07-06T21:59:54Z

@fabpot I rebased the PR, added the authors and also ported the fix that was done in 8ffaafa to be contained in the default success handler. I also squashed all the CS and 'small blabla fix' commits. Is it ok now?

Edit: travisbot will probably say that the tests in this PR fail, but that is because current master fails on form things

---------------------------------------------------------------------------

by asm89 at 2012-07-08T18:53:05Z

I rebased the PR, tests are green now: [![Build Status](https://secure.travis-ci.org/asm89/symfony.png?branch=refactor-authentication-success-handling)](http://travis-ci.org/asm89/symfony).
@fabpot fabpot merged commit bb138da into symfony:master Jul 9, 2012
@inoryy
Copy link
Contributor
inoryy commented Jul 11, 2012

Sorry if it's the wrong place to ask, but I can't figure out how to extend these default handlers.

I've set parent="security.authentication.success_handler" in my custom auth service, but I still keep getting

Catchable Fatal Error: Argument 3 passed to ..\AuthenticationSuccessHandler::__construct() must be an array, string given

3rd argument is the options array, which is skipped here and compiled here. How am I supposed to use them?..

@asm89
Copy link
Contributor Author
asm89 commented Jul 11, 2012

I've been diving into this. I'll create a separate issue.

@asm89
Copy link
Contributor Author
asm89 commented Jul 11, 2012

#4865 address your issue. Be aware that you need to set the options and optionally the $providerKey of the parent service in your overriding service, but first the PR has to be approved of course. ;)

@inoryy
Copy link
Contributor
inoryy commented Jul 11, 2012

@asm89 sorry but this didn't make it much easier... How do I get access to those options? How do I get access to $providerKey?

@asm89
Copy link
Contributor Author
asm89 commented Jul 11, 2012

You are now setting your own service as the success handler. It is your responsibility to set the appropriate options and the providerkey (by overriding the constructor and setting it up there).

@inoryy
Copy link
Contributor
inoryy commented Jul 11, 2012

@asm89 so there's no cleaner way than duplicating bunch of option parameters and hardcoding(?) providerkey just to add a small functionality to handlers?
I really hope I'm missing something here!

@asm89
Copy link
Contributor Author
asm89 commented Jul 13, 2012

@Inori It is easier now than it was in 2.0 where you even had to copy over all the code to get the same behaviour.

@inoryy
Copy link
Contributor
inoryy commented Jul 13, 2012

@asm89 yeah it's actually ok after latest changes, ignore my last comment

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.

9 participants
0