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

<a name="Authorization-ApacheShiroAuthorization"></a>
Apache Shiro Authorization
==========================

*   [Elements of Authorization](#Authorization-ElementsofAuthorization)

    *   [Permissions](#Authorization-Permissions)

        *   [Permission Granularity](#Authorization-PermissionGranularity)

    *   [Roles](#Authorization-Roles)
    *   [Users](#Authorization-Users)

*   [Authorizing Subjects](#Authorization-AuthorizingSubjects)

    *   [Programmatic Authorization](#Authorization-ProgrammaticAuthorization)

        *   [Role-Based Authorization](#Authorization-RoleBasedAuthorization)
    
            *   [Role Checks](#Authorization-RoleChecks)
            *   [Role Assertions](#Authorization-RoleAssertions)

        *   [Permission-Based Authorization](#Authorization-PermissionBasedAuthorization)
    
            *   [Permission Checks](#Authorization-PermissionChecks)
    
                *   [Object-based Permission Checks](#Authorization-ObjectbasedPermissionChecks)
                *   [String-based permission checks](#Authorization-Stringbasedpermissionchecks)

            *   [Permission Assertions](#Authorization-PermissionAssertions)

    *   [Annotation-based Authorization](#Authorization-AnnotationbasedAuthorization)

        *   [Configuration](#Authorization-Configuration)
        *   [The `RequiresAuthentication` annotation](#Authorization-The%7B%7BRequiresAuthentication%7D%7Dannotation)
        *   [The `RequiresGuest` annotation](#Authorization-The%7B%7BRequiresGuest%7D%7Dannotation)
        *   [The `RequiresPermissions` annotation](#Authorization-The%7B%7BRequiresPermissions%7D%7Dannotation)
        *   [The `RequiresRoles` permission](#Authorization-The%7B%7BRequiresRoles%7D%7Dpermission)
        *   [The `RequiresUser` annotation](#Authorization-The%7B%7BRequiresUser%7D%7Dannotation)

    *   [JSP TagLib Authorization](#Authorization-JSPTagLibAuthorization)

*   [Authorization Sequence](#Authorization-AuthorizationSequence)

    *   [`ModularRealmAuthorizer`](#Authorization-%7B%7BModularRealmAuthorizer%7D%7D)

        *   [Realm Authorization Order](#Authorization-RealmAuthorizationOrder)
        *   [Configuring a global `PermissionResolver`](#Authorization-Configuringaglobal%7B%7BPermissionResolver%7D%7D)
        *   [Configuring a global `RolePermissionResolver`](#Authorization-Configuringaglobal%7B%7BRolePermissionResolver%7D%7D)

    *   [Custom Authorizer](#Authorization-CustomAuthorizer)

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

Authorization, also known as _access control_, is the process of managing access to resources. In other words, controlling _who_ has access to _what_ in an application.

Examples of authorization checks are: Is the user allowed to look at this webpage, edit this data, view this button, or print to this printer? Those are all decisions determining what a user has access to.

<a name="Authorization-ElementsofAuthorization"></a>
Elements of Authorization
-------------------------

Authorization has three core elements that we reference quite a bit in Shiro: permissions, roles, and users.

<a name="Authorization-Permissions"></a>
#[[###Permissions]]#

Permissions in Apache Shiro represent the most atomic element of a security policy. They are fundamentally statements about behavior and represent explicitly what can be done in an application. A well-formed permission statement essentially describes resources and what actions are possible when a `Subject` interacts with those resources.

Some examples of permission statements:

*   Open a file
*   View the '/user/list' web page
*   Print documents
*   Delete the 'jsmith' user

Most resources will support the typical CRUD (create, read, update, delete) actions, but any action that makes sense for a particular resource type is ok. The fundamental idea is that permission statements at a minimum are based on _Resources_ and _Actions_.

When looking at permissions, probably the most important thing to realize is that permission statements have no representation of _who_ can perform the represented behavior. They are only statements of _what_ can be done in an application.

#info('Permissions represent behavior only', 'Permission statements reflect behavior (actions associated with resource types) <em>only</em>.  They do not reflect <em>who</em> is able to perform such behavior.')

Defining _who_ (users) is allowed to do _what_ (permissions) is an exercise of assigning permissions to users in some way. This is always done by the application's data model and can vary greatly across applications.

For example, permissions can be grouped in a Role and that Role could be associated with one or more User objects. Or some applications can have a Group of users and a Group can be assigned a Role, which by transitive association would mean that all the Users in that Group are implicitly granted the permissions in the Role.

There are many variations for how permissions could be granted to users - the application determines how to model this based on the application requirements.

We'll cover how Shiro determines if a `Subject` is permitted to do something or not later.

<a name="Authorization-PermissionGranularity"></a>
#[[####Permission Granularity]]#

The permission examples above all specify actions (open, read, delete, etc) on a resource type (door, file, customer, etc). In some cases, they even specify very fine-grained _instance-level_ behavior - for example, 'delete' (action) the 'user' (resource type) with username 'jsmith' (instance identifier). In Shiro, you have the ability to define exactly how granular those statements can be.

We cover permission granularity and 'levels' of permission statements in much more detail in Shiro's [Permissions Documentation](permissions.html "Permissions").

<a name="Authorization-Roles"></a>
#[[###Roles]]#

A Role is a named entity that typically represents a set of behaviors or responsibilities. Those behaviors translate to things you can or can't do with a software application. Roles are typically assigned to user accounts, so by association, users can 'do' the things attributed to various roles.

There are effectively two types of Roles, and Shiro supports both concepts:

*   **Implicit Roles**: Most people use roles as an _implicit_ construct: where your application _implies_ a set of behaviors (i.e. permissions) based on a role name only. With implicit roles, there is nothing at the software level that says "role X is allowed to perform behavior A, B and C". Behavior is implied by a name alone.

#warning('Potentially Brittle Security', 'While the simpler and most common approach, implicit roles potentially impose a lot of software maintenance and management problems.

<p>For example, what if you just want to add or remove a role, or redefine a role''s behavior later?  You''ll have to go back into your source code and change all your role checks to reflect the change in your security model, every time such a change is required!  Not to mention the operational costs this would incur (re-test, go through QA, shut down the app, upgrade the software with the new role checks, restart the app, etc).</p>
<p>This is probably ok for very simple applications (e.g. maybe there is an ''admin'' role and ''everyone else'').  But for more complicated or configurable applications, this can be a major major problem throughout the life of your application and drive a large maintenance cost for your software.</p>')

*   **Explicit Roles**: An explicit role however is essentially a named collection of actual permission statements. In this form, the application (and Shiro) knows _exactly_ what it means to have a particular role or not. Because it is known the _exact_ behavior that can be performed or not, there is no guessing or implying what a particular role can or can not do.

The Shiro team advocates using permissions and explicit roles instead of the older implicit approach. You will have much greater control over your application's security experience.

#tip('Resource-Based Access Control', 'Be sure to read Les Hazlewood''s article, <a class="external-link" href="https://stormpath.com/blog/new-rbac-resource-based-access-control" rel="nofollow">The New RBAC: Resource-Based Access Control</a>, which covers in-depth the benefits of using permissions and explicit roles (and their positive impact on source code) instead of the older implicit role approach.')

<a name="Authorization-Users"></a>
#[[###Users]]#

A user essentially is the 'who' of an application. As we've covered previously however, the `Subject` is really Shiro's 'User' concept.

Users (Subjects) are allowed to perform certain actions in your application through their association with roles or direct permissions. Your application's data model defines exactly how a `Subject` is allowed to do something or not.

For example, in your data model, perhaps you have an actual `User` class and you assign permissions directly to `User` instances. Or maybe you assign permissions only to `Roles` directly, and then assign Roles to `Users`, so by association, `Users` transitively 'have' the permissions assigned to their roles. Or you could represent these things with a 'Group' concept. It is up to you - use what makes sense for your application.

Your data model defines exactly how authorization will function. Shiro relies on a [Realm](realm.html "Realm") implementation to translate your data model association details into a format Shiro understands. We'll cover how Realms do this a little later.

#info('Note', 'Ultimately, your <a href="realm.html" title="Realm">Realm</a> implementation is what communicates with your data source (RDBMS, LDAP, etc). So your realm is what will tell Shiro whether or not roles or permissions exist. You have full control over how your authorization model is structured and defined.')

<a name="Authorization-AuthorizingSubjects"></a>
Authorizing Subjects
--------------------

Performing authorization in Shiro can be done in 3 ways:

*   Programmatically - You can perform authorization checks in your java code with structures like `if` and `else` blocks.
*   JDK annotations - You can attach an authorization annotation to your Java methods
*   JSP/GSP TagLibs - You can control JSP or GSP page output based on roles and permissions

<a name="Authorization-ProgrammaticAuthorization"></a>
#[[###Programmatic Authorization]]#

Probably the easiest and most common way to perform authorization is to programatically interact with the current `Subject` instance directly.

<a name="Authorization-RoleBasedAuthorization"></a>
#[[####Role-Based Authorization]]#

If you want to control access based on simpler/traditional implicit role names, you can execute role checks:

<a name="Authorization-RoleChecks"></a>
#[[#####Role Checks]]#

If you want to simply check to see if the current `Subject` has a role or not, you can call the variant `hasRole*` methods on the `Subject` instance.

For example, to see if a `Subject` has a particular (single) role, you can call the `subject.` [`hasRole(roleName)`](static/current/apidocs/org/apache/shiro/subject/Subject.html#[[#]]#hasRole-java.lang.String-) method, and react accordingly:

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

if (currentUser.hasRole("administrator")) {
    //show the admin button 
} else {
    //don't show the button?  Grey it out? 
}
```

There are few role-oriented `Subject` methods you can call, depending on your needs:

| Subject Method | Description |
| -------------- | ----------- |
| [`hasRole(String roleName)`](static/current/apidocs/org/apache/shiro/subject/Subject.html#[[#]]#hasRolejava.lang.String-) | Returns `true` if the `Subject` is assigned the specified role, `false` otherwise. |
| [`hasRoles(List<String> roleNames)`](static/current/apidocs/org/apache/shiro/subject/Subject.html#[[#]]#hasRoles-java.util.List-) | Returns a array of `hasRole` results corresponding to the indices in the method argument. Useful as a performance enhancement if many role checks need to be performed (e.g. when customizing a complex view) |
| [`hasAllRoles(Collection<String> roleNames)`](static/current/apidocs/org/apache/shiro/subject/Subject.html#[[#]]#hasAllRoles-java.util.Collection-) | Returns `true` if the `Subject` is assigned _all_ of the specified roles, `false` otherwise. |

<a name="Authorization-RoleAssertions"></a>
#[[#####Role Assertions]]#

An alternative to checking a `boolean` to see if the `Subject` has a role or not, you can simply assert that they have an expected role before logic is executed. If the `Subject` does not have the expected role, an [`AuthorizationException`](static/current/apidocs/org/apache/shiro/authz/AuthorizationException.html) will be thrown. If they do have the expected role, the assertion will execute quietly and logic will continue as expected.

For example:

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

//guarantee that the current user is a bank teller and 
//therefore allowed to open the account: 
currentUser.checkRole("bankTeller");
openBankAccount();
```

A benefit of this approach over the `hasRole*` methods is that code can be a bit cleaner in that you don't have to construct your own `AuthorizationExceptions` if the current `Subject` does not meet expected conditions (if you don't want to).

There are few role-oriented `Subject` assertion methods you can call, depending on your needs:

| Subject Method | Description |
| -------------- | ----------- |
| [`checkRole(String roleName)`](static/current/apidocs/org/apache/shiro/subject/Subject.html#[[#]]#checkRole-java.lang.String-) | Returns quietly if the `Subject` is assigned the specified role or throws an `AuthorizationException` if not. |
| [`checkRoles(Collection<String> roleNames)`](static/current/apidocs/org/apache/shiro/subject/Subject.html#[[#]]#checkRoles-java.util.Collection-) | Returns quietly if the `Subject` is assigned _all_ of the specified role or throws an `AuthorizationException` if not. |
| [`checkRoles(String... roleNames)`](static/current/apidocs/org/apache/shiro/subject/Subject.html#[[#]]#checkRoles-java.lang.String...-) | Same effect as the `checkRoles` method above, but allows Java 5 var-args style arguments. |

<a name="Authorization-PermissionBasedAuthorization"></a>
#[[####Permission-Based Authorization]]#

As stated above in our overview of Roles, often a better way of performing access control is through permission-based authorization. Permission-based authorization, because it is strongly associated with your application's raw functionality (and the behavior on an application's core resources), permission-based authorization source code changes when your functionality changes, not when there is a security policy change. This means code is impacted much-less frequently than similar role-based authorization code.

<a name="Authorization-PermissionChecks"></a>
#[[#####Permission Checks]]#

If you want to check to see if a `Subject` is permitted to do something or not, you can call any of the various `isPermitted*` method variants. There are two primary means of checking permissions - with object-based `Permission` instances or with Strings that represent `Permissions`

<a name="Authorization-ObjectbasedPermissionChecks"></a>
#[[######Object-based Permission Checks]]#

One possible way of performing permission checks is to instantiate an instance of Shiro's [`org.apache.shiro.authz.Permission`](static/current/apidocs/org/apache/shiro/authz/Permission.html) interface and pass it to the `*isPermitted` methods that accept permission instances.

For example, consider the following scenario: There is a `Printer` in an office with a unique identifier `laserjet4400n`. Our software needs to check to see if the current user is allowed print documents on that printer before we allow them to press a 'print' button. The permission check to see if this possible could be formulated like this:

``` java
Permission printPermission = new PrinterPermission("laserjet4400n", "print");

Subject currentUser = SecurityUtils.getSubject();

if (currentUser.isPermitted(printPermission)) {
    //show the Print button 
} else {
    //don't show the button?  Grey it out?
}
```

In this example, we also see an example of a very powerful _instance-level_ access control check - the ability to restrict behavior based on _individual data instances_.

Object-based `Permissions` are useful if:

*   You want compile-time type-safety
*   You want to guarantee permissions are represented and used correctly
*   You want explicit control of how permission resolution logic (called permission implication logic, based on the Permission interface's [`implies`](static/current/apidocs/org/apache/shiro/authz/Permission.html#[[#]]#implies-org.apache.shiro.authz.Permission-) method) executes.
*   You want to guarantee Permissions reflect application resources accurately (for example, maybe Permission classes can be auto-generated during a project's build based on a project's domain model).

There are few Object permission-oriented `Subject` methods you can call, depending on your needs:

| Subject Method | Description |
| -------------- | ----------- |
| [`isPermitted(Permission p)`](static/current/apidocs/org/apache/shiro/subject/Subject.html#[[#]]#isPermitted-org.apache.shiro.authz.Permission-) | Returns `true` if the `Subject` is permitted to perform an action or access a resource summarized by the specified `Permission` instance, `false` otherwise. |
| [`isPermitted(List<Permission> perms)`](static/current/apidocs/org/apache/shiro/subject/Subject.html#[[#]]#isPermitted-java.util.List-) | Returns an array of `isPermitted` results corresponding to the indices in the method argument. Useful as a performance enhancement if many permission checks need to be performed (e.g. when customizing a complex view) |
| [`isPermittedAll(Collection<Permission> perms)`](static/current/apidocs/org/apache/shiro/subject/Subject.html#[[#]]#isPermittedAll-java.util.Collection-) | Returns `true` if the `Subject` is permitted _all_ of the specified permissions, `false` otherwise. |

<a name="Authorization-Stringbasedpermissionchecks"></a>
#[[######String-based permission checks]]#

While Object-based permissions can be useful (compile-time type-safety, guaranteed behavior, customized implication logic, etc), they can sometimes feel a bit 'heavy handed' for many applications. An alternative is to use normal `Strings` to represent a permission instance.

For example, based on the print permission example above, we can re-formulate that same check as a `String`-based permission check:

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

if (currentUser.isPermitted("printer:print:laserjet4400n")) {
    //show the Print button
} else {
    //don't show the button?  Grey it out? 
}
```

This example still shows the same instance-level permission check, but important parts of the permission - `printer` (resource type), `print` (action), and `laserjet4400n` (instance id) - were all represented in a String.

This particular example shows a special colon-delimited format defined by Shiro's default [`org.apache.shiro.authz.permission.WildcardPermission`](static/current/apidocs/org/apache/shiro/authz/permission/WildcardPermission.html) implementation, which most people will find suitable.

That is, the above code block is (mostly) a shortcut for the following:

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

Permission p = new WildcardPermission("printer:print:laserjet4400n");

if (currentUser.isPermitted(p) {
    //show the Print button
} else {
    //don't show the button?  Grey it out?
}
```

The `WildcardPermission` token format and formation options are covered in-depth in Shiro's [Permission documentation](permissions.html "Permissions").

And while the above String defaults to the `WildcardPermission` format, you can actually invent your own String format and use that if you prefer. We'll cover how to do this as part of the Realm Authorization section below.

String-based permissions are beneficial in that you are not forced to implement an interface and simple strings are often easy to read. The downside is that you don't have type safety and if you needed more complicated behavior that are outside the scope of what the Strings represent, you're going to want to implement your own permission objects based on the permission interface. In practice, most Shiro end-users choose the String-based approach for their simplicity, but ultimately your application's requirements will dictate which is better.

Like the Object-based permission check methods, there are String variants to support String-based permission checks:

| Subject Method | Description |
| -------------- | ----------- |
| [`isPermitted(String perm)`](static/current/apidocs/org/apache/shiro/subject/Subject.html#[[#]]#isPermitted-java.lang.String-) | Returns `true` if the `Subject` is permitted to perform an action or access a resource summarized by the specified `String` permission, `false` otherwise. |
| [`isPermitted(String... perms)`](static/current/apidocs/org/apache/shiro/subject/Subject.html#[[#]]#isPermitted-java.util.List-) | Returns an array of `isPermitted` results corresponding to the indices in the method argument. Useful as a performance enhancement if many `String` permission checks need to be performed (e.g. when customizing a complex view) |
| [`isPermittedAll(String... perms)`](static/current/apidocs/org/apache/shiro/subject/Subject.html#[[#]]#isPermittedAll-java.lang.String...-) | Returns `true` if the `Subject` is permitted _all_ of the specified `String` permissions, `false` otherwise. |

<a name="Authorization-PermissionAssertions"></a>
#[[#####Permission Assertions]]#

As an alternative to checking a `boolean` to see if the `Subject` is permitted to do something or not, you can simply assert that they have an expected permission before logic is executed. If the `Subject` is not permitted, an [`AuthorizationException`](static/current/apidocs/org/apache/shiro/authz/AuthorizationException.html) will be thrown. If they are permitted as expected, the assertion will execute quietly and logic will continue as expected.

For example:

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

//guarantee that the current user is permitted 
//to open a bank account: 
Permission p = new AccountPermission("open");
currentUser.checkPermission(p);
openBankAccount();
```

or, the same check, using a String permission:

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

//guarantee that the current user is permitted 
//to open a bank account: 
currentUser.checkPermission("account:open");
openBankAccount();
```

A benefit of this approach over the `isPermitted*` methods is that code can be a bit cleaner in that you don't have to construct your own `AuthorizationExceptions` if the current `Subject` does not meet expected conditions (if you don't want to).

There are few permission-oriented `Subject` assertion methods you can call, depending on your needs:

| Subject Method | Description |
| -------------- | ----------- |
| [`checkPermission(Permission p)`](static/current/apidocs/org/apache/shiro/subject/Subject.html#[[#]]#checkPermission-org.apache.shiro.authz.Permission-) | Returns quietly if the `Subject` is permitted to perform an action or access a resource summarized by the specified `Permission` instance, or throws an `AuthorizationException` if not. |
| [`checkPermission(String perm)`](static/current/apidocs/org/apache/shiro/subject/Subject.html#[[#]]#checkPermission-java.lang.String-) | Returns quietly if the `Subject` is is permitted to perform an action or access a resource summarized by the specified `String` permission, or throws an `AuthorizationException` if not. |
| [`checkPermissions(Collection<Permission> perms)`](static/current/apidocs/org/apache/shiro/subject/Subject.html#[[#]]#checkPermissions-java.util.Collection-) | Returns quietly if the `Subject` is permitted _all_ the specified permissions, or throws an `AuthorizationException` if not. |
| [`checkPermissions(String... perms)`](static/current/apidocs/org/apache/shiro/subject/Subject.html#[[#]]#checkPermissions-java.lang.String...-) | Same effect as the `checkPermissions` method above, but using `String`-based permissions. |

<a name="Authorization-AnnotationbasedAuthorization"></a>
#[[###Annotation-based Authorization]]#

In addition to the `Subject` API calls, Shiro provides a collection of Java 5+ annotations if you prefer meta-based authorization control.

<a name="Authorization-Configuration"></a>
#[[####Configuration]]#

Before you can use Java annotations, you'll need to enable AOP support in your application. There are a number of different AOP frameworks so, unfortunately, there is no standard way to enable AOP in an application.

For AspectJ, you can review our [AspectJ sample application](https://github.com/apache/shiro/tree/master/samples/aspectj).

For Spring applications, you can look into our [Spring Integration](spring.html "Spring") documentation.

For Guice applications, you can look into our [Guice Integration](guice.html "Guice") documentation.

<a name="Authorization-The%7B%7BRequiresAuthentication%7D%7Dannotation"></a>
#[[####The `RequiresAuthentication` annotation]]#

The [RequiresAuthentication](static/current/apidocs/org/apache/shiro/authz/annotation/RequiresAuthentication.html) annotation requires the current `Subject` to have been authenticated during their current session for the annotated class/instance/method to be accessed or invoked.

For example:

``` java
@RequiresAuthentication
public void updateAccount(Account userAccount) {
    //this method will only be invoked by a
    //Subject that is guaranteed authenticated
    ...
}
```

This is mostly equivalent to the following Subject-based logic:

``` java
public void updateAccount(Account userAccount) {
    if (!SecurityUtils.getSubject().isAuthenticated()) {
        throw new AuthorizationException(...);
    }

    //Subject is guaranteed authenticated here
    ...
}
```

<a name="Authorization-The%7B%7BRequiresGuest%7D%7Dannotation"></a>
#[[####The `RequiresGuest` annotation]]#

The [RequiresGuest](static/current/apidocs/org/apache/shiro/authz/annotation/RequiresGuest.html) annotation requires the current Subject to be a "guest", that is, they are not authenticated or remembered from a previous session for the annotated class/instance/method to be accessed or invoked.

For example:

``` java
@RequiresGuest
public void signUp(User newUser) {
    //this method will only be invoked by a
    //Subject that is unknown/anonymous
    ...
}
```

This is mostly equivalent to the following Subject-based logic:

``` java
public void signUp(User newUser) {
    Subject currentUser = SecurityUtils.getSubject();
    PrincipalCollection principals = currentUser.getPrincipals();
    if (principals != null && !principals.isEmpty()) {
        //known identity - not a guest:
        throw new AuthorizationException(...);
    }

    //Subject is guaranteed to be a 'guest' here
    ...
}
```

<a name="Authorization-The%7B%7BRequiresPermissions%7D%7Dannotation"></a>
#[[####The `RequiresPermissions` annotation]]#

The [RequiresPermissions](static/current/apidocs/org/apache/shiro/authz/annotation/RequiresPermissions.html) annotation requires the current Subject be permitted one or more permissions in order to execute the annotated method.

For example:

``` java
@RequiresPermissions("account:create")
public void createAccount(Account account) {
    //this method will only be invoked by a Subject
    //that is permitted to create an account
    ...
}
```

This is mostly equivalent to the following Subject-based logic:

``` java
public void createAccount(Account account) {
    Subject currentUser = SecurityUtils.getSubject();
    if (!subject.isPermitted("account:create")) {
        throw new AuthorizationException(...);
    }

    //Subject is guaranteed to be permitted here
    ...
}
```

<a name="Authorization-The%7B%7BRequiresRoles%7D%7Dpermission"></a>
#[[####The `RequiresRoles` permission]]#

The [RequiresRoles](static/current/apidocs/org/apache/shiro/authz/annotation/RequiresRoles.html) annotation requires the current Subject to have all of the specified roles. If they do not have the role(s), the method will not be executed and an AuthorizationException is thrown.

For example:

``` java
@RequiresRoles("administrator")
public void deleteUser(User user) {
    //this method will only be invoked by an administrator
    ...
}
```

This is mostly equivalent to the following Subject-based logic:

``` java
public void deleteUser(User user) {
    Subject currentUser = SecurityUtils.getSubject();
    if (!subject.hasRole("administrator")) {
        throw new AuthorizationException(...);
    }

    //Subject is guaranteed to be an 'administrator' here
    ...
}
```

<a name="Authorization-The%7B%7BRequiresUser%7D%7Dannotation"></a>
#[[####The `RequiresUser` annotation]]#

The [RequiresUser](static/current/apidocs/org/apache/shiro/authz/annotation/RequiresUser.html)* annotation requires the current Subject to be an application user for the annotated class/instance/method to be accessed or invoked. An 'application user' is defined as a `Subject` that has a known identity, either known due to being authenticated during the current session or remembered from 'RememberMe' services from a previous session.

``` java
@RequiresUser
public void updateAccount(Account account) {
    //this method will only be invoked by a 'user'
    //i.e. a Subject with a known identity
    ...
}
```

This is mostly equivalent to the following Subject-based logic:

``` java
public void updateAccount(Account account) {
    Subject currentUser = SecurityUtils.getSubject();
    PrincipalCollection principals = currentUser.getPrincipals();
    if (principals == null || principals.isEmpty()) {
        //no identity - they're anonymous, not allowed:
        throw new AuthorizationException(...);
    }

    //Subject is guaranteed to have a known identity here
    ...
}
```

<a name="Authorization-JSPTagLibAuthorization"></a>
#[[###JSP TagLib Authorization]]#

Shiro offers a Tag Library for controlling JSP/GSP page output based on `Subject` state. This is covered in the [Web](web.html "Web") chapter's [JSP/GSP Tag Library](web.html#[[#]]#Web-taglibrary) section.

<a name="Authorization-AuthorizationSequence"></a>
Authorization Sequence
----------------------

Now that we've seen how to perform authorization based on the current `Subject`, let's take a look at what happens inside Shiro whenever an authorization call is made.

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

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

**Step 1**: Application or framework code invokes any of the `Subject` `hasRole*`, `checkRole*`, `isPermitted*`, or `checkPermission*` method variants, passing in whatever permission or role representation is required.

**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 the `securityManager`'s nearly identical respective `hasRole*`, `checkRole*`, `isPermitted*`, or `checkPermission*` method variants (the `securityManager` implements the [`org.apache.shiro.authz.Authorizer`](static/current/apidocs/org/apache/shiro/authz/Authorizer.html) interface, which defines all Subject-specific authorization methods).

**Step 3**: The `SecurityManager`, being a basic 'umbrella' component, relays/delegates to its internal [`org.apache.shiro.authz.Authorizer`](static/current/apidocs/org/apache/shiro/authz/Authorizer.html) instance by calling the `authorizer`'s respective `hasRole*`, `checkRole*`, `isPermitted*`, or `checkPermission*` method. The `authorizer` instance is by default a [`ModularRealmAuthorizer`](static/current/apidocs/org/apache/shiro/authz/ModularRealmAuthorizer.html) instance, which supports coordinating one or more `Realm` instances during any authorization operation.

**Step 4**: Each configured `Realm` is checked to see if it implements the same [`Authorizer`](static/current/apidocs/org/apache/shiro/authz/Authorizer.html) interface. If so, the Realm's own respective `hasRole*`, `checkRole*`, `isPermitted*`, or `checkPermission*` method is called.

<a name="Authorization-%7B%7BModularRealmAuthorizer%7D%7D"></a>
#[[###`ModularRealmAuthorizer`]]#

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

For any authorization operation, the `ModularRealmAuthorizer` will iterate over its internal collection of `Realms` and interact with each one in iteration order. Each `Realm` interaction functions as follows:

1.  If the `Realm` itself implements the [`Authorizer`](static/current/apidocs/org/apache/shiro/authz/Authorizer.html) interface, its respective `Authorizer` method (`hasRole*`, `checkRole*`, `isPermitted*`, or `checkPermission*`) is called.

    1.  If the Realm's method results in an exception, the exception is propagated as an [`AuthorizationException`](static/current/apidocs/org/apache/shiro/authc/AuthenticationException.html) to the `Subject` caller. This short-circuits the authorization process and any remaining Realms will not be consulted for that authorization operation.
    
    2.  If the Realm's method is a `hasRole*` or `isPermitted*` variant that returns a boolean and that return value is `true`, the `true` value is returned immediately and any remaining Realms are short circuited. This behavior exists as a performance enhancement, as typically if permitted by one Realm, it is implied that the Subject is permitted. This favors security policies where everything is prohibited by default and things are explicitly allowed, the most secure type of security policy.

2.  If the Realm does not implement the `Authorizer` interface, it is ignored.

<a name="Authorization-RealmAuthorizationOrder"></a>
#[[####Realm Authorization Order]]#

It is important to point out that, exactly like authentication, the `ModularRealmAuthorizer` will interact with Realm instances in _iteration_ order.

The `ModularRealmAuthorizer` has access to the `Realm` instances configured on the `SecurityManager`. When executing an authorization operation, it will iterate over that collection, and for each `Realm` that implements the `Authorizer` interface itself, invoke the Realm's respective `Authorizer` method (e.g. `hasRole*`, `checkRole*`, `isPermitted*`, or `checkPermission*`).

<a name="Authorization-Configuringaglobal%7B%7BPermissionResolver%7D%7D"></a>
#[[####Configuring a global `PermissionResolver`]]#

When performing a `String`-based permission check, most of Shiro's default `Realm` implementations convert this String into an actual [`Permission`](static/current/apidocs/org/apache/shiro/authz/Permission.html) instance first before performing permission _implication_ logic.

This is because Permissions are evaluated based on implication logic and not a direct equality check (see the [Permission](permissions.html "Permissions") documentation for more about implication vs. equality). Implication logic is better represented in code than via String comparisons. Therefore, most Realms need to convert, or _resolve_ a submitted permission string into a corresponding representative `Permission` instance.

To aid in this conversion, Shiro supports the notion of a [`PermissionResolver`](static/current/apidocs/org/apache/shiro/authz/permission/PermissionResolver.html). Most `Shiro` Realm implementations use a `PermissionResolver` to support their implementation of the `Authorizer` interface's `String`-based permission methods: when one of these methods is invoked on the Realm, it will use the `PermissionResolver` to convert the string into a Permission instance, and perform the check that way.

All Shiro `Realm` implementations default to an internal [WildcardPermissionResolver](static/current/apidocs/org/apache/shiro/authz/permission/WildcardPermissionResolver.html) which assumes Shiro's [`WildcardPermission`](static/current/apidocs/org/apache/shiro/authz/permission/WildcardPermission.html) String format.

If you want to create your own `PermissionResolver` implementation, perhaps to support your own Permission string syntax, and you want all configured `Realm` instances to support that syntax, you can set your `PermissionResolver` globally for all `Realms` that can be configured with one.

For example, in `shiro.ini`:

**shiro.ini**
``` java
globalPermissionResolver = com.foo.bar.authz.MyPermissionResolver
...
securityManager.authorizer.permissionResolver = $globalPermissionResolver
...
```

#warning('PermissionResolverAware', 'If you want to configure a global <code>PermissionResolver</code>, each <code>Realm</code> that is to receive the configured <code>PermissionResolver</code> <b><em>must</em></b> implement the <a class="external-link" href="static/current/apidocs/src-html/org/apache/shiro/authz/permission/PermissionResolverAware.html"><code>PermisionResolverAware</code></a> interface.  This guarantees that the configured instance can be relayed to each <code>Realm</code> that supports such configuration.')

If you don't want to use a global `PermissionResolver` or you don't want to be bothered with the `PermissionResolverAware` interface, you can always configure a realm with a `PermissionResolver` instance explicitly (assuming there is a JavaBeans-compatible setPermissionResolver method):

``` java
permissionResolver = com.foo.bar.authz.MyPermissionResolver

realm = com.foo.bar.realm.MyCustomRealm
realm.permissionResolver = $permissionResolver
...
```

<a name="Authorization-Configuringaglobal%7B%7BRolePermissionResolver%7D%7D"></a>
#[[####Configuring a global `RolePermissionResolver`]]#

Similar in concept to a `PermissionResolver`, a [`RolePermissionResolver`](static/current/apidocs/org/apache/shiro/authz/permission/RolePermissionResolver.html) has the ability to represent `Permission` instances needed by a `Realm` to perform permission checks.

The key difference with a `RolePermissionResolver` however is that the input `String` is a _role name_, and _not_ a permission string.

A `RolePermissionResolver` can be used by a `Realm` internally when needing to translate a role name into a concrete set of `Permission` instances.

This is a particularly useful feature for supporting legacy or inflexible data sources that may have no notion of permissions.

For example, many LDAP directories store role names (or group names) but do not support association of role names to concrete permissions because they have no 'permission' concept. A Shiro-based application can use the role names stored in LDAP, but implement a `RolePermissionResolver` to convert the LDAP name into a set of explicit permissions to perform preferred explicit access control. The permission associations would be stored in another data store, probably a local database.

Because this notion of converting role names to permissions is very application specific, Shiro's default `Realm` implementations do not use them.

However, if you want to create your own `RolePermissionResolver` and have more than one `Realm` implementation that you want to configure with it, you can set your `RolePermissionResolver` globally for all `Realms` that can be configured with one.

**shiro.ini**

``` java
globalRolePermissionResolver = com.foo.bar.authz.MyPermissionResolver
...
securityManager.authorizer.rolePermissionResolver = $globalRolePermissionResolver
...
```

#warning('RolePermissionResolverAware', 'If you want to configure a global <code>RolePermissionResolver</code>, each <code>Realm</code> that is to receive the configured <code>RolePermissionResolver</code> <b><em>must</em></b> implement the <a class="external-link" href="static/current/apidocs/org/apache/shiro/authz/permission/RolePermissionResolverAware.html"><code>RolePermisionResolverAware</code></a> interface.  This guarantees that the configured global <code>RolePermissionResolver</code> instance can be relayed to each <code>Realm</code> that supports such configuration.')

If you don't want to use a global `RolePermissionResolver` or you don't want to be bothered with the `RolePermissionResolverAware` interface, you can always configure a realm with a `RolePermissionResolver` instance explicitly (assuming there is a JavaBeans-compatible setRolePermissionResolver method):

``` ini
rolePermissionResolver = com.foo.bar.authz.MyRolePermissionResolver

realm = com.foo.bar.realm.MyCustomRealm
realm.rolePermissionResolver = $rolePermissionResolver
...
```

<a name="Authorization-CustomAuthorizer"></a>
#[[###Custom Authorizer]]#

If your application uses more than one realm to perform authorization and the `ModularRealmAuthorizer`'s default simple iteration-based, short-circuiting authorization behavior does not suit your needs, you will probably want to create a custom `Authorizer` and configure the `SecurityManager` accordingly.

For example, in `shiro.ini`:

``` ini
[main]
...
authorizer = com.foo.bar.authz.CustomAuthorizer

securityManager.authorizer = $authorizer
```
<input type="hidden" id="ghEditPage" value="authorization.md.vtl"></input>
