You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shiro.apache.org by bd...@apache.org on 2016/10/24 14:33:53 UTC

svn commit: r1766414 [9/16] - /shiro/site/publish/

Modified: shiro/site/publish/overview.html
URL: http://svn.apache.org/viewvc/shiro/site/publish/overview.html?rev=1766414&r1=1766413&r2=1766414&view=diff
==============================================================================
--- shiro/site/publish/overview.html (original)
+++ shiro/site/publish/overview.html Mon Oct 24 14:33:52 2016
@@ -78,112 +78,88 @@
 
         <div id="content">
 
-            <h1><a name="Overview-OverviewofApacheShiro"></a>Overview of Apache Shiro</h1>
-
-<h2><a name="Overview-Introduction"></a>Introduction</h2>
-
+            <a name="Overview-OverviewofApacheShiro"></a>
+<h1><a href="#overview-of-apache-shiro" name="overview-of-apache-shiro">Overview of Apache Shiro</a></h1>
+<a name="Overview-Introduction"></a>
+<h2><a href="#introduction" name="introduction">Introduction</a></h2>
 <p>Apache Shiro is a powerful and flexible open-source security framework that cleanly handles authentication, authorization, enterprise session management and cryptography.</p>
-
-<p>Apache Shiro's first and foremost goal is to be easy to use and understand.  Security can be very complex at times, even painful, but it doesn't have to be.  A framework should mask complexities where possible and expose a clean and intuitive API that simplifies the developer's effort to make their application(s) secure.</p>
-
+<p>Apache Shiro&rsquo;s first and foremost goal is to be easy to use and understand. Security can be very complex at times, even painful, but it doesn&rsquo;t have to be. A framework should mask complexities where possible and expose a clean and intuitive API that simplifies the developer&rsquo;s effort to make their application(s) secure.</p>
 <p>Here are some things that you can do with Apache Shiro:</p>
-
-<ul><li>Authenticate a user to verify their identity</li><li>Perform access control for a user, such as:
-	<ul><li>Determine if a user is assigned a certain security role or not</li><li>Determine if a user is permitted to do something or not</li></ul>
-	</li><li>Use a Session API in any environment, even without web or EJB containers.</li><li>React to events during authentication, access control, or during a session's lifetime.</li><li>Aggregate 1 or more data sources of user security data and present this all as a single composite user 'view'.</li><li>Enable Single Sign On (SSO) functionality</li><li>Enable 'Remember Me' services for user association without login<br clear="none">
-...<br clear="none">
-and much more - all integrated into a cohesive easy-to-use API.</li></ul>
-
-
-<p>Shiro attempts to achieve these goals for all application environments - from the simplest command line application to the largest enterprise applications, without forcing dependencies on other 3rd party frameworks, containers, or application servers.  Of course the project aims to integrate into these environments wherever possible, but it could be used out-of-the-box in any environment.</p>
-
-<h2><a name="Overview-Features"></a>Features</h2>
-
-<p>Apache Shiro is a comprehensive application security framework with many features.  The following diagram shows where Shiro focuses its energy, and this reference manual will be organized similarly:</p>
-
-<p><br clear="none" class="atl-forced-newline">
-<br clear="none" class="atl-forced-newline">
-<span class="image-wrap" style="display: block; text-align: center"><img src="overview.data/ShiroFeatures.png" style="border: 0px solid black"></span>
-<br clear="none" class="atl-forced-newline">
-<br clear="none" class="atl-forced-newline"></p>
-
-<p>Shiro targets what the Shiro development team calls "the four cornerstones of application security" - Authentication, Authorization, Session Management, and Cryptography:</p>
-
-<ul><li><b>Authentication:</b> Sometimes referred to as 'login', this is the act of proving a user is who they say they are.
-<br clear="none" class="atl-forced-newline">
-<br clear="none" class="atl-forced-newline"></li><li><b>Authorization:</b> The process of access control, i.e. determining 'who' has access to 'what'.
-<br clear="none" class="atl-forced-newline">
-<br clear="none" class="atl-forced-newline"></li><li><b>Session Management:</b> Managing user-specific sessions, even in non-web or EJB applications.
-<br clear="none" class="atl-forced-newline">
-<br clear="none" class="atl-forced-newline"></li><li><b>Cryptography:</b> Keeping data secure using cryptographic algorithms while still being easy to use.</li></ul>
-
-
+<ul>
+  <li>Authenticate a user to verify their identity</li>
+  <li>Perform access control for a user, such as:
+    <ul>
+      <li>Determine if a user is assigned a certain security role or not</li>
+      <li>Determine if a user is permitted to do something or not</li>
+    </ul>
+  </li>
+  <li>Use a Session API in any environment, even without web or EJB containers.</li>
+  <li>React to events during authentication, access control, or during a session&rsquo;s lifetime.</li>
+  <li>Aggregate 1 or more data sources of user security data and present this all as a single composite user &lsquo;view&rsquo;.</li>
+  <li>Enable Single Sign On (SSO) functionality</li>
+  <li>Enable &lsquo;Remember Me&rsquo; services for user association without login<br/>&hellip;<br/>and much more - all integrated into a cohesive easy-to-use API.</li>
+</ul>
+<p>Shiro attempts to achieve these goals for all application environments - from the simplest command line application to the largest enterprise applications, without forcing dependencies on other 3rd party frameworks, containers, or application servers. Of course the project aims to integrate into these environments wherever possible, but it could be used out-of-the-box in any environment.</p>
+<a name="Overview-Features"></a>
+<h2><a href="#features" name="features">Features</a></h2>
+<p>Apache Shiro is a comprehensive application security framework with many features. The following diagram shows where Shiro focuses its energy, and this reference manual will be organized similarly:</p>
+<img src="assets/images/ShiroFeatures.png" style="margin:0px auto;display:block"></img>
+<p>Shiro targets what the Shiro development team calls &ldquo;the four cornerstones of application security&rdquo; - Authentication, Authorization, Session Management, and Cryptography:</p>
+<ul>
+  <li>
+  <p><strong>Authentication:</strong> Sometimes referred to as &lsquo;login&rsquo;, this is the act of proving a user is who they say they are.</p></li>
+  <li>
+  <p><strong>Authorization:</strong> The process of access control, i.e. determining &lsquo;who&rsquo; has access to &lsquo;what&rsquo;.</p></li>
+  <li>
+  <p><strong>Session Management:</strong> Managing user-specific sessions, even in non-web or EJB applications.</p></li>
+  <li>
+  <p><strong>Cryptography:</strong> Keeping data secure using cryptographic algorithms while still being easy to use.</p></li>
+</ul>
 <p>There are also additional features to support and reinforce these concerns in different application environments, especially:</p>
