[
https://issues.apache.org/jira/browse/GERONIMO-4848?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Quintin Beukes updated GERONIMO-4848:
-------------------------------------
Attachment: (was: login-retries.patch)
> Application Client Login Retries
> --------------------------------
>
> Key: GERONIMO-4848
> URL: https://issues.apache.org/jira/browse/GERONIMO-4848
> Project: Geronimo
> Issue Type: New Feature
> Security Level: public(Regular issues)
> Components: application client, security
> Affects Versions: 2.1.4
> Reporter: Quintin Beukes
> Priority: Minor
>
> When an application client is configured to authenticate with a JAAS realm
> and a CallbackHandler, the login is performed before the application's main
> method is called, thus outside the context of the client application itself.
> This all works, except a failed login isn't retried and there is no way for
> the application to even detect this (nor a cancel if such an option existed).
> The attached patch is a modification of
> org.apache.geronimo.openejb.OpenejbRemoteLoginModule.
> - It introduces a login retry facility. It does so by supplying an optional
> extra "option", which can be specified in the gbean configuration, like so:
> ...
> <lc:login-module control-flag="REQUIRED">
> <lc:login-domain-name>remote-openejb-realm</lc:login-domain-name>
>
> <lc:login-module-class>net.kunye.platform.security.auth.ApplicationClientLoginModule</lc:login-module-class>
> <lc:option name="RemoteSecurityRealm">KMSRealm</lc:option>
> <lc:option name="ServerURI">ejbd://localhost:4201</lc:option>
> <lc:option name="FailedLoginTries">3</lc:option>
> </lc:login-module>
> ...
> - If you omit this option, it will default to the current behaviour of "1"
> try.
> - If you specify an integer great or equal to 0, it will perform the given
> amount of tries. If no successful authentication occurred during these tries
> it will fail with the FailedLoginException (as it does currently).
> - If you specify 0 login tries, then it will keep trying until either a
> successful authentication or the user cancelled. The cancel is detected by
> setting either the NameCallback or PasswordCallback's value to null. This is
> quite unintuitive and might make it more difficult to find bugs in your code
> where the values are unintentionally null, so an alternative way might be
> better.
> Note: The "cancel" check works for all logins, including the first try.
> - Further, if a "cancel" is detected, the callback handler is invoked with a
> single TextOutputCallback which contains an INFORMATION type message "Login
> cancelled by user.".
> - If authentication failed, the callback handler is invoked with a single
> TextOutputCallback which contains an ERROR type message "Login failed for
> user: ${USER}", where USER is the username of the last NameCallback.
> The justification of implementing this in the LoginModule and not the
> application client is to have more direct access to the CallbackHandler, so
> as to send the "Login Failed" and "Login canceled" messages. Also the fact
> that certain types of login modules might be used which don't support the
> "concept" of a retry, like host based authentication modules. So doing
> retries in the application client layer didn't seem logical. This way you can
> also extend the class or build your own and ship it with your application,
> and so be able to customize the retry behaviour, instead of relying on a
> fixed retry strategy in the application client layer (which could only be
> changed by recompiling the plugin).
> Any suggestions/requests, just let me know and I'll implement them.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.