<!-- Work around for table styling until, all pages are updated. -->
#mdStyle()

<a name="Authentication-ApacheShiroAuthentication"></a>
Apache Shiro Authentication
===========================

*   [Authenticating `Subjects`](#Authentication-Authenticating%7B%7BSubjects%7D%7D)

    *   [Step 1: Collect the Subject's principals and credentials](#Authentication-Step1%3ACollecttheSubject%27sprincipalsandcredentials)
    *   [Step 2: Submit the principals and credentials](#Authentication-Step2%3ASubmittheprincipalsandcredentials)
    *   [Step 3: Handling Success or Failure](#Authentication-Step3%3AHandlingSuccessorFailure)

*   [Remembered vs. Authenticated](#Authentication-Rememberedvs.Authenticated)

    *   [Why the distinction?](#Authentication-Whythedistinction%3F)
    *   [An illustrating example](#Authentication-Anillustratingexample)

*   [Logging Out](#Authentication-LoggingOut)
*   [Authentication Sequence](#Authentication-AuthenticationSequence)

    *   [`Authenticator`](#Authentication-%7B%7BAuthenticator%7D%7D)
    *   [`AuthenticationStrategy`](#Authentication-%7B%7BAuthenticationStrategy%7D%7D)
    *   [Realm Authentication Order](#Authentication-RealmAuthenticationOrder)

        *   [Implicit Ordering](#Authentication-ImplicitOrdering)
        *   [Explicit Ordering](#Authentication-ExplicitOrdering)

*   [Realm Authentication](#Authentication-RealmAuthentication)

<img style="margin:0px auto;display:block" src="assets/images/ShiroFeatures_Authentication.png"/>

Authentication is the process of identity verification - that is, proving a user actually is who they say they are. For a user to prove their identity, they need to provide some identifying information as well as some sort of proof of that identity that your system understands and trusts.

This is done by submitting a user's _principals_ and _credentials_ to Shiro to see if they match what is expected by the application.

*   **Principals** are a Subject's 'identifying attributes'. Principals can be anything that identifies a Subject, such as a first name (given name), last name (surname or family name), a username, Social Security Number, etc. Of course things like family names are not very good at uniquely identifying a `Subject`, so the best principals to use for authentication are unique for an application - typically a username or email address.

#info("Primary Principal", "While Shiro can represent any number of principals, Shiro expects an application to have exactly one 'Primary' principal - a single value that uniquely identifies the `Subject` within the application. This is typically a username, email address or globally unique user id in most applications.")

*   **Credentials** are usually secret values known only by the `Subject` which are used as supporting evidence that they in fact 'own' the claimed identity. Some common examples of credentials are passwords, biometric data such as fingerprints and retina scans, and X.509 certificates.

The most common example of a principal/credential pairing is that of a username and password. The username is the claimed identity, and the password is the proof matching the claimed identity. If a submitted password matches what is expected by the application, the application can largely assume that the user really is who they say they are because no-one else should know the same password.

<a name="Authentication-Authenticating%7B%7BSubjects%7D%7D"></a>
Authenticating `Subject`s
-----------------------

The process of authenticating a `Subject` can effectively broken down into three distinct steps:

1.  Collect the Subject's submitted principals and credentials
2.  Submit the principals and credentials for authentication.
3.  If the submission is successful, allow access, otherwise retry authentication or block access.

The following code demonstrates how Shiro's API reflects these steps:

<a name="Authentication-Step1%3ACollecttheSubject%27sprincipalsandcredentials"></a>
#[[###Step 1: Collect the Subject's principals and credentials]]#

``` java
//Example using most common scenario of username/password pair:
UsernamePasswordToken token = new UsernamePasswordToken(username, password);

//"Remember Me" built-in: 
token.setRememberMe(true);
```

In this particular case, we’re using the [UsernamePasswordToken](static/current/apidocs/org/apache/shiro/authc/UsernamePasswordToken.html), supporting the most common username/password authentication approach. This is an implementation of Shiro's [org.apache.shiro.authc.AuthenticationToken](static/current/apidocs/org/apache/shiro/authc/AuthenticationToken.html) interface, which is the base interface used by Shiro's authentication system to represent submitted principals and credentials.

It is important to note here that Shiro does not care how you acquire this information: perhaps the data was acquired by a user submitting an HTML form, or maybe it was retrieved from an HTTP header, or perhaps it was read from a Swing or Flex GUI password form, or maybe via command line arguments. The process of collecting information from an application end-user is completely decoupled from Shiro's `AuthenticationToken` concept.

You may construct and represent `AuthenticationToken` instances however you like - it is protocol agnostic.

This example also shows that we have indicated that we wish Shiro to perform 'Remember Me' services for the authentication attempt. This ensures that Shiro remembers the user identity if they return to the application at a later date. We will cover Remember Me services in a later chapter.

<a name="Authentication-Step2%3ASubmittheprincipalsandcredentials"></a>
#[[###Step 2: Submit the principals and credentials]]#

After the principals and credentials have been collected and represented as an `AuthenticationToken` instance, we need to submit the token to Shiro to perform the actual authentication attempt:

``` java
Subject currentUser = SecurityUtils.getSubject();

currentUser.login(token);
```

After acquiring the currently-executing `Subject`, we make a single [`login`](static/current/apidocs/org/apache/shiro/subject/Subject.html#[[#]]#login-org.apache.shiro.authc.AuthenticationToken-) call, passing in the `AuthenticationToken` instance we created earlier.

An invocation to the `login` method effectively represents an authentication attempt.

<a name="Authentication-Step3%3AHandlingSuccessorFailure"></a>
#[[###Step 3: Handling Success or Failure]]#

If the `login` method returns quietly, that's it - we're done! The `Subject` has been authenticated. The application thread can continue uninterrupted and all further calls to `SecurityUtils.getSubject()` will return the authenticated `Subject` instance, and any calls to `subject.` [`isAuthenticated()`](static/current/apidocs/org/apache/shiro/subject/Subject.html#[[#]]#isAuthenticated--) will return `true`.

But what happens if the login attempt failed? For example, what if the end-user supplied an incorrect password, or accessed the system too many times and maybe their account is locked?

Shiro has a rich runtime [`AuthenticationException`](static/current/apidocs/org/apache/shiro/authz/AuthorizationException.html) hierarchy that can indicate exactly why the attempt failed. You can wrap `login` in a `try/catch` block and catch any exception you wish and react to them accordingly. For example:

``` java
try {
    currentUser.login(token);
} catch ( UnknownAccountException uae ) { ...
} catch ( IncorrectCredentialsException ice ) { ...
} catch ( LockedAccountException lae ) { ...
} catch ( ExcessiveAttemptsException eae ) { ...
} ... catch your own ...
} catch ( AuthenticationException ae ) {
    //unexpected error?
}

//No problems, continue on as expected...
```

If one of the existing exception classes do not meet your needs, custom `AuthenticationExceptions` can be created to represent specific failure scenarios.

#tip("Login Failure Tip", 'While your code can react to specific exceptions and execute logic as necessary, a security best practice is to only show a generic failure message to an end user in the event of a failure, for example, "Incorrect username or password.".  This ensures no specific information is available to hackers that may be attempting an attack vector.')

<a name="Authentication-Rememberedvs.Authenticated"></a>
Remembered vs. Authenticated
----------------------------

As shown in the example above, Shiro supports the notion of "remember me" in addition to the normal login process. It is worth pointing out at this time that Shiro makes a very precise distinction between a _remembered_ Subject and an actual _authenticated_ Subject:

*   **Remembered**: A remembered `Subject` is not anonymous and has a known identity (i.e. `subject.`[`getPrincipals()`](static/current/apidocs/org/apache/shiro/subject/Subject.html#[[#]]#getPrincipals--) is non-empty). But this identity is remembered from a previous authentication during a **previous** session. A subject is considered remembered if `subject.`[`isRemembered()`](static/current/apidocs/org/apache/shiro/subject/Subject.html#[[#]]#isRemembered--) returns `true`.

*   **Authenticated**: An authenticated `Subject` is one that has been successfully authenticated (i.e. the `login` method was invoked without throwing an exception) _during the Subject's current session_. A subject is considered authenticated if `subject.`[`isAuthenticated()`](static/current/apidocs/org/apache/shiro/subject/Subject.html#[[#]]#isAuthenticated--) returns `true`.

#warning('Mutually Exclusive', 'Remembered and authenticated states are mutually exclusive - a <code>true</code> value for one indicates a <code>false</code> value for the other and vice versa.')

<a name="Authentication-Whythedistinction%3F"></a>
#[[###Why the distinction?]]#

The word 'authentication' has a very strong connotation of _proof_. That is, there is an expected _guarantee_ that the `Subject` has proven they are who they say they are.

When a user is only remembered from a previous interaction with the application, the state of proof no longer exists: the remembered identity gives the system an idea who that user probably is, but in reality, has no way of absolutely _guaranteeing_ if the remembered Subject represents the expected user. Once the subject is authenticated, they are no longer considered only remembered because their identity would have been verified during the current session.

So although many parts of the application can still perform user-specific logic based on the remembered principals, such as customized views, it should typically never perform highly-sensitive operations until the user has legitimately verified their identity by executing a successful authentication attempt.

For example, a check to see if a `Subject` can access financial information should almost always depend on `isAuthenticated()`, not `isRemembered()`, to guarantee an expected and verified identity.

<a name="Authentication-Anillustratingexample"></a>
#[[###An illustrating example]]#

The following is a fairly common scenario that helps illustrate why the the distinction between remembered and authenticated is important.

Let's say you're using [Amazon.com](https://www.amazon.com). You've logged-in successfully and have added a few books to your shopping cart. But you have to run off to a meeting, but forget to log out. By the time the meeting is over, it's time to go home and you leave the office.

The next day when you come in to work, you realize you didn't complete your purchase, so you go back to amazon.com. This time, Amazon 'remembers' who you are, greets you by name, and still gives you some personalized book recommendations. To Amazon, `subject.isRemembered()` would return `true`.

But, what happens if you try to access your account to update your credit card information to make your book purchase? While Amazon 'remembers' you (`isRemembered()` == `true`), it cannot guarantee that you are in fact you (for example, maybe a co-worker is using your computer).

So before you can perform a sensitive action like updating credit card information, Amazon will force you to login so they can guarantee your identity. After you login, your identity has been verified and to Amazon, `isAuthenticated()` would now be `true`.

This scenario happens so frequently for many types of applications, so the functionality is built in to Shiro so you can leverage it for your own application. Now, whether you use `isRemembered()` or `isAuthenticated()` to customize your views and workflows is up to you, but Shiro will maintain this fundamental state in case you need it.

<a name="Authentication-LoggingOut"></a>
Logging Out
-----------

The opposite of authenticating is releasing all known identifying state. When the `Subject` is done interacting with the application, you can call `subject.`[`logout()`](static/current/apidocs/org/apache/shiro/subject/Subject.html#[[#]]#logout--) to relinquish all identifying information:

``` java
currentUser.logout(); //removes all identifying information and invalidates their session too.
```

When you call `logout`, any existing `Session` will be invalidated and any identity will be disassociated (e.g. in a web app, the RememberMe cookie will also be deleted).

After a `Subject` logs-out, the `Subject` instance is considered anonymous again and, except for web applications, can be re-used for `login` again if desired.

#danger('Web Application Notice', 'Because remembered identity in web applications is often persisted with cookies, and cookies can only be deleted before a Response body is committed, it is highly recommended to redirect the end-user to a new view or page immediately after calling <code>subject.logout()</code>.  This guarantees that any security-related cookies are deleted as expected. This is a limitation of how HTTP cookies function and not a limitation of Shiro.')

<a name="Authentication-sequence"></a>
<a name="Authentication-AuthenticationSequence"></a>
Authentication Sequence
-----------------------

Until now, we've only looked at how to authenticate a `Subject` from within application code. Now we'll cover what happens inside Shiro when an authentication attempt occurs.

We've taken our previous architecture diagram from the [Architecture](architecture.html "Architecture") chapter, and left only the components relevant to authentication highlighted. Each number represents a step during an authentication attempt:

<img style="margin:0px auto;display:block" src="assets/images/ShiroAuthenticationSequence.png"/>

**Step 1**: Application code invokes the `Subject.login` method, passing in the constructed `AuthenticationToken` instance representing the end-user's principals and credentials.

**Step 2**: The `Subject` instance, typically a [`DelegatingSubject`](static/current/apidocs/org/apache/shiro/subject/support/DelegatingSubject.html) (or a subclass) delegates to the application's `SecurityManager` by calling `securityManager.login(token)`, where the actual authentication work begins.

**Step 3**: The `SecurityManager`, being a basic 'umbrella' component, receives the token and simply delegates to its internal [`Authenticator`](static/current/apidocs/org/apache/shiro/authc/Authenticator.html)` instance by calling `authenticator.[`authenticate(token)`](static/current/apidocs/org/apache/shiro/authc/Authenticator.html#[[#]]#authenticate-org.apache.shiro.authc.AuthenticationToken-). This is almost always a [`ModularRealmAuthenticator`](static/current/apidocs/org/apache/shiro/authc/pam/ModularRealmAuthenticator.html) instance, which supports coordinating one or more `Realm` instances during authentication. The `ModularRealmAuthenticator` essentially provides a [PAM](https://en.wikipedia.org/wiki/Pluggable_Authentication_Modules)-style paradigm for Apache Shiro (where each `Realm` is a 'module' in PAM terminology).

**Step 4**: If more than one `Realm` is configured for the application, the `ModularRealmAuthenticator` instance will initiate a multi-`Realm` authentication attempt utilizing its configured [`AuthenticationStrategy`](static/current/apidocs/org/apache/shiro/authc/pam/AuthenticationStrategy.html). Before, during and after the `Realms` are invoked for authentication, the `AuthenticationStrategy` will be called to allow it to react to each Realm's results. We will cover `AuthenticationStrategies` soon.

#warning('Single-Realm Application', 'If only a single Realm is configured, it is called directly - there is no need for an <code>AuthenticationStrategy</code> in a single-Realm application.')

**Step 5**: Each configured `Realm` is consulted to see if it [`supports`](static/current/apidocs/org/apache/shiro/realm/Realm.html#[[#]]#supports-org.apache.shiro.authc.AuthenticationToken-) the submitted `AuthenticationToken`. If so, the supporting Realm's [`getAuthenticationInfo`](static/current/apidocs/org/apache/shiro/realm/Realm.html#[[#]]#getAuthenticationInfo-org.apache.shiro.authc.AuthenticationToken-) method will be invoked with the submitted `token`. The `getAuthenticationInfo` method effectively represents a single authentication attempt for that particular `Realm`. We will cover the `Realm` authentication behavior shortly.

#[[###`Authenticator`]]#

As mentioned earlier, the Shiro `SecurityManager` implementations default to using a [`ModularRealmAuthenticator`](static/current/apidocs/org/apache/shiro/authc/pam/ModularRealmAuthenticator.html) instance. The `ModularRealmAuthenticator` equally supports applications with single Realm as well as those with multiple realms.

In a single-realm application, the `ModularRealmAuthenticator` will invoke the single `Realm` directly. If two or more Realms are configured, it will use an `AuthenticationStrategy` instance to coordinate how the attempt occurs. We'll cover AuthenticationStrategies below.

If you wish to configure the `SecurityManager` with a custom `Authenticator` implementation, you can do so in `shiro.ini` for example:

``` ini
[main]
...
authenticator = com.foo.bar.CustomAuthenticator

securityManager.authenticator = $authenticator
```

Although in practice, the `ModularRealmAuthenticator` is probably suitable for most needs.

<a name="Authentication-%7B%7BAuthenticationStrategy%7D%7D"></a>
#[[###`AuthenticationStrategy`]]#

When two or more realms are configured for an application, the `ModularRealmAuthenticator` relies on an internal [`AuthenticationStrategy`](static/current/apidocs/org/apache/shiro/authc/pam/AuthenticationStrategy.html) component to determine the conditions for which an authentication attempt succeeds or fails.

For example, if only one Realm authenticates an `AuthenticationToken` successfully, but all others fail, is the authentication attempt considered successful? Or must all Realms authenticate successfully for the overall attempt to be considered successful? Or, if a Realm authenticates successfully, is it necessary to consult other Realms further? An `AuthenticationStrategy` makes the appropriate decision based on an application's needs.

An AuthenticationStrategy is a stateless component that is consulted 4 times during an authentication attempt (any necessary state required for these 4 interactions will be given as method arguments):

1.  before any of the Realms are invoked
2.  immediately before an individual Realm's `getAuthenticationInfo` method is called
3.  immediately after an an individual Realm's `getAuthenticationInfo` method is called
4.  after all of the Realms have been invoked

Also an `AuthenticationStrategy` is responsible for aggregating the results from each successful Realm and 'bundling' them into a single [`AuthenticationInfo`](static/current/apidocs/org/apache/shiro/authc/AuthenticationInfo.html) representation. This final aggregate `AuthenticationInfo` instance is what is returned by the `Authenticator` instance and is what Shiro uses to represent the `Subject`'s final identity (aka Principals).

#info("Subject Identity 'View'", "If you use more than one Realm in your application to acquire account data from multiple data sources, the <code>AuthenticationStrategy</code> is ultimately responsible for the final 'merged' view of the Subject's identity that is seen by the application.")

Shiro has 3 concrete `AuthenticationStrategy` implementations:

| `AuthenticationStrategy` class | Description |
| ------------------------------ | ----------- |
| [`AtLeastOneSuccessfulStrategy`](static/current/apidocs/org/apache/shiro/authc/pam/AtLeastOneSuccessfulStrategy.html) | If one (or more) Realms authenticate successfully, the overall attempt is considered successful. If none authenticate succesfully, the attempt fails. |
| [`FirstSuccessfulStrategy`](static/current/apidocs/org/apache/shiro/authc/pam/FirstSuccessfulStrategy.html) | Only the information returned from the first successfully authenticated Realm will be used.  All further Realms will be ignored. If none authenticate successfully, the attempt fails. |
| [`AllSuccessfulStrategy`](static/current/apidocs/org/apache/shiro/authc/pam/AllSuccessfulStrategy.html) | All configured Realms must authenticate successfully for the overall attempt to be considered successful.  If any one does not authenticate successfully, the attempt fails. |

The `ModularRealmAuthenticator` defaults to the **`AtLeastOneSuccessfulStrategy`** implementation, as this is the most commonly desired strategy. However, you could configure a different strategy if you wanted:

``` ini
[main]
...
authcStrategy = org.apache.shiro.authc.pam.FirstSuccessfulStrategy

securityManager.authenticator.authenticationStrategy = $authcStrategy

...
```

#tip('Custom AuthenticationStrategy', 'If you wanted to create your own <code>AuthenticationStrategy</code> implementation yourself, you could use the <a class="external-link" href="static/current/apidocs/org/apache/shiro/authc/pam/AbstractAuthenticationStrategy.html"><code>org.apache.shiro.authc.pam.AbstractAuthenticationStrategy</code></a> as a starting point.  The <code>AbstractAuthenticationStrategy</code> class automatically implements the ''bundling''/aggregation behavior of merging the results from each Realm into a single <code>AuthenticationInfo</code> instance.')

<a name="Authentication-RealmAuthenticationOrder"></a>
#[[###Realm Authentication Order]]#

It is very important to point out that the `ModularRealmAuthenticator` will interact with Realm instances in _iteration_ order.

The `ModularRealmAuthenticator` has access to the `Realm` instances configured on the `SecurityManager`. When performing an authentication attempt, it will iterate over that collection, and for each `Realm` that supports the submitted `AuthenticationToken`, invoke the Realm's `getAuthenticationInfo` method.

<a name="Authentication-ImplicitOrdering"></a>
#[[####Implicit Ordering]]#

When using Shiro's INI configuration format, you should configure Realms _in the order you want them to process an `AuthenticationToken`_. For example, in `shiro.ini`, Realms will be consulted in the order in which they are defined in the INI file. That is, for the following `shiro.ini` example:

``` ini
blahRealm = com.company.blah.Realm
...
fooRealm = com.company.foo.Realm
...
barRealm = com.company.another.Realm
```

The `SecurityManager` will be configured with those three realms, and during an authentication attempt, `blahRealm`, `fooRealm`, and `barRealm` will be invoked _in that order_.

This has basically the same effect as if the following line were defined:

``` java
securityManager.realms = $blahRealm, $fooRealm, $barRealm
```

Using this approach, you don't need to set the `securityManager's` `realms` property - every realm defined will automatically be added to the `realms` property.

<a name="Authentication-ExplicitOrdering"></a>
#[[####Explicit Ordering]]#

If you want to explicitly define the order in which the realms will be interacted with, regardless of how they are defined, you can set the securityManager's `realms` property as an explicit collection property. For example, if using the definition above, but you wanted the `blahRealm` to be consulted last instead of first:

``` ini
blahRealm = com.company.blah.Realm
...
fooRealm = com.company.foo.Realm
...
barRealm = com.company.another.Realm

securityManager.realms = $fooRealm, $barRealm, $blahRealm
...
```

#warning('Explicit Realm Inclusion', 'When you explicitly configure the <code>securityManager.realms</code> property, <em>only</em> the referenced realms will be configured on the <code>SecurityManager</code>.  This means you could define 5 realms in INI, but only actually use 3 if 3 are referenced for the <code>realms</code> property.  This is different than implicit realm ordering where all available realms will be used.')

<a name="Authentication-RealmAuthentication"></a>
Realm Authentication
--------------------

This chapter covers Shiro's master workflow explaining how an authentication attempt occurs. The internal workflow of what happens in a single realm as it is consulted during authentication (i.e. 'Step 5' above) is covered in the [Realm](realm.html "Realm") chapter's [Realm Authentication](realm.html#[[#]]#Realm-authentication) section.

#lendAHandDoc()

<input type="hidden" id="ghEditPage" value="authentication.md.vtl"></input>