-
-<ul><li>Web Support: Shiro's web support APIs help easily secure web applications.</li><li>Caching: Caching is a first-tier citizen in Apache Shiro's API to ensure that security operations remain fast and efficient.</li><li>Concurrency: Apache Shiro supports multi-threaded applications with its concurrency features.</li><li>Testing: Test support exists to help you write unit and integration tests and ensure your code will be secured as expected.</li><li>"Run As": A feature that allows users to assume the identity of another user (if they are allowed), sometimes useful in administrative scenarios.</li><li>"Remember Me": Remember users' identities across sessions so they only need to log in when mandatory.</li></ul>
-
-
-<p></p>
-
-<h2><a name="Overview-AFirstLookatApacheShiro"></a>A First Look at Apache Shiro</h2>
-
-<p>Apache Shiro's design goals are to simplify application security by being intuitive and easy to use.  Shiro's core design models how most people think about application security - in the context of someone (or something) interacting with an application.</p>
-
-<p>Software applications are usually designed based on user stories.  That is, you'll often design user interfaces or service APIs based on how a user would (or should) interact with the software.  For example, you might say, "If the user interacting with my application is logged in, I will show them a button they can click to view their account information.  If they are not logged in, I will show a sign-up button."  </p>
-
-<p>This example statement indicates that applications are largely written to satisfy user requirements and needs.  Even if the 'user' is another software system and not a human being, you still write code to reflect behavior based on who (or what) is currently interacting with your software.</p>
-
+<ul>
+  <li>Web Support: Shiro&rsquo;s web support APIs help easily secure web applications.</li>
+  <li>Caching: Caching is a first-tier citizen in Apache Shiro&rsquo;s API to ensure that security operations remain fast and efficient.</li>
+  <li>Concurrency: Apache Shiro supports multi-threaded applications with its concurrency features.</li>
+  <li>Testing: Test support exists to help you write unit and integration tests and ensure your code will be secured as expected.</li>
+  <li>&ldquo;Run As&rdquo;: A feature that allows users to assume the identity of another user (if they are allowed), sometimes useful in administrative scenarios.</li>
+  <li>&ldquo;Remember Me&rdquo;: Remember users&rsquo; identities across sessions so they only need to log in when mandatory.</li>
+</ul>
+<a name="Overview-AFirstLookatApacheShiro"></a>
+<h2><a href="#a-first-look-at-apache-shiro" name="a-first-look-at-apache-shiro">A First Look at Apache Shiro</a></h2>
+<p>Apache Shiro&rsquo;s design goals are to simplify application security by being intuitive and easy to use. Shiro&rsquo;s core design models how most people think about application security - in the context of someone (or something) interacting with an application.</p>
+<p>Software applications are usually designed based on user stories. That is, you&rsquo;ll often design user interfaces or service APIs based on how a user would (or should) interact with the software. For example, you might say, &ldquo;If the user interacting with my application is logged in, I will show them a button they can click to view their account information. If they are not logged in, I will show a sign-up button.&rdquo;</p>
+<p>This example statement indicates that applications are largely written to satisfy user requirements and needs. Even if the &lsquo;user&rsquo; is another software system and not a human being, you still write code to reflect behavior based on who (or what) is currently interacting with your software.</p>
 <p>Shiro largely reflects these concepts in its own design. By matching what is already intuitive for software developers, Apache Shiro remains intuitive and easy to use in practically any application.</p>
-
-<h3><a name="Overview-BasicDesign"></a>Basic Design</h3>
-
-<p>Shiro's architecture has 3 primary concepts: the <tt>Subject</tt>, <tt>SecurityManager</tt> and <tt>Realm</tt> s.  The following diagram is a high-level overview of how these concepts interact, and we'll cover each concept below:</p>
-
-<p><br clear="none" class="atl-forced-newline">
-<br clear="none" class="atl-forced-newline">
-<span class="image-wrap" style="display: block; text-align: center"><img src="overview.data/ShiroBasicArchitecture.png" style="border: 0px solid black"></span>
-<br clear="none" class="atl-forced-newline">
-<br clear="none" class="atl-forced-newline"></p>
-
-<h4><a name="Overview-Subject"></a>Subject</h4>
-
-<p>The <tt>Subject</tt> is essentially a security specific 'view' of the the currently executing user.  Notice that it is not actually named <em>User</em> however.  The name <em>Subject</em> was chosen for two reasons: </p>
-
-<ol><li>The word 'User' often implies a human being in many software systems.  But sometimes the 'currently executing user' isn't a human being at all - maybe it is a 3rd-party process or remote server or daemon account.  The word 'Subject' is more general and can mean 'the entity interacting with the software'.</li><li>The word 'Subject', because it is a general-purpose concept, is the actual term most often used in the security world.  We retain that definition to be consistent.</li></ol>
-
-
-<p>You can acquire the current <tt>Subject</tt> anywhere in your application code as shown here:</p>
-
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-<span class="code-keyword">import</span> org.apache.shiro.subject.Subject;
-<span class="code-keyword">import</span> org.apache.shiro.SecurityUtils;
+<a name="Overview-BasicDesign"></a>
+<h3><a href="#basic-design" name="basic-design">Basic Design</a></h3>
+<p>Shiro&rsquo;s architecture has 3 primary concepts: the <code>Subject</code>, <code>SecurityManager</code> and <code>Realm</code> s. The following diagram is a high-level overview of how these concepts interact, and we&rsquo;ll cover each concept below:</p>
+<img src="assets/images/ShiroBasicArchitecture.png" style="margin:0px auto;display:block"></img>
+<a name="Overview-Subject"></a>
+<h4><a href="#subject" name="subject">Subject</a></h4>
+<p>The <code>Subject</code> is essentially a security specific &lsquo;view&rsquo; of the the currently executing user. Notice that it is not actually named <em>User</em> however. The name <em>Subject</em> was chosen for two reasons:</p>
+<ol>
+  <li>The word &lsquo;User&rsquo; often implies a human being in many software systems. But sometimes the &lsquo;currently executing user&rsquo; isn&rsquo;t a human being at all - maybe it is a 3rd-party process or remote server or daemon account. The word &lsquo;Subject&rsquo; is more general and can mean &lsquo;the entity interacting with the software&rsquo;.</li>
+  <li>The word &lsquo;Subject&rsquo;, because it is a general-purpose concept, is the actual term most often used in the security world. We retain that definition to be consistent.</li>
+</ol>
+<p>You can acquire the current <code>Subject</code> anywhere in your application code as shown here:</p>
+<pre><code class="java">import org.apache.shiro.subject.Subject;
+import org.apache.shiro.SecurityUtils;
 ...
 Subject currentUser = SecurityUtils.getSubject();
