<!-- 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/authc/AuthenticationException.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 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>