-</pre>
-</div></div>
-
-<p>Once you have a <tt>Subject</tt> instance, you immediately have access to 90% of everything you would ever need to do to perform security for that Subject, such as login and logout, perform role and permission checks, access their session, and more - but more about this later.  The most important thing to know is that the <tt>Subject</tt> is your 'security-specific view' of an application 'user' and that you can essentially access this anywhere in application code to perform whatever security operations you need. </p>
-
-<h4><a name="Overview-TheSecurityManager"></a>The SecurityManager</h4>
-
-<p>While application developers almost exclusively interact with <tt>Subject</tt> instances in their code, Subjects have a 'behind the scenes' counterpart that makes them work - the Shiro <tt>SecurityManager</tt> (note this is <em>not</em> the same thing as the <tt>java.lang.SecurityManager</tt>).</p>
-
-<p>While a <tt>Subject</tt> instance represents security information and operations for a single user, the Shiro <tt>SecurityManager</tt> manages security operations for <em>all</em> users.  It is essentially the 'man behind the curtain' that manages all features in Shiro for all Subjects.  Each software application that uses Shiro typically has one and only one <tt>SecurityManager</tt> instance.</p>
-
-<p>The <tt>SecurityManager</tt> is the heart of Shiro&#8217;s architecture and acts as a sort of 'umbrella&#8217; object that coordinates internally nested security components that form an object graph. However, once the SecurityManager and its internal object graph is configured, it is usually left alone and application developers spend almost all of their time with the <tt>Subject</tt> API.</p>
-
-<p>We will talk about the <tt>SecurityManager</tt> in detail later on, but it is important to realize that when you interact with a <tt>Subject</tt>, it is really the <tt>SecurityManager</tt> behind the scenes that does all the heavy lifting for any <tt>Subject</tt> security operation.  This is reflected in the basic flow diagram above.</p>
-
-<h4><a name="Overview-Realms"></a>Realms</h4>
-
-<p>The third and final core concept in Shiro is that of a Realm. A Realm acts as the &#8216;bridge&#8217; or &#8216;connector&#8217; between Shiro and your application&#8217;s security data. That is, when it comes time to actually interact with security-related data like user accounts to perform authentication (login) and authorization (access control), Shiro looks up many of these things from one or more Realms configured for an application.</p>
-
-<p>In this sense a Realm is essentially a security-specific <a class="external-link" href="https://en.wikipedia.org/wiki/Data_access_object" rel="nofollow">DAO</a>: it encapsulates connection details for data sources and makes the associated data available to Shiro as needed. When configuring Shiro, you must specify at least one Realm to use for authentication and/or authorization. More than one Realm may be configured, but at least one is required.</p>
-
+</code></pre>
+<p>Once you have a <code>Subject</code> instance, you immediately have access to 90% of everything you would ever need to do to perform security for that Subject, such as login and logout, perform role and permission checks, access their session, and more - but more about this later. The most important thing to know is that the <code>Subject</code> is your &lsquo;security-specific view&rsquo; of an application &lsquo;user&rsquo; and that you can essentially access this anywhere in application code to perform whatever security operations you need.</p>
+<a name="Overview-TheSecurityManager"></a>
+<h4><a href="#the-securitymanager" name="the-securitymanager">The SecurityManager</a></h4>
+<p>While application developers almost exclusively interact with <code>Subject</code> instances in their code, Subjects have a &lsquo;behind the scenes&rsquo; counterpart that makes them work - the Shiro <code>SecurityManager</code> (note this is <em>not</em> the same thing as the <code>java.lang.SecurityManager</code>).</p>
+<p>While a <code>Subject</code> instance represents security information and operations for a single user, the Shiro <code>SecurityManager</code> manages security operations for <em>all</em> users. It is essentially the &lsquo;man behind the curtain&rsquo; that manages all features in Shiro for all Subjects. Each software application that uses Shiro typically has one and only one <code>SecurityManager</code> instance.</p>
+<p>The <code>SecurityManager</code> is the heart of Shiro’s architecture and acts as a sort of &rsquo;umbrella’ object that coordinates internally nested security components that form an object graph. However, once the SecurityManager and its internal object graph is configured, it is usually left alone and application developers spend almost all of their time with the <code>Subject</code> API.</p>
+<p>We will talk about the <code>SecurityManager</code> in detail later on, but it is important to realize that when you interact with a <code>Subject</code>, it is really the <code>SecurityManager</code> behind the scenes that does all the heavy lifting for any <code>Subject</code> security operation. This is reflected in the basic flow diagram above.</p>
+<a name="Overview-Realms"></a>
+<h4><a href="#realms" name="realms">Realms</a></h4>
+<p>The third and final core concept in Shiro is that of a Realm. A Realm acts as the ‘bridge’ or ‘connector’ between Shiro and your application’s security data. That is, when it comes time to actually interact with security-related data like user accounts to perform authentication (login) and authorization (access control), Shiro looks up many of these things from one or more Realms configured for an application.</p>
+<p>In this sense a Realm is essentially a security-specific <a href="https://en.wikipedia.org/wiki/Data_access_object">DAO</a>: it encapsulates connection details for data sources and makes the associated data available to Shiro as needed. When configuring Shiro, you must specify at least one Realm to use for authentication and/or authorization. More than one Realm may be configured, but at least one is required.</p>
 <p>Shiro provides out-of-the-box Realms to connect to a number of security data sources (aka directories) such as LDAP, relational databases (JDBC), text configuration sources like INI and properties files, and more. You can plug-in your own Realm implementations to represent custom data sources if the default Realms do not meet your needs.</p>
-
-<p>Like other internal components, the Shiro <tt>SecurityManager</tt> manages how Realms are used to acquire security data and then represented as <tt>Subject</tt> instances.</p>
+<p>Like other internal components, the Shiro <code>SecurityManager</code> manages how Realms are used to acquire security data and then represented as <code>Subject</code> instances.</p>
 
         </div>
 

Modified: shiro/site/publish/permissions.html
URL: http://svn.apache.org/viewvc/shiro/site/publish/permissions.html?rev=1766414&r1=1766413&r2=1766414&view=diff
==============================================================================
--- shiro/site/publish/permissions.html (original)
+++ shiro/site/publish/permissions.html Mon Oct 24 14:33:52 2016
@@ -79,332 +79,181 @@
         <div id="content">
 
             <h1><a name="Permissions-UnderstandingPermissionsinApacheShiro"></a>Understanding Permissions in Apache Shiro</h1>
+<table align="right" width="275" style="margin-left: 20px; margin-bottom: 20px; border-style: solid; border-width: 2px; border-color: navy" cellpadding="10px"><tbody><tr><td>
 
-<table align="right" width="275" style="margin-left: 20px; margin-bottom: 20px; border-style: solid; border-width: 2px; border-color: navy" cellpadding="10px">
-
-<tr>
-<td>
 <div id="border">
-  <h2>Related Content</h2>
-	
-  <h3><a href="java-authorization-guide.html">Java Authorization Guide</a></h3>
-  <p>Learn how Shiro handles access control in Java. </br><span style="font-size:11"><a href="java-authorization-guide.html">Read More &gt;&gt;</a></span></p>	
-	
-  <h3><a href="webapp-tutorial.html">Web App Tutorial</a></h3>
-  <p>Step-by-step tutorial for securing a web application with Shiro. </br><span style="font-size:11"><a href="webapp-tutorial.html">Read More &gt;&gt;</a></span></p>
-	
-  <h3><a href="get-started.html">Getting Started</a></h3>
-  <p>Resources, guides and tutorials for new Shiro users. </br><span style="font-size:11"><a href="get-started.html">Read More &gt;&gt;</a></span></p>	
-	
-	<h3><a href="10-minute-tutorial.html">10-Minute Shiro Tutorial</a></h3>
-  <p>Try Apache Shiro for yourself in under 10 minutes. </br><span style="font-size:11"><a href="10-minute-tutorial.html">Read More &gt;&gt;</a></span></p>
-  
-</div>
-</td>
-</tr>
-</table>
+    <h2>Related Content</h2>
 
-<p>Shiro defines a Permission as a statement that defines an explicit behavior or action.  It is a statement of raw functionality in an application and nothing more.  Permissions are the lowest-level constructs in security polices, and they explicitly define only "what" the application can do.</p>
+    <h3><a href="java-authorization-guide.html">Java Authorization Guide</a></h3>
+    <p>Learn how Shiro handles access control in Java. <br><span style="font-size:11"><a href="java-authorization-guide.html">Read More &gt;&gt;</a></span></p>
 
-<p>They do <em>not</em> at all describe "who" is able to perform the action(s).</p>
+    <h3><a href="webapp-tutorial.html">Web App Tutorial</a></h3>
+    <p>Step-by-step tutorial for securing a web application with Shiro. <br><span style="font-size:11"><a href="webapp-tutorial.html">Read More &gt;&gt;</a></span></p>
 
-<p>Some examples of permissions:</p>
-<ul><li>Open a file</li><li>View the '/user/list' web page</li><li>Print documents</li><li>Delete the 'jsmith' user</li></ul>
+    <h3><a href="get-started.html">Getting Started</a></h3>
+    <p>Resources, guides and tutorials for new Shiro users. <br><span style="font-size:11"><a href="get-started.html">Read More &gt;&gt;</a></span></p>
 
+    <h3><a href="10-minute-tutorial.html">10-Minute Shiro Tutorial</a></h3>
+    <p>Try Apache Shiro for yourself in under 10 minutes. <br><span style="font-size:11"><a href="10-minute-tutorial.html">Read More &gt;&gt;</a></span></p>
 
-<p>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.  </p>
-
-<p>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.</p>
+</div>
 
+</td></tr></tbody></table>
+<p>Shiro defines a Permission as a statement that defines an explicit behavior or action. It is a statement of raw functionality in an application and nothing more. Permissions are the lowest-level constructs in security polices, and they explicitly define only &ldquo;what&rdquo; the application can do.</p>
+<p>They do <em>not</em> at all describe &ldquo;who&rdquo; is able to perform the action(s).</p>
+<p>Some examples of permissions:</p>
+<ul>
+  <li>Open a file</li>
+  <li>View the &lsquo;/user/list&rsquo; web page</li>
+  <li>Print documents</li>
+  <li>Delete the &lsquo;jsmith&rsquo; user</li>
+</ul>
+<p>Defining &ldquo;who&rdquo; (users) is allowed to do &ldquo;what&rdquo; (permissions) is an exercise of assigning permissions to users in some way. This is always done by the application&rsquo;s data model and can vary greatly across applications.</p>
+<p>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.</p>
 <p>There are many variations for how permissions could be granted to users - the application determines how to model this based on the application requirements.</p>
-
-<h2><a name="Permissions-WildcardPermissions"></a>Wildcard Permissions</h2>
-
-<p>The above examples of permissions, "Open a file", "View the 'user/list' web page", etc are all valid permission statements.  However, it would be very difficult computationally to interpret those natural language strings and determine if a user is allowed to perform that behavior or not.</p>
-
+<a name="Permissions-WildcardPermissions"></a>
+<h2><a href="#wildcard-permissions" name="wildcard-permissions">Wildcard Permissions</a></h2>
+<p>The above examples of permissions, &ldquo;Open a file&rdquo;, &ldquo;View the &lsquo;user/list&rsquo; web page&rdquo;, etc are all valid permission statements. However, it would be very difficult computationally to interpret those natural language strings and determine if a user is allowed to perform that behavior or not.</p>
 <p>So to enable easy-to-process yet still readable permission statements, Shiro provides powerful and intuitive permission syntax we refer to as the WildcardPermission.</p>
-
-<h3><a name="Permissions-SimpleUsage"></a>Simple Usage</h3>
-
-<p>Let's you want to protect access to your company's printers such that some people can print to particular printers, while others can query what jobs are currently in the queue. </p>
-
-<p>An extremely simple approach would be to use grant the user a "queryPrinter" permission.  Then you could check to see if the user has the queryPrinter permission by calling:</p>
-
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-subject.isPermitted(<span class="code-quote">"queryPrinter"</span>)
-</pre>
-</div></div>
-
+<a name="Permissions-SimpleUsage"></a>
+<h3><a href="#simple-usage" name="simple-usage">Simple Usage</a></h3>
+<p>Let&rsquo;s you want to protect access to your company&rsquo;s printers such that some people can print to particular printers, while others can query what jobs are currently in the queue.</p>
+<p>An extremely simple approach would be to use grant the user a &ldquo;queryPrinter&rdquo; permission. Then you could check to see if the user has the queryPrinter permission by calling:</p>
+<pre><code class="java">subject.isPermitted(&quot;queryPrinter&quot;)
+</code></pre>
 <p>This is (mostly) equivalent to</p>
-
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-subject.isPermitted( <span class="code-keyword">new</span> WildcardPermission(<span class="code-quote">"queryPrinter"</span>) )
-</pre>
-</div></div>
-
+<pre><code class="java">subject.isPermitted( new WildcardPermission(&quot;queryPrinter&quot;) )
+</code></pre>
 <p>but more on that later.</p>
-
-<p>The simple permission string may work for simple applications, but it requires you to have permissions like "printPrinter", "queryPrinter", "managePrinter", etc.  You can also grant a user "*" permissions using the wildcard character (giving this permission construct its name), which means they have <b><em>all</em></b> permissions across <em>the entire application</em>.  </p>
-
-<p>But using this approach there's no way to just say a user has "all printer permissions".  For this reason, Wildcard Permissions supports multiple <em>levels</em> of permissioning. </p>
-
-<h3><a name="Permissions-MultipleParts"></a>Multiple Parts</h3>
-
-<p>Wildcard Permissions support the concept of multiple <em>levels</em> or <em>parts</em>. For example, you could restructure the previous simple example by granting a user the permission </p>
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-printer:query
-</pre>
-</div></div>
+<p>The simple permission string may work for simple applications, but it requires you to have permissions like &ldquo;printPrinter&rdquo;, &ldquo;queryPrinter&rdquo;, &ldquo;managePrinter&rdquo;, etc. You can also grant a user &quot;*&quot; permissions using the wildcard character (giving this permission construct its name), which means they have <strong><em>all</em></strong> permissions across <em>the entire application</em>.</p>
+<p>But using this approach there&rsquo;s no way to just say a user has &ldquo;all printer permissions&rdquo;. For this reason, Wildcard Permissions supports multiple <em>levels</em> of permissioning.</p>
+<a name="Permissions-MultipleParts"></a>
+<h3><a href="#multiple-parts" name="multiple-parts">Multiple Parts</a></h3>
+<p>Wildcard Permissions support the concept of multiple <em>levels</em> or <em>parts</em>. For example, you could restructure the previous simple example by granting a user the permission</p>
+<pre><code class="ini">printer:query
+</code></pre>
 <p>The colon in this example is a special character used to delimit the next part in the permission string.</p>
-
-<p>In this example, the first part is the domain that is being operated on (<tt>printer</tt>) and the second part is the action (<tt>query</tt>) being performed. The other above examples would be changed to:</p>
-
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-printer:print
+<p>In this example, the first part is the domain that is being operated on (<code>printer</code>) and the second part is the action (<code>query</code>) being performed. The other above examples would be changed to:</p>
+<pre><code class="ini">printer:print
 printer:manage
-</pre>
-</div></div>
-
+</code></pre>
 <p>There is no limit to the number of parts that can be used, so it is up to your imagination in terms of ways that this could be used in your application.</p>
-
-<h4><a name="Permissions-MultipleValues"></a>Multiple Values</h4>
-
-<p>Each part can contain multiple values. So instead of granting the user both the "printer:print" and "printer:query" permissions, you could simply grant them one: </p>
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-printer:print,query
-</pre>
-</div></div>
-
-<p>which gives them the ability to <tt>print</tt> and <tt>query</tt> printers.  And since they are granted both those actions, you could check to see if the user has the ability to query printers by calling:</p>
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-subject.isPermitted(<span class="code-quote">"printer:query"</span>)
-</pre>
-</div></div>
-<p>which would return <tt>true</tt></p>
-
-<h4><a name="Permissions-AllValues"></a>All Values</h4>
-
-<p>What if you wanted to grant a user <em>all</em> values in a particular part?  It would be more convenient to do this than to have to manually list every value.  Again, based on the wildcard character, we can do this.  If the <tt>printer</tt> domain had 3 possible actions (<tt>query</tt>, <tt>print</tt>, and <tt>manage</tt>), this:</p>
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-printer:query,print,manage
-</pre>
-</div></div>
+<a name="Permissions-MultipleValues"></a>
+<h4><a href="#multiple-values" name="multiple-values">Multiple Values</a></h4>
+<p>Each part can contain multiple values. So instead of granting the user both the &ldquo;printer:print&rdquo; and &ldquo;printer:query&rdquo; permissions, you could simply grant them one:</p>
+<pre><code class="ini">printer:print,query
+</code></pre>
+<p>which gives them the ability to <code>print</code> and <code>query</code> printers. And since they are granted both those actions, you could check to see if the user has the ability to query printers by calling:</p>
+<pre><code class="java">subject.isPermitted(&quot;printer:query&quot;)
+</code></pre>
+<p>which would return <code>true</code></p>
+<a name="Permissions-AllValues"></a>
+<h4><a href="#all-values" name="all-values">All Values</a></h4>
+<p>What if you wanted to grant a user <em>all</em> values in a particular part? It would be more convenient to do this than to have to manually list every value. Again, based on the wildcard character, we can do this. If the <code>printer</code> domain had 3 possible actions (<code>query</code>, <code>print</code>, and <code>manage</code>), this:</p>
+<pre><code class="ini">printer:query,print,manage
+</code></pre>
 <p>simply becomes this:</p>
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-printer:*
-</pre>
-</div></div>
-
-<p>Then, <em>any</em> permission check for "printer:XXX" will return <tt>true</tt>.  Using the wildcard in this way scales better than explicitly listing actions since, if you added a new action to the application later, you don't need to update the permissions that use the wildcard character in that part.</p>
-
-<p>Finally, it is also possible to use the wildcard token in any part of a wildcard permission string. For example, if you wanted to grant a user the "view" action across <em>all</em> domains (not just printers), you could grant this:</p>
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-*:view
-</pre>
-</div></div>
-
-<p>Then any permission check for "foo:view" would return <tt>true</tt></p>
-
-<h3><a name="Permissions-InstanceLevelAccessControl"></a>Instance-Level Access Control</h3>
-
+<pre><code class="ini">printer:*
+</code></pre>
+<p>Then, <em>any</em> permission check for &ldquo;printer:XXX&rdquo; will return <code>true</code>. Using the wildcard in this way scales better than explicitly listing actions since, if you added a new action to the application later, you don&rsquo;t need to update the permissions that use the wildcard character in that part.</p>
+<p>Finally, it is also possible to use the wildcard token in any part of a wildcard permission string. For example, if you wanted to grant a user the &ldquo;view&rdquo; action across <em>all</em> domains (not just printers), you could grant this:</p>
+<pre><code class="ini">*:view
+</code></pre>
+<p>Then any permission check for &ldquo;foo:view&rdquo; would return <code>true</code></p>
+<a name="Permissions-InstanceLevelAccessControl"></a>
+<h3>Instance-Level Access Control</h3>
 <p>Another common usage of wildcard permissions is to model instance-level Access Control Lists. In this scenario you use three parts - the first is the <em>domain</em>, the second is the <em>action</em>(s), and the third is the instance(s) being acted upon.</p>
-
 <p>So for example you could have</p>
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-printer:query:lp7200
+<pre><code class="ini">printer:query:lp7200
 printer:print:epsoncolor
-</pre>
-</div></div>
-
-<p>The first defines the behavior to <tt>query</tt> the <tt>printer</tt> with the ID <tt>lp7200</tt>.  The second permission defines the behavior to <tt>print</tt> to the <tt>printer</tt> with ID <tt>epsoncolor</tt>.  If you grant these permissions to users, then they can perform specific behavior on <em>specific instances</em>.  Then you can do a check in code:</p>
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-<span class="code-keyword">if</span> ( SecurityUtils.getSubject().isPermitted(<span class="code-quote">"printer:query:lp7200"</span>) {
-    <span class="code-comment">// Return the current jobs on printer lp7200
-</span>}
-</pre>
-</div></div>
-
-<p>This is an extremely powerful way to express permissions.  But again, having to define multiple instance IDs for all printers does not scale well, particularly when new printers are added to the system.  You can instead use a wildcard:</p>
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-printer:print:*
-</pre>
-</div></div>
-
+</code></pre>
+<p>The first defines the behavior to <code>query</code> the <code>printer</code> with the ID <code>lp7200</code>. The second permission defines the behavior to <code>print</code> to the <code>printer</code> with ID <code>epsoncolor</code>. If you grant these permissions to users, then they can perform specific behavior on <em>specific instances</em>. Then you can do a check in code:</p>
+<pre><code class="java">if ( SecurityUtils.getSubject().isPermitted(&quot;printer:query:lp7200&quot;) {
+    // Return the current jobs on printer lp7200 }
+}
+</code></pre>
+<p>This is an extremely powerful way to express permissions. But again, having to define multiple instance IDs for all printers does not scale well, particularly when new printers are added to the system. You can instead use a wildcard:</p>
+<pre><code class="ini">printer:print:*
+</code></pre>
 <p>This does scale, because it covers any new printers as well. You could even allow access to all actions on all printers:</p>
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-printer:*:*
-</pre>
-</div></div>
-
+<pre><code class="ini">printer:*:*
+</code></pre>
 <p>or all actions on a single printer:</p>
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-printer:*:lp7200
-</pre>
-</div></div>
-
+<pre><code class="ini">printer:*:lp7200
+</code></pre>
 <p>or even specific actions:</p>
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-printer:query,print:lp7200
-</pre>
-</div></div>
-
-<p>The '*' wildcard and ',' sub-part separator can be used in any part of the permission.</p>
-
-<h4><a name="Permissions-MissingParts"></a>Missing Parts</h4>
-
+<pre><code class="ini">printer:query,print:lp7200
+</code></pre>
+<p>The &rsquo;*&lsquo; wildcard and &rsquo;,&rsquo; sub-part separator can be used in any part of the permission.</p>
+<a name="Permissions-MissingParts"></a>
+<h4><a href="#missing-parts" name="missing-parts">Missing Parts</a></h4>
 <p>One final thing to note about permission assignments: missing parts imply that the user has access to all values corresponding to that part. In other words,</p>
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-printer:print
-</pre>
-</div></div>
-
+<pre><code class="ini">printer:print
+</code></pre>
 <p>is equivalent to</p>
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-printer:print:*
-</pre>
-</div></div>
-
+<pre><code class="ini">printer:print:*
+</code></pre>
 <p>and</p>
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-printer
-</pre>
-</div></div>
-
+<pre><code class="ini">printer
+</code></pre>
 <p>is equivalent to</p>
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-printer:*:*
-</pre>
-</div></div>
-
+<pre><code class="ini">printer:*:*
+</code></pre>
 <p>However, you can only leave off parts from the <em>end</em> of the string, so this:</p>
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-printer:lp7200
-</pre>
-</div></div>
-
-<p>is <b><em>not</em></b> equivalent to</p>
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-printer:*:lp7200
-</pre>
-</div></div>
-
-<h2><a name="Permissions-CheckingPermissions"></a>Checking Permissions</h2>
-
-<p>While permission assignments use the wildcard construct quite a bit ("printer:print:*" = print to any printer) for convenience and scalability, permission <b>checks</b> at runtime should <em>always</em> be based on the most specific permission string possible.</p>
-
-<p>For example, if the user had a UI and they wanted to print a document to the <tt>lp7200</tt> printer, you <b>should</b> check if the user is permitted to do so by executing this code:<br clear="none">
-<font color=""></font></p>
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-<span class="code-keyword">if</span> ( SecurityUtils.getSubject().isPermitted(<span class="code-quote">"printer:print:lp7200"</span>) ) {
-    <span class="code-comment">//print the document to the lp7200 printer
-</span>}
-</pre>
-</div></div>
-
-<p>That check is very specific and explicitly reflects what the user is attempting to do at that moment in time.  </p>
-
-
+<pre><code class="ini">printer:lp7200
+</code></pre>
+<p>is <strong><em>not</em></strong> equivalent to</p>
+<pre><code class="ini">printer:*:lp7200
+</code></pre>
+<a name="Permissions-CheckingPermissions"></a>
+<h2><a href="#checking-permissions" name="checking-permissions">Checking Permissions</a></h2>
+<p>While permission assignments use the wildcard construct quite a bit (&ldquo;printer:print:*&rdquo; = print to any printer) for convenience and scalability, permission <strong>checks</strong> at runtime should <em>always</em> be based on the most specific permission string possible.</p>
+<p>For example, if the user had a UI and they wanted to print a document to the <code>lp7200</code> printer, you <strong>should</strong> check if the user is permitted to do so by executing this code:</p>
+<pre><code class="java">if ( SecurityUtils.getSubject().isPermitted(&quot;printer:print:lp7200&quot;) ) {
+    //print the document to the lp7200 printer }
+}
+</code></pre>
+<p>That check is very specific and explicitly reflects what the user is attempting to do at that moment in time.</p>
 <p>The following however is much less ideal for a runtime check:</p>
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-<span class="code-keyword">if</span> ( SecurityUtils.getSubject().isPermitted(<span class="code-quote">"printer:print"</span>) ) {
-    <span class="code-comment">//print the document
-</span>}
-</pre>
-</div></div>
-
-<p>Why?  Because the second example says "You must be able to print to <b>any</b> printer for the following code block to execute".  But remember that "printer:print" is equivalent to "printer:print:*"!  </p>
-
-<p>Therefore, this is an incorrect check.  What if the current user does not have the ability to print to any printer, but they <b>do</b> have the ability to print to say, the <tt>lp7200</tt> and <tt>epsoncolor</tt> printers.  Then the 2nd example above would never allow them to print to the <tt>lp7200</tt> printer even though they have been granted that ability!</p>
-
-<p>So the rule of thumb is to use the most specific permission string possible when performing permission checks.  Of course, the 2nd block above might be a valid check somewhere else in the application if you really did only want to execute the code block if the user was allowed to print to any printer (suspect, but possible).  Your application will determine what checks make sense, but in general, the more specific, the better.</p>
-
-<h2><a name="Permissions-Implication%2CnotEquality"></a>Implication, not Equality</h2>
-
-<p>Why is it that runtime permission checks should be as specific as possible, but permission assignments can be a little more generic?  It is because the permission checks are evaluated by <em>implication</em> logic - not equality checks.</p>
-
-<p>That is, if a user is assigned the <tt>user:*</tt> permission, this <em>implies</em> that the user can perform the <tt>user:view</tt> action.  The string "user:*" is clearly not equal to "user:view", but the former implies the latter.  "user:*" describes a superset of functionality of that defined by "user:view".</p>
-
-<p>To support implication rules, all permissions are translated in to object instances that implement the <tt>org.apache.shiro.authz.Permission</tt> interface.  This is so that implication logic can be executed at runtime and that implication logic is often more complex than a simple string equality check.  All of the wildcard behavior described in this document is actually made possible by the <tt>org.apache.shiro.authz.permission.WildcardPermission</tt> class implementation. Here are some more wildcard permission strings that show access by implication:</p>
-
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-user:*
-</pre>
-</div></div>
+<pre><code class="java">if ( SecurityUtils.getSubject().isPermitted(&quot;printer:print&quot;) ) {
+    //print the document }
+}
+</code></pre>
+<p>Why? Because the second example says &ldquo;You must be able to print to <strong>any</strong> printer for the following code block to execute&rdquo;. But remember that &ldquo;printer:print&rdquo; is equivalent to &ldquo;printer:print:*&rdquo;!</p>
+<p>Therefore, this is an incorrect check. What if the current user does not have the ability to print to any printer, but they <strong>do</strong> have the ability to print to say, the <code>lp7200</code> and <code>epsoncolor</code> printers. Then the 2nd example above would never allow them to print to the <code>lp7200</code> printer even though they have been granted that ability!</p>
+<p>So the rule of thumb is to use the most specific permission string possible when performing permission checks. Of course, the 2nd block above might be a valid check somewhere else in the application if you really did only want to execute the code block if the user was allowed to print to any printer (suspect, but possible). Your application will determine what checks make sense, but in general, the more specific, the better.</p>
+<a name="Permissions-Implication%2CnotEquality"></a>
+<h2><a href="#implication-not-equality" name="implication-not-equality">Implication, not Equality</a></h2>
+<p>Why is it that runtime permission checks should be as specific as possible, but permission assignments can be a little more generic? It is because the permission checks are evaluated by <em>implication</em> logic - not equality checks.</p>
+<p>That is, if a user is assigned the <code>user:*</code> permission, this <em>implies</em> that the user can perform the <code>user:view</code> action. The string &ldquo;user:*&rdquo; is clearly not equal to &ldquo;user:view&rdquo;, but the former implies the latter. &ldquo;user:*&rdquo; describes a superset of functionality of that defined by &ldquo;user:view&rdquo;.</p>
+<p>To support implication rules, all permissions are translated in to object instances that implement the <code>org.apache.shiro.authz.Permission</code> interface. This is so that implication logic can be executed at runtime and that implication logic is often more complex than a simple string equality check. All of the wildcard behavior described in this document is actually made possible by the <code>org.apache.shiro.authz.permission.WildcardPermission</code> class implementation. Here are some more wildcard permission strings that show access by implication:</p>
+<pre><code class="ini">user:*
+</code></pre>
 <p><em>implies</em> the ability to also delete a user:</p>
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-user:delete
-</pre>
-</div></div>
-
+<pre><code class="ini">user:delete
+</code></pre>
 <p>Similarly,</p>
-
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-user:*:12345
-</pre>
-</div></div>
+<pre><code class="ini">user:*:12345
+</code></pre>
 <p><em>implies</em> the ability to also update user account with ID 12345:</p>
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-user:update:12345
-</pre>
-</div></div>
-
+<pre><code class="ini">user:update:12345
+</code></pre>
 <p>and</p>
-
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-printer
-</pre>
-</div></div>
+<pre><code class="ini">printer
+</code></pre>
 <p><em>implies</em> the ability to print to any printer</p>
-<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
-<pre class="code-java">
-printer:print
-</pre>
-</div></div>
-
-<h2><a name="Permissions-PerformanceConsiderations"></a>Performance Considerations</h2>
-
-<p>Permission checks are more complex than a simple equals comparison, so runtime implication logic must execute for each assigned Permission.  When using permission strings like the ones shown above, you're implicitly using Shiro's default <tt>WildcardPermission</tt> which executes the necessary implication logic.</p>
-
-<p>Shiro's default behavior for Realm implementations is that, for every permission check (for example, a call to <tt>subject.isPermitted</tt> ), <em>all</em> of the permissions assigned to that user (in their Groups, Roles, or directly assigned to them) need to be checked individually for implication.  Shiro 'short circuits' this process by returning immediately after the first successful check occurs to increase performance, but it is not a silver bullet.</p>
-
-<p>This is usually extremely fast when users, roles and permissions are cached in memory when using a proper <a href="cachemanager.html" title="CacheManager">CacheManager</a>, which Shiro does support for Realm implementations.  Just know that with this default behavior, as the number of permissions assigned to a user or their roles or groups increase, the time to perform the check will necessarily increase.</p>
-
-<p>If a Realm implementor has a more efficient way of checking permissions and performing this implication logic, especially if based on the applicaton's data model, they should implement that as part of their Realm isPermitted* method implementations.  The default Realm/WildcardPermission support exists to cover 80-90% of most use cases, but it might not be the best solution for applications that have massive amounts of permissions to store and/or check at runtime.</p>
-
-<h2><a name="Permissions-Lendahandwithdocumentation"></a>Lend a hand with documentation </h2>
-
-<p>While we hope this documentation helps you with the work you're doing with Apache Shiro, the community is improving and expanding the documentation all the time.  If you'd like to help the Shiro project, please consider corrected, expanding, or adding documentation where you see a need. Every little bit of help you provide expands the community and in turn improves Shiro. </p>
-
-<p>The easiest way to contribute your documentation is to send it to the <a class="external-link" href="http://shiro-user.582556.n2.nabble.com/" rel="nofollow">User Forum</a> or the <a href="mailing-lists.html" title="Mailing Lists">User Mailing List</a>.</p>
-
+<pre><code class="ini">printer:print
+</code></pre>
+<a name="Permissions-PerformanceConsiderations"></a>
+<h2><a href="#performance-considerations" name="performance-considerations">Performance Considerations</a></h2>
+<p>Permission checks are more complex than a simple equals comparison, so runtime implication logic must execute for each assigned Permission. When using permission strings like the ones shown above, you&rsquo;re implicitly using Shiro&rsquo;s default <code>WildcardPermission</code> which executes the necessary implication logic.</p>
+<p>Shiro&rsquo;s default behavior for Realm implementations is that, for every permission check (for example, a call to <code>subject.isPermitted</code>), <em>all</em> of the permissions assigned to that user (in their Groups, Roles, or directly assigned to them) need to be checked individually for implication. Shiro &lsquo;short circuits&rsquo; this process by returning immediately after the first successful check occurs to increase performance, but it is not a silver bullet.</p>
+<p>This is usually extremely fast when users, roles and permissions are cached in memory when using a proper <a href="cachemanager.html" title="CacheManager">CacheManager</a>, which Shiro does support for Realm implementations. Just know that with this default behavior, as the number of permissions assigned to a user or their roles or groups increase, the time to perform the check will necessarily increase.</p>
+<p>If a Realm implementor has a more efficient way of checking permissions and performing this implication logic, especially if based on the applicaton&rsquo;s data model, they should implement that as part of their Realm isPermitted* method implementations. The default Realm/WildcardPermission support exists to cover 80-90% of most use cases, but it might not be the best solution for applications that have massive amounts of permissions to store and/or check at runtime.</p>
+<a name="Permissions-Lendahandwithdocumentation"></a>
+<h2><a href="#lend-a-hand-with-documentation" name="lend-a-hand-with-documentation">Lend a hand with documentation</a></h2>
+<p>While we hope this documentation helps you with the work you&rsquo;re doing with Apache Shiro, the community is improving and expanding the documentation all the time. If you&rsquo;d like to help the Shiro project, please consider corrected, expanding, or adding documentation where you see a need. Every little bit of help you provide expands the community and in turn improves Shiro.</p>
+<p>The easiest way to contribute your documentation is to send it to the <a href="http://shiro-user.582556.n2.nabble.com/">User Forum</a> or the <a href="mailing-lists.html" title="Mailing Lists">User Mailing List</a>.</p>
 
         </div>
 

Modified: shiro/site/publish/powered-by-shiro.html
URL: http://svn.apache.org/viewvc/shiro/site/publish/powered-by-shiro.html?rev=1766414&r1=1766413&r2=1766414&view=diff
==============================================================================
--- shiro/site/publish/powered-by-shiro.html (original)
+++ shiro/site/publish/powered-by-shiro.html Mon Oct 24 14:33:52 2016
@@ -78,33 +78,34 @@
 
         <div id="content">
 
-            <h1><a name="PoweredbyShiro-OrganizationsusingApacheShiro"></a>Organizations using Apache Shiro</h1>
-
-<p>Please consider adding yourself to the Apache Shiro PoweredBy page.  By letting others know that you are using Shiro, you help expand the community and in turn improve Shiro.  Win/Win!</p>
-
-<h3><a name="PoweredbyShiro-Stormpath"></a><a class="external-link" href="https://stormpath.com/" rel="nofollow">Stormpath</a></h3>
-<p>Stormpath builds software products that make application security easy for developers and their organization.  Les Hazlewood, the Apache Shiro PMC Chair, is Stormpath's founder and CTO.</p>
-<ul><li>Stormpath uses Shiro as the core security subsystem for their products.</li><li>Shiro is used to support Stormpath's Single Sign-On (SSO) architecture.</li><li>Shiro's pluggable Realm architecture is used by Stormpath's runtime plugin system to allow changing an application's Realms at runtime, without requiring a server restart.</li></ul>
-
-<h3><a name="PoweredbyShiro-LargeFinancialInformationProvider"></a>Large Financial Information Provider</h3>
+            <a name="PoweredbyShiro-OrganizationsusingApacheShiro"></a>
+<h1><a href="#organizations-using-apache-shiro" name="organizations-using-apache-shiro">Organizations using Apache Shiro</a></h1>
+<p>Please consider adding yourself to the Apache Shiro PoweredBy page. By letting others know that you are using Shiro, you help expand the community and in turn improve Shiro. Win/Win!</p>
+<a name="PoweredbyShiro-Stormpath"></a>
+<h3><a href="https://stormpath.com/">Stormpath</a></h3>
+<p>Stormpath builds software products that make application security easy for developers and their organization. Les Hazlewood, the Apache Shiro PMC Chair, is Stormpath&rsquo;s founder and CTO.</p>
+<ul>
+  <li>Stormpath uses Shiro as the core security subsystem for their products.</li>
+  <li>Shiro is used to support Stormpath&rsquo;s Single Sign-On (SSO) architecture.</li>
+  <li>Shiro&rsquo;s pluggable Realm architecture is used by Stormpath&rsquo;s runtime plugin system to allow changing an application&rsquo;s Realms at runtime, without requiring a server restart.</li>
+</ul>
+<a name="PoweredbyShiro-LargeFinancialInformationProvider"></a>
+<h3><a href="#large-financial-information-provider" name="large-financial-information-provider">Large Financial Information Provider</a></h3>
 <p>Using Shiro in a large scale external web application for authentication, authorization, and custom Session clustering in an enterprise clustered cache</p>
-
-<h3><a name="PoweredbyShiro-MuleSoft"></a><a class="external-link" href="http://mulesoft.com" rel="nofollow">MuleSoft</a></h3>
-<p>The company behind <a class="external-link" href="http://mulesoft.org" rel="nofollow">Mule</a>, MuleSoft is behind the leading open source middleware, making integration and managing applications easier for everyone.</p>
-
-<p>Mule uses Shiro to provide authentication and authorization to hosted services and resources. This allows users to secure HTTP/REST services, Web Services, message queues, data and file access with the simplicity of  Shiro.</p>
-
-<h3><a name="PoweredbyShiro-Sonatype"></a><a class="external-link" href="http://www.sonatype.com" rel="nofollow">Sonatype</a></h3>
+<a name="PoweredbyShiro-MuleSoft"></a>
+<h3><a href="http://mulesoft.com">MuleSoft</a></h3>
+<p>The company behind <a href="http://mulesoft.org">Mule</a>, MuleSoft is behind the leading open source middleware, making integration and managing applications easier for everyone.</p>
+<p>Mule uses Shiro to provide authentication and authorization to hosted services and resources. This allows users to secure HTTP/REST services, Web Services, message queues, data and file access with the simplicity of Shiro.</p>
+<a name="PoweredbyShiro-Sonatype"></a>
+<h3><a href="http://www.sonatype.com">Sonatype</a></h3>
 <p>The company behind <a class="external-link" href="http://maven.apache.org">Maven</a>, Sonatype streamlines infrastructure and development workflows for Maven-centric development environments.</p>
-<ul><li>Sonatype uses Shiro to secure <a class="external-link" href="http://www.sonatype.com/nexus-professional.html" rel="nofollow">Nexus</a>, the leading open-source and professional Maven repository manager.</li></ul>
-
-
-
+<ul>
+  <li>Sonatype uses Shiro to secure <a href="http://www.sonatype.com/nexus-professional.html">Nexus</a>, the leading open-source and professional Maven repository manager.</li>
+</ul>
 <h2><a name="PoweredbyShiro-Template"></a>Template</h2>
 <p><a class="external-link" href="http://www.apache.org">Your Company Name</a> - Your company description</p>
 <ul><li>Any details you can share</li><li>...</li></ul>
 
-
         </div>
 
     </div><!--END WRAPPER-->

Modified: shiro/site/publish/privacy-policy.html
URL: http://svn.apache.org/viewvc/shiro/site/publish/privacy-policy.html?rev=1766414&r1=1766413&r2=1766414&view=diff
==============================================================================
--- shiro/site/publish/privacy-policy.html (original)
+++ shiro/site/publish/privacy-policy.html Mon Oct 24 14:33:52 2016
@@ -78,16 +78,18 @@
 
         <div id="content">
 
-            <h1><a name="PrivacyPolicy-ApacheShiroPrivacyPolicy"></a>Apache Shiro Privacy Policy</h1>
-
+            <a name="PrivacyPolicy-ApacheShiroPrivacyPolicy"></a>
+<h1><a href="#apache-shiro-privacy-policy" name="apache-shiro-privacy-policy">Apache Shiro Privacy Policy</a></h1>
 <p>Information about your use of this website is collected using server access logs and a tracking cookie. The collected information consists of the following:</p>
-<ol><li>The IP address from which you access the website;</li><li>The type of browser and operating system you use to access our site;</li><li>The date and time you access our site;</li><li>The pages you visit; and</li><li>The addresses of pages from where you followed a link to our site.</li></ol>
-
-
+<ul>
+  <li>The IP address from which you access the website;</li>
+  <li>The type of browser and operating system you use to access our site;</li>
+  <li>The date and time you access our site;</li>
+  <li>The pages you visit; and</li>
+  <li>The addresses of pages from where you followed a link to our site.</li>
+</ul>
 <p>Part of this information is gathered using a tracking cookie set by the Google Analytics service and handled by Google as described in their privacy policy. See your browser documentation for instructions on how to disable the cookie if you prefer not to share this data with Google.</p>
-
 <p>We use the gathered information to help us make our site more useful to visitors and to better understand how and when our site is used. We do not track or collect personally identifiable information or associate gathered data with any personally identifying information from other sources.</p>
-
 <p>By using this website, you consent to the collection of this data in the manner and for the purpose described above.</p>
 
         </div>