This is an automated email from the ASF dual-hosted git repository.
github-bot pushed a commit to branch gh-pages
in repository https://gitbox.apache.org/repos/asf/grails-spring-security.git
The following commit(s) were added to refs/heads/gh-pages by this push:
new c0e8fc317 Deploying to documentation branch - 02:07:06
c0e8fc317 is described below
commit c0e8fc3179199e00eee1e5267ef87f14f5b82792
Author: jamesfredley <[email protected]>
AuthorDate: Thu Feb 19 02:07:06 2026 +0000
Deploying to documentation branch - 02:07:06
---
snapshot/acl-plugin/guide/index.html | 2 +-
snapshot/cas-plugin/guide/index.html | 2 +-
snapshot/core-plugin/guide/index.html | 279 ++++++++++++++++++++++----------
snapshot/ldap-plugin/guide/index.html | 2 +-
snapshot/oauth2-plugin/guide/index.html | 2 +-
snapshot/rest-plugin/guide/index.html | 2 +-
snapshot/ui-plugin/guide/index.html | 2 +-
7 files changed, 204 insertions(+), 87 deletions(-)
diff --git a/snapshot/acl-plugin/guide/index.html
b/snapshot/acl-plugin/guide/index.html
index fc4f1251a..abf7bf073 100644
--- a/snapshot/acl-plugin/guide/index.html
+++ b/snapshot/acl-plugin/guide/index.html
@@ -2534,7 +2534,7 @@ the body content
<div id="footer">
<div id="footer-text">
Version 7.0.2-SNAPSHOT<br>
-Last updated 2026-02-15 20:09:26 UTC
+Last updated 2026-02-19 02:04:10 UTC
</div>
</div>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/run_prettify.min.js"></script>
diff --git a/snapshot/cas-plugin/guide/index.html
b/snapshot/cas-plugin/guide/index.html
index 849c10836..bba11f204 100644
--- a/snapshot/cas-plugin/guide/index.html
+++ b/snapshot/cas-plugin/guide/index.html
@@ -814,7 +814,7 @@ body.book #toc,body.book #preamble,body.book
h1.sect0,body.book .sect1>h2{page-b
<div id="footer">
<div id="footer-text">
Version 7.0.2-SNAPSHOT<br>
-Last updated 2026-02-15 20:09:26 UTC
+Last updated 2026-02-19 02:04:10 UTC
</div>
</div>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/run_prettify.min.js"></script>
diff --git a/snapshot/core-plugin/guide/index.html
b/snapshot/core-plugin/guide/index.html
index 8fb894d13..0a7066cd4 100644
--- a/snapshot/core-plugin/guide/index.html
+++ b/snapshot/core-plugin/guide/index.html
@@ -2108,19 +2108,87 @@ class Thing {
<div class="sect3">
<h4 id="controllerannotations-staticrules">4.4.2.
controllerAnnotations.staticRules</h4>
<div class="paragraph">
-<p>You can also define “static” mappings that cannot be expressed
in the controllers, such as '/**' or for JavaScript, CSS, or image URLs. Use
the <code>controllerAnnotations.staticRules</code> property, for example:</p>
+<p>You can also define “static” mappings that cannot be expressed
in the controllers, such as '/**' or for JavaScript, CSS, or image URLs. Use
the <code>controllerAnnotations.staticRules</code> property.</p>
+</div>
+<div class="paragraph">
+<p>In <code>application.groovy</code>:</p>
</div>
<div class="listingblock">
+<div class="title">Listing 12. Static rules in
<code>application.groovy</code></div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="groovy">grails.plugin.springsecurity.controllerAnnotations.staticRules
= [
- ...
[pattern: '/js/admin/**', access: ['ROLE_ADMIN']],
[pattern: '/someplugin/**', access: ['ROLE_ADMIN']]
]</code></pre>
</div>
</div>
<div class="paragraph">
-<p>This example maps all URLs associated with
<code>SomePluginController</code>, which has URLs of the form
<code>/somePlugin/…​</code>, to <code>ROLE_ADMIN</code>;
annotations are not an option here because you would not edit plugin code for a
change like this.</p>
+<p>Or equivalently in <code>application.yml</code>:</p>
+</div>
+<div class="listingblock">
+<div class="title">Listing 13. Static rules in <code>application.yml</code>
(flow mapping)</div>
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="yaml">grails:
+ plugin:
+ springsecurity:
+ controllerAnnotations:
+ staticRules:
+ - { pattern: '/js/admin/**', access: ['ROLE_ADMIN'] }
+ - { pattern: '/someplugin/**', access: ['ROLE_ADMIN']
}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Block mapping syntax also works:</p>
+</div>
+<div class="listingblock">
+<div class="title">Listing 14. Static rules in <code>application.yml</code>
(block mapping)</div>
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="yaml">grails:
+ plugin:
+ springsecurity:
+ controllerAnnotations:
+ staticRules:
+ - pattern: '/js/admin/**'
+ access:
+ - ROLE_ADMIN
+ - pattern: '/someplugin/**'
+ access:
+ - ROLE_ADMIN</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This example maps all URLs associated with
<code>SomePluginController</code>, which has URLs of the form
<code>/someplugin/…​</code>, to <code>ROLE_ADMIN</code>;
annotations are not an option here because you would not edit plugin code for a
change like this.</p>
+</div>
+<div class="admonitionblock important">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-important" title="Important"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>The <code>staticRules</code> value must be a <strong>List</strong> of Maps.
A common YAML mistake is omitting the <code>-</code> list indicator, which
produces a single Map instead:</p>
+</div>
+<div class="listingblock">
+<div class="title">Listing 15. Incorrect - single Map instead of List of
Maps</div>
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="yaml"># WRONG - this is a
Map, not a List of Maps
+grails:
+ plugin:
+ springsecurity:
+ controllerAnnotations:
+ staticRules:
+ pattern: '/**'
+ access:
+ - permitAll</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This will fail with: “Static rules defined as a Map are not
supported; must be specified as a List of Maps”. Each rule must be
prefixed with <code>-</code> to create a list entry.</p>
+</div>
+</td>
+</tr>
+</table>
</div>
<div class="admonitionblock note">
<table>
@@ -2141,19 +2209,31 @@ class Thing {
<div class="sect2">
<h3 id="configGroovyMap">4.5. Static Map</h3>
<div class="paragraph">
-<p>To use a static map in <code>application.groovy</code> to secure URLs,
first specify <code>securityConfigType="InterceptUrlMap"</code>:</p>
+<p>To use a static map to secure URLs, first specify
<code>securityConfigType="InterceptUrlMap"</code>:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 12. Specifying <code>securityConfigType</code> as
“InterceptUrlMap”</div>
+<div class="title">Listing 16. Specifying <code>securityConfigType</code> as
“InterceptUrlMap” in <code>application.groovy</code></div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="groovy">grails.plugin.springsecurity.securityConfigType =
"InterceptUrlMap"</code></pre>
</div>
</div>
<div class="paragraph">
-<p>Define a Map in <code>application.groovy</code>:</p>
+<p>Or in <code>application.yml</code>:</p>
+</div>
+<div class="listingblock">
+<div class="title">Listing 17. Specifying <code>securityConfigType</code> as
“InterceptUrlMap” in <code>application.yml</code></div>
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="yaml">grails:
+ plugin:
+ springsecurity:
+ securityConfigType: InterceptUrlMap</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Then define the URL mappings. In <code>application.groovy</code>:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 13. Example
<code>grails.plugin.springsecurity.interceptUrlMap</code></div>
+<div class="title">Listing 18. Example <code>interceptUrlMap</code> in
<code>application.groovy</code></div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="groovy">grails.plugin.springsecurity.interceptUrlMap = [
[pattern: '/', access: ['permitAll']],
@@ -2174,10 +2254,36 @@ class Thing {
</div>
</div>
<div class="paragraph">
-<p>and add any custom mappings as needed, e.g.</p>
+<p>Or equivalently in <code>application.yml</code>:</p>
+</div>
+<div class="listingblock">
+<div class="title">Listing 19. Example <code>interceptUrlMap</code> in
<code>application.yml</code></div>
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="yaml">grails:
+ plugin:
+ springsecurity:
+ interceptUrlMap:
+ - { pattern: '/', access: ['permitAll'] }
+ - { pattern: '/error', access: ['permitAll'] }
+ - { pattern: '/index', access: ['permitAll'] }
+ - { pattern: '/index.gsp', access: ['permitAll'] }
+ - { pattern: '/shutdown', access: ['permitAll'] }
+ - { pattern: '/assets/**', access: ['permitAll'] }
+ - { pattern: '/**/js/**', access: ['permitAll'] }
+ - { pattern: '/**/css/**', access: ['permitAll'] }
+ - { pattern: '/**/images/**', access: ['permitAll'] }
+ - { pattern: '/**/favicon.ico', access: ['permitAll'] }
+ - { pattern: '/login', access: ['permitAll'] }
+ - { pattern: '/login/**', access: ['permitAll'] }
+ - { pattern: '/logout', access: ['permitAll'] }
+ - { pattern: '/logout/**', access: ['permitAll']
}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Add any custom mappings as needed, e.g.</p>
</div>
<div class="listingblock">
-<div class="title">Listing 14. Custom <code>interceptUrlMap</code>
mappings</div>
+<div class="title">Listing 20. Custom <code>interceptUrlMap</code> mappings in
<code>application.groovy</code></div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="groovy">grails.plugin.springsecurity.interceptUrlMap = [
...
@@ -2186,11 +2292,22 @@ class Thing {
]</code></pre>
</div>
</div>
+<div class="listingblock">
+<div class="title">Listing 21. Custom <code>interceptUrlMap</code> mappings in
<code>application.yml</code></div>
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="yaml">grails:
+ plugin:
+ springsecurity:
+ interceptUrlMap:
+ - { pattern: '/secure/**', access: ['ROLE_ADMIN'] }
+ - { pattern: '/finance/**', access: ['ROLE_FINANCE',
'IS_AUTHENTICATED_FULLY'] }</code></pre>
+</div>
+</div>
<div class="paragraph">
<p>When using this approach, make sure that you order the rules correctly. The
first applicable rule is used, so for example if you have a controller that has
one set of rules but an action that has stricter access rules, e.g.</p>
</div>
<div class="listingblock">
-<div class="title">Listing 15. Incorrect <code>interceptUrlMap</code>
order</div>
+<div class="title">Listing 22. Incorrect <code>interceptUrlMap</code>
order</div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">[pattern:
'/secure/**', access: ['ROLE_ADMIN', 'ROLE_SUPERUSER']],
[pattern: '/secure/reallysecure/**', access: ['ROLE_SUPERUSER']]</code></pre>
@@ -2200,7 +2317,7 @@ class Thing {
<p>then this would fail - it wouldn’t restrict access to
<code>/secure/reallysecure/list</code> to a user with
<code>ROLE_SUPERUSER</code> since the first URL pattern matches, so the second
would be ignored. The correct mapping would be</p>
</div>
<div class="listingblock">
-<div class="title">Listing 16. Correct <code>interceptUrlMap</code> order</div>
+<div class="title">Listing 23. Correct <code>interceptUrlMap</code> order</div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">[pattern:
'/secure/reallysecure/**', access: ['ROLE_SUPERUSER']],
[pattern: '/secure/**', access: ['ROLE_ADMIN',
'ROLE_SUPERUSER']]</code></pre>
@@ -2234,7 +2351,7 @@ and <code>IS_AUTHENTICATED_ANONYMOUSLY</code></p>
<p>To use database-backed url security mappings, use the following
configuration:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 17. Configuring database-backed url security
rules</div>
+<div class="title">Listing 24. Configuring database-backed url security
rules</div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="groovy">grails.plugin.springsecurity.securityConfigType =
'Requestmap'
grails.plugin.springsecurity.requestMap.className =
'com.mycompany.myapp.SecurityMapping'</code></pre>
@@ -2247,7 +2364,7 @@ grails.plugin.springsecurity.requestMap.className =
'com.mycompany.myapp.Securit
<p>You create request map entries as you create entries in any Grails domain
class:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 18. Creating request map entries</div>
+<div class="title">Listing 25. Creating request map entries</div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">for (String url in
[
'/', '/error', '/index', '/index.gsp', '/**/favicon.ico', '/shutdown',
@@ -2279,7 +2396,7 @@
springSecurityService.clearCachedRequestmaps()</code></pre>
<p>Request map entries are cached for performance, but caching affects runtime
configurability. If you create, edit, or delete an instance, the cache must be
flushed and repopulated to be consistent with the database. You can call
<code>springSecurityService.clearCachedRequestmaps()</code> to do this. For
example, if you create a <code>RequestSecurityRuleController</code> the
<code>save</code> action should look like this (and the update and delete
actions should similarly call <code>cle [...]
</div>
<div class="listingblock">
-<div class="title">Listing 19. Calling
<code>clearCachedRequestmaps()</code></div>
+<div class="title">Listing 26. Calling
<code>clearCachedRequestmaps()</code></div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">class
SecurityMappingController {
@@ -2312,7 +2429,7 @@
springSecurityService.clearCachedRequestmaps()</code></pre>
<p>You can use expressions with any of the previously described approaches to
securing application URLs. For example, consider this annotated controller:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 20. An annotated controller</div>
+<div class="title">Listing 27. An annotated controller</div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">package
com.yourcompany.yourapp
@@ -2339,7 +2456,7 @@ class SecureController {
<p>The corresponding <code>Requestmap</code> URLs would be</p>
</div>
<div class="listingblock">
-<div class="title">Listing 21. Creating Requestmap instances</div>
+<div class="title">Listing 28. Creating Requestmap instances</div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">new
Requestmap(url: "/secure/someAction",
configAttribute: "hasRole('ROLE_ADMIN')").save()
@@ -2352,7 +2469,7 @@ new Requestmap(url: "/secure/someOtherAction",
<p>and the corresponding static mappings would be</p>
</div>
<div class="listingblock">
-<div class="title">Listing 22. Adding mappings in
<code>grails.plugin.springsecurity.controllerAnnotations.staticRules</code></div>
+<div class="title">Listing 29. Adding mappings in
<code>grails.plugin.springsecurity.controllerAnnotations.staticRules</code></div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="groovy">grails.plugin.springsecurity.controllerAnnotations.staticRules
= [
[pattern: '/secure/someAction', access: ["hasRole('ROLE_ADMIN')"]],
@@ -2490,7 +2607,7 @@ new Requestmap(url: "/secure/someOtherAction",
<p>Example:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 23. Example using
<code><sec:ifLoggedIn></code></div>
+<div class="title">Listing 30. Example using
<code><sec:ifLoggedIn></code></div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="html"><sec:ifLoggedIn>
Welcome Back!
@@ -2507,7 +2624,7 @@ Welcome Back!
<p>Example:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 24. Example using
<code><sec:ifNotLoggedIn></code></div>
+<div class="title">Listing 31. Example using
<code><sec:ifNotLoggedIn></code></div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="html"><sec:ifNotLoggedIn>
<g:link controller='login' action='auth'>Login</g:link>
@@ -2524,7 +2641,7 @@ Welcome Back!
<p>Example:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 25. Example using
<code><sec:ifAllGranted></code></div>
+<div class="title">Listing 32. Example using
<code><sec:ifAllGranted></code></div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="html"><sec:ifAllGranted
roles='ROLE_ADMIN,ROLE_SUPERVISOR'>
...
@@ -2543,7 +2660,7 @@ secure stuff here
<p>Example:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 26. Example using
<code><sec:ifAnyGranted></code></div>
+<div class="title">Listing 33. Example using
<code><sec:ifAnyGranted></code></div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="html"><sec:ifAnyGranted
roles='ROLE_ADMIN,ROLE_SUPERVISOR'>
...
@@ -2562,7 +2679,7 @@ secure stuff here
<p>Example:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 27. Example using
<code><sec:ifNotGranted></code></div>
+<div class="title">Listing 34. Example using
<code><sec:ifNotGranted></code></div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="html"><sec:ifNotGranted
roles='ROLE_USER'>
...
@@ -2578,7 +2695,7 @@ non-user stuff here
<p>Displays the value of the specified UserDetails property if logged in. For
example, to show the username property:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 28. Example using
<code><sec:loggedInUserInfo></code></div>
+<div class="title">Listing 35. Example using
<code><sec:loggedInUserInfo></code></div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="html"><sec:loggedInUserInfo field='username'/></code></pre>
</div>
@@ -2587,7 +2704,7 @@ non-user stuff here
<p>If you have customized the UserDetails (e.g. with a custom
UserDetailsService) to add a <code>fullName</code> property, you access it as
follows:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 29. Example using
<code><sec:loggedInUserInfo></code> for a nonstandard property</div>
+<div class="title">Listing 36. Example using
<code><sec:loggedInUserInfo></code> for a nonstandard property</div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="html">Welcome Back
<sec:loggedInUserInfo field='fullName'/></code></pre>
</div>
@@ -2599,7 +2716,7 @@ non-user stuff here
<p>Displays the value of the UserDetails <code>username</code> property if
logged in.</p>
</div>
<div class="listingblock">
-<div class="title">Listing 30. Example using
<code><sec:username></code></div>
+<div class="title">Listing 37. Example using
<code><sec:username></code></div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="html"><sec:ifLoggedIn>
Welcome Back <sec:username/>!
@@ -2616,7 +2733,7 @@ Welcome Back <sec:username/>!
<p>Displays the inner body content only if the current user switched from
another user. (See also <a href="#switchUser">Switch User</a>.)</p>
</div>
<div class="listingblock">
-<div class="title">Listing 31. Example using
<code><sec:ifSwitched></code> and
<code><sec:ifNotSwitched></code></div>
+<div class="title">Listing 38. Example using
<code><sec:ifSwitched></code> and
<code><sec:ifNotSwitched></code></div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="html"><sec:ifLoggedIn>
Logged in as <sec:username/>
@@ -2657,7 +2774,7 @@ Logged in as <sec:username/>
<p>Renders the original user’s username if the current user switched
from another user.</p>
</div>
<div class="listingblock">
-<div class="title">Listing 32. Example using
<code><sec:switchedUserOriginalUsername></code></div>
+<div class="title">Listing 39. Example using
<code><sec:switchedUserOriginalUsername></code></div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="html"><sec:ifSwitched>
<form action='${request.contextPath}/logout/impersonate'
method='POST'>
@@ -2673,7 +2790,7 @@ Logged in as <sec:username/>
<p>Renders the body if the specified expression evaluates to <code>true</code>
or specified URL is allowed.</p>
</div>
<div class="listingblock">
-<div class="title">Listing 33. Example using <code><sec:access></code>
with an expression</div>
+<div class="title">Listing 40. Example using <code><sec:access></code>
with an expression</div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="html"><sec:access
expression="hasRole('ROLE_USER')">
@@ -2683,7 +2800,7 @@ You're a user
</div>
</div>
<div class="listingblock">
-<div class="title">Listing 34. Example using <code><sec:access></code>
with a URL</div>
+<div class="title">Listing 41. Example using <code><sec:access></code>
with a URL</div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="html"><sec:access
url='/admin/user'>
@@ -2696,7 +2813,7 @@ You're a user
<p>You can also guard access to links generated from controller and action
names or named URL mappings instead of hard-coding the values, for example</p>
</div>
<div class="listingblock">
-<div class="title">Listing 35. Example using <code><sec:access></code>
with a controller and action</div>
+<div class="title">Listing 42. Example using <code><sec:access></code>
with a controller and action</div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="html"><sec:access
controller='admin' action='user'>
@@ -2709,7 +2826,7 @@ You're a user
<p>or if you have a named URL mapping you can refer to that:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 36. Example using <code><sec:access></code>
with a URL mapping</div>
+<div class="title">Listing 43. Example using <code><sec:access></code>
with a URL mapping</div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="html"><sec:access
mapping='manageUsers'>
@@ -2722,7 +2839,7 @@ You're a user
<p>For even more control of the generated URL (still avoiding hard-coding) you
can use <code>createLink</code> to build the URL, for example</p>
</div>
<div class="listingblock">
-<div class="title">Listing 37. Example using <code><sec:access></code>
with <code><g:createLink></code></div>
+<div class="title">Listing 44. Example using <code><sec:access></code>
with <code><g:createLink></code></div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="html"><sec:access
url='${createLink(controller: 'admin', action: 'user', base: '/')}'>
@@ -2741,7 +2858,7 @@ You're a user
<p>Renders the body if the specified expression evaluates to
<code>false</code> or URL isn’t allowed.</p>
</div>
<div class="listingblock">
-<div class="title">Listing 38. Example using
<code><sec:noAccess></code></div>
+<div class="title">Listing 45. Example using
<code><sec:noAccess></code></div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="html"><sec:noAccess
expression="hasRole('ROLE_USER')">
@@ -2760,7 +2877,7 @@ You're not a user
<p>To define the expression to evaluate within the tag itself:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 39. Example using <code><sec:link></code>
with an expression</div>
+<div class="title">Listing 46. Example using <code><sec:link></code>
with an expression</div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="html"><sec:link
controller='myController' action='myAction'
expression="hasRole('ROLE_USER')">My link text</sec:link></code></pre>
</div>
@@ -2769,7 +2886,7 @@ You're not a user
<p>To use access controls defined, for example, in the interceptUrlMap:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 40. Example using <code><sec:link></code>
without an expression</div>
+<div class="title">Listing 47. Example using <code><sec:link></code>
without an expression</div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="html"><sec:link
controller='myController' action='myAction'>My link
text</sec:link></code></pre>
</div>
@@ -2778,7 +2895,7 @@ You're not a user
<p>By default, nothing will be rendered if the specified expression evaluates
to <code>false</code> or URL is not allowed. To render only the text that would
have been linked, set the <code>fallback</code> attribute:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 41. Example using <code><sec:link
fallback='true'></code> without an expression</div>
+<div class="title">Listing 48. Example using <code><sec:link
fallback='true'></code> without an expression</div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="html"><sec:link
controller='myController' action='myAction' fallback='true'>This text will
display but won't be linked if the user doesn't have
access</sec:link></code></pre>
</div>
@@ -2807,7 +2924,7 @@ You're not a user
<p>Example:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 42. Example using
<code>getCurrentUser()</code></div>
+<div class="title">Listing 49. Example using
<code>getCurrentUser()</code></div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">class
SomeController {
@@ -2833,7 +2950,7 @@ You're not a user
<p>Example:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 43. Example using
<code>loadCurrentUser()</code></div>
+<div class="title">Listing 50. Example using
<code>loadCurrentUser()</code></div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">class
SomeController {
@@ -2862,7 +2979,7 @@ You're not a user
<p>Example:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 44. Example using <code>isLoggedIn()</code></div>
+<div class="title">Listing 51. Example using <code>isLoggedIn()</code></div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">class
SomeController {
@@ -2892,7 +3009,7 @@ You're not a user
<p>Example:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 45. Example using
<code>getAuthentication()</code></div>
+<div class="title">Listing 52. Example using
<code>getAuthentication()</code></div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">class
SomeController {
@@ -2921,7 +3038,7 @@ You're not a user
<p>Example:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 46. Example using <code>getPrincipal()</code></div>
+<div class="title">Listing 53. Example using <code>getPrincipal()</code></div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">class
SomeController {
@@ -2961,7 +3078,7 @@ You're not a user
<p>Example:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 47. Example using
<code>encodePassword()</code></div>
+<div class="title">Listing 54. Example using
<code>encodePassword()</code></div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">class
PersonController {
@@ -3009,7 +3126,7 @@ You're not a user
<p>Example:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 48. Example using <code>updateRole()</code></div>
+<div class="title">Listing 55. Example using <code>updateRole()</code></div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">class
RoleController {
@@ -3037,7 +3154,7 @@ You're not a user
<p>Example:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 49. Example using <code>deleteRole()</code></div>
+<div class="title">Listing 56. Example using <code>deleteRole()</code></div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">class
RoleController {
@@ -3067,7 +3184,7 @@ You're not a user
<p>Example:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 50. Example using
<code>clearCachedRequestmaps()</code></div>
+<div class="title">Listing 57. Example using
<code>clearCachedRequestmaps()</code></div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">class
RequestmapController {
@@ -3096,7 +3213,7 @@ You're not a user
<p>Example:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 51. Example using
<code>reauthenticate()</code></div>
+<div class="title">Listing 58. Example using
<code>reauthenticate()</code></div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">class
UserController {
@@ -3194,7 +3311,7 @@ You're not a user
<p>Checks whether the request was triggered by an Ajax call. The standard way
is to determine whether <code>X-Requested-With</code> request header is set and
has the value <code>XMLHttpRequest</code>. In addition, you can configure the
name of the header with the
<code>grails.plugin.springsecurity.ajaxHeader</code> configuration attribute,
but this is not recommended because all major JavaScript toolkits use the
standard name. Further, you can register a closure in <code>application.groo
[...]
</div>
<div class="listingblock">
-<div class="title">Listing 52. Customizing Ajax detection with
<code>grails.plugin.springsecurity.ajaxCheckClosure</code></div>
+<div class="title">Listing 59. Customizing Ajax detection with
<code>grails.plugin.springsecurity.ajaxCheckClosure</code></div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="groovy">grails.plugin.springsecurity.ajaxCheckClosure = { request
->
// return true or false
@@ -3357,7 +3474,7 @@ class MySecurityEventListener
<p>Register the class in
<code>grails-app/conf/spring/resources.groovy</code>:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 53. Registration of the event listener bean in
<code>resources.groovy</code></div>
+<div class="title">Listing 60. Registration of the event listener bean in
<code>resources.groovy</code></div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">import
com.foo.bar.MySecurityEventListener
@@ -3376,7 +3493,7 @@ beans = {
<p>Implement the event handlers that you need, for example:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 54. Adding event handling closures in
<code>application.groovy</code></div>
+<div class="title">Listing 61. Adding event handling closures in
<code>application.groovy</code></div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="groovy">grails.plugin.springsecurity.useSecurityEventListener = true
@@ -3536,7 +3653,7 @@ grails.plugin.springsecurity.onAuthorizationEvent = { e,
appCtx ->
<p>To use <a
href="https://en.wikipedia.org/wiki/Basic_access_authentication">HTTP Basic
Authentication</a> in your application, set the <code>useBasicAuth</code>
attribute to <code>true</code>. Also change the <code>basic.realmName</code>
default value to one that suits your application, for example:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 55. Basic Authentication example settings</div>
+<div class="title">Listing 62. Basic Authentication example settings</div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="groovy">grails.plugin.springsecurity.useBasicAuth = true
grails.plugin.springsecurity.basic.realmName = "Ralph's Bait and
Tackle"</code></pre>
@@ -3581,7 +3698,7 @@ grails.plugin.springsecurity.basic.realmName = "Ralph's
Bait and Tackle"</code><
<p>If you don’t want all of your URLs guarded by Basic authentication,
you can partition the URL patterns and apply Basic authentication to some, but
regular form login to others. For example, if you have a web service that uses
Basic authentication for <code>/webservice/**</code> URLs, you would configure
that using the <code>chainMap</code> config attribute:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 56. Example filter chain mappings for Basic
authentication</div>
+<div class="title">Listing 63. Example filter chain mappings for Basic
authentication</div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="groovy">grails.plugin.springsecurity.filterChain.chainMap = [
[pattern: '/webservice/**', filters:
'JOINED_FILTERS,-exceptionTranslationFilter'],
@@ -4323,7 +4440,7 @@ $(function() {
<p>To customize this list, you define a <code>providerNames</code> attribute
with a list of bean names. The beans must be declared either by the plugin, or
yourself in <code>resources.groovy</code>. Suppose you have a custom
<code>MyAuthenticationProvider</code> in <code>resources.groovy</code>:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 57. Registering a custom authentication provider
bean in <code>resources.groovy</code></div>
+<div class="title">Listing 64. Registering a custom authentication provider
bean in <code>resources.groovy</code></div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">import
com.foo.MyAuthenticationProvider
@@ -4338,7 +4455,7 @@ beans = {
<p>You register the provider in
<code>grails-app/conf/application.groovy</code> as:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 58. Registering a custom authentication provider
name in <code>grails.plugin.springsecurity.providerNames</code></div>
+<div class="title">Listing 65. Registering a custom authentication provider
name in <code>grails.plugin.springsecurity.providerNames</code></div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="groovy">grails.plugin.springsecurity.providerNames = [
'myAuthenticationProvider',
@@ -4448,7 +4565,7 @@ class MyUserDetailsService implements
GrailsUserDetailsService {
<p>To use your implementation, register it in
<code>grails-app/conf/spring/resources.groovy</code> like this:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 59. Registering a custom
<code>UserDetailsService</code> in <code>resources.groovy</code></div>
+<div class="title">Listing 66. Registering a custom
<code>UserDetailsService</code> in <code>resources.groovy</code></div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">import
com.mycompany.myapp.MyUserDetailsService
@@ -4469,7 +4586,7 @@ beans = {
<p>If you store mutable data in your custom <code>UserDetails</code>
implementation (such as full name in the preceding example), be sure to rebuild
the <code>Authentication</code> if it changes.
<code>springSecurityService</code> has a <code>reauthenticate</code> method
that does this for you:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 60. Calling <code>reauthenticate()</code> after
making a change that affects the cached authentication</div>
+<div class="title">Listing 67. Calling <code>reauthenticate()</code> after
making a change that affects the cached authentication</div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">class MyController
{
@@ -4632,7 +4749,7 @@ If you rely on them to be higher, set them manually when
testing.
<p>An example override of the salt source bean using SystemWideSaltSource
would look like this:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 61. Configuring <code>SystemWideSaltSource</code>
as the <code>saltSource</code> bean in <code>application.groovy</code></div>
+<div class="title">Listing 68. Configuring <code>SystemWideSaltSource</code>
as the <code>saltSource</code> bean in <code>application.groovy</code></div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">import
org.springframework.security.authentication.dao.SystemWideSaltSource
@@ -4647,7 +4764,7 @@ beans = {
<p>To have full control over the process, you can implement the
<code>SaltSource</code> interface and replace the plugin’s implementation
with your own by defining a bean in
<code>grails-app/conf/spring/resources.groovy</code> with the name
<code>saltSource</code>:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 62. Configuring a custom implementation of the
<code>saltSource</code> bean in <code>application.groovy</code></div>
+<div class="title">Listing 69. Configuring a custom implementation of the
<code>saltSource</code> bean in <code>application.groovy</code></div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">import
com.foo.bar.MySaltSource
@@ -4665,7 +4782,7 @@ beans = {
<p>Regardless of the implementation, you need to be aware of what value to use
for a salt when creating or updating users, for example, in a <code>save</code>
or <code>update</code> action in a <code>UserController</code>. When hashing
the password, use the two-parameter version of
<code>springSecurityService.encodePassword()</code>:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 63. Explicitly hashing passwords</div>
+<div class="title">Listing 70. Explicitly hashing passwords</div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">class
UserController {
@@ -4789,7 +4906,7 @@ beans = {
<p>You can configure exception mappings in <code>application.groovy</code> to
associate a URL to any or all of these exceptions to determine where to
redirect after a failure, for example:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 64. Example
<code>grails.plugin.springsecurity.failureHandler.exceptionMappings</code>
configuration</div>
+<div class="title">Listing 71. Example
<code>grails.plugin.springsecurity.failureHandler.exceptionMappings</code>
configuration</div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">import
org.springframework.security.authentication.LockedException
import org.springframework.security.authentication.DisabledException
@@ -4857,7 +4974,7 @@
grails.plugin.springsecurity.failureHandler.exceptionMappings = [
<p>Here’s an example for a password expired workflow. You’d need a
simple action to display a password reset form (similar to the login form):</p>
</div>
<div class="listingblock">
-<div class="title">Listing 65. Adding a <code>passwordExpired()</code>
controller action</div>
+<div class="title">Listing 72. Adding a <code>passwordExpired()</code>
controller action</div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">def
passwordExpired() {
[username: session['SPRING_SECURITY_LAST_USERNAME']]
@@ -4868,7 +4985,7 @@
grails.plugin.springsecurity.failureHandler.exceptionMappings = [
<p>and the form would look something like this:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 66. Sample GSP code for a password reset page</div>
+<div class="title">Listing 73. Sample GSP code for a password reset page</div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="html"><div
id='login'>
<div class='inner'>
@@ -4908,7 +5025,7 @@
grails.plugin.springsecurity.failureHandler.exceptionMappings = [
<p>The GSP form would submit to an action like this one:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 67. Adding an <code>updatePassword()</code>
controller action</div>
+<div class="title">Listing 74. Adding an <code>updatePassword()</code>
controller action</div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">def
updatePassword(String password, String password_new, String password_new_2) {
String username = session['SPRING_SECURITY_LAST_USERNAME']
@@ -5379,7 +5496,7 @@ class RoleHierarchyEntry implements Serializable {
<p>To store the equivalent entries for the ROLE_SUPERADMIN /
ROLE_FINANCE_ADMIN / ROLE_ADMIN hierarchy, add code like this to a method in a
transactional service:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 68. Persisting <code>RoleHierarchyEntry</code>
instances</div>
+<div class="title">Listing 75. Persisting <code>RoleHierarchyEntry</code>
instances</div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">if
(!RoleHierarchyEntry.count()) {
new RoleHierarchyEntry(entry: 'ROLE_SUPERADMIN >
ROLE_FINANCE_ADMIN').save()
@@ -5419,7 +5536,7 @@ class RoleHierarchyEntry implements Serializable {
<p>To switch to another user, typically you create a form that submits to
<code>/login/impersonate</code>:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 69. An HTML form for switching to another user</div>
+<div class="title">Listing 76. An HTML form for switching to another user</div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="html"><sec:ifAllGranted
roles='ROLE_SWITCH_USER'>
@@ -5435,7 +5552,7 @@ class RoleHierarchyEntry implements Serializable {
<p>Here the form is guarded by a check that the logged-in user has
<code>ROLE_SWITCH_USER</code> and is not shown otherwise. You also need to
guard the user switch URL, and the approach depends on your mapping scheme. If
you use annotations, add a rule to the
<code>controllerAnnotations.staticRules</code> attribute:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 70. Guarding the switch user url with
<code>controllerAnnotations.staticRules</code></div>
+<div class="title">Listing 77. Guarding the switch user url with
<code>controllerAnnotations.staticRules</code></div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="groovy">grails.plugin.springsecurity.controllerAnnotations.staticRules
= [
...
@@ -5447,7 +5564,7 @@ class RoleHierarchyEntry implements Serializable {
<p>If you use <code>Requestmap</code>s, create a rule like this (for example,
in <code>BootStrap</code>):</p>
</div>
<div class="listingblock">
-<div class="title">Listing 71. Guarding the switch user url with a database
requestmap</div>
+<div class="title">Listing 78. Guarding the switch user url with a database
requestmap</div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">new
Requestmap(url: '/login/impersonate',
configAttribute:
'ROLE_SWITCH_USER,IS_AUTHENTICATED_FULLY').save(flush: true)</code></pre>
@@ -5457,7 +5574,7 @@ class RoleHierarchyEntry implements Serializable {
<p>If you use the static <code>application.groovy</code> map, add the rule
there:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 72. Guarding the switch user url with
<code>interceptUrlMap</code></div>
+<div class="title">Listing 79. Guarding the switch user url with
<code>interceptUrlMap</code></div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="groovy">grails.plugin.springsecurity.interceptUrlMap = [
...
@@ -5472,7 +5589,7 @@ class RoleHierarchyEntry implements Serializable {
<p>To resume as the original user, POST to
<code>/logout/impersonate</code>.</p>
</div>
<div class="listingblock">
-<div class="title">Listing 73. A link to switch back to the real user</div>
+<div class="title">Listing 80. A link to switch back to the real user</div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="html"><sec:ifSwitched>
<form action='${request.contextPath}/logout/impersonate'
method='POST'>
@@ -5559,7 +5676,7 @@ grails.plugin.springsecurity.switchUser.switchFailureUrl
= ...</code></pre>
<p>One approach to supporting the switch user feature is to add code to one or
more of your GSP templates. In this example the current username is displayed,
and if the user has switched from another (using the
<code>sec:ifSwitched</code> tag) then a “resume” button is
displayed. If not, and the user has the required role, a form is displayed to
allow input of the username to switch to:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 74. Example GSP code to conditionally display a
switch user form and resume form</div>
+<div class="title">Listing 81. Example GSP code to conditionally display a
switch user form and resume form</div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="html"><sec:ifLoggedIn>
Logged in as <sec:username/>
@@ -5607,7 +5724,7 @@ Logged in as <sec:username/>
<p>For example:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 75. Sample
<code>grails.plugin.springsecurity.filterChain.filterNames</code>
configuration</div>
+<div class="title">Listing 82. Sample
<code>grails.plugin.springsecurity.filterChain.filterNames</code>
configuration</div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="groovy">grails.plugin.springsecurity.filterChain.filterNames = [
'securityContextPersistenceFilter', 'logoutFilter',
@@ -5627,7 +5744,7 @@ Logged in as <sec:username/>
<p>Use the <code>filterChain.chainMap</code> attribute to define which filters
are applied to different URL patterns. You define a Map that specifies one or
more lists of filter bean names, each with a corresponding URL pattern.</p>
</div>
<div class="listingblock">
-<div class="title">Listing 76. Sample
<code>grails.plugin.springsecurity.filterChain.chainMap</code>
configuration</div>
+<div class="title">Listing 83. Sample
<code>grails.plugin.springsecurity.filterChain.chainMap</code>
configuration</div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="groovy">grails.plugin.springsecurity.filterChain.chainMap = [
[pattern: '/urlpattern1/**', filters: 'filter1,filter2,filter3,filter4'],
@@ -5660,7 +5777,7 @@ Logged in as <sec:username/>
<p>There’s also a filter negation syntax that can be very convenient.
Rather than specifying all of the filter names (and risking forgetting one or
putting them in the wrong order), you can use the <code>JOINED_FILTERS</code>
keyword and one or more filter names prefixed with a <code>-</code> . This
means to use all configured filters except for the excluded ones. For example,
if you had a web service that uses Basic Auth for <code>/webservice/**</code>
URLs, you would configure th [...]
</div>
<div class="listingblock">
-<div class="title">Listing 77. Using <code>JOINED_FILTERS</code> in a
<code>filterChain.chainMap</code> configuration</div>
+<div class="title">Listing 84. Using <code>JOINED_FILTERS</code> in a
<code>filterChain.chainMap</code> configuration</div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="groovy">grails.plugin.springsecurity.filterChain.chainMap = [
[pattern: '/webservice/**', filters:
'JOINED_FILTERS,-exceptionTranslationFilter'],
@@ -5675,7 +5792,7 @@ Logged in as <sec:username/>
<p>Additionally, you can use a <code>chainMap</code> configuration to declare
one or more URL patterns which should have no filters applied. Use the name
<code>'none'</code> for these patterns, e.g.</p>
</div>
<div class="listingblock">
-<div class="title">Listing 78. Using <code>none</code> in a
<code>filterChain.chainMap</code> configuration</div>
+<div class="title">Listing 85. Using <code>none</code> in a
<code>filterChain.chainMap</code> configuration</div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="groovy">grails.plugin.springsecurity.filterChain.chainMap = [
[pattern: '/someurlpattern/**', filters: 'none'],
@@ -5804,7 +5921,7 @@ class BootStrap {
<p>Build a <code>List</code> of single-entry <code>Map</code>s under the
<code>secureChannel.definition</code> key, where URL patterns are stored under
the key “pattern”, and the values are stored under the key
“access” and are one of the access keywords
<code>REQUIRES_SECURE_CHANNEL</code>, <code>REQUIRES_INSECURE_CHANNEL</code>,
or <code>ANY_CHANNEL</code>:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 79. Sample
<code>grails.plugin.springsecurity.secureChannel.definition</code></div>
+<div class="title">Listing 86. Sample
<code>grails.plugin.springsecurity.secureChannel.definition</code></div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="groovy">grails.plugin.springsecurity.secureChannel.definition = [
[pattern: '/login/**', access: 'REQUIRES_SECURE_CHANNEL'],
@@ -5890,7 +6007,7 @@
grails.plugin.springsecurity.secureChannel.insecureHeaderValue = '...'</code></p
<p>To use this feature, specify an <code>ipRestrictions</code> configuration
as a <code>List</code> of <code>Map</code>s, one for each combination of URL
pattern to IP address patterns that can access those URLs. The IP patterns can
be single-value strings, or multi-value lists of strings. They can use <a
href="https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing">CIDR</a>
masks, and can specify either IPv4 or IPv6 patterns. For example, given this
configuration:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 80. Sample
<code>grails.plugin.springsecurity.ipRestrictions</code> configuration</div>
+<div class="title">Listing 87. Sample
<code>grails.plugin.springsecurity.ipRestrictions</code> configuration</div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="groovy">grails.plugin.springsecurity.ipRestrictions = [
[pattern: '/pattern1/**', access: '123.234.345.456'],
@@ -6030,7 +6147,7 @@
grails.plugin.springsecurity.secureChannel.insecureHeaderValue = '...'</code></p
<p>The beans must be declared either by the plugin or by you in
<code>resources.groovy</code>. For example, suppose you have a custom
<code>MyLogoutHandler</code> in <code>resources.groovy</code>:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 81. Registering a custom logout handler in
<code>resources.groovy</code></div>
+<div class="title">Listing 88. Registering a custom logout handler in
<code>resources.groovy</code></div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">import
com.foo.MyLogoutHandler
@@ -6045,7 +6162,7 @@ beans = {
<p>You register it in <code>grails-app/conf/application.groovy</code> as:</p>
</div>
<div class="listingblock">
-<div class="title">Listing 82. Adding a custom logout handler in
<code>grails.plugin.springsecurity.logout.handlerNames</code></div>
+<div class="title">Listing 89. Adding a custom logout handler in
<code>grails.plugin.springsecurity.logout.handlerNames</code></div>
<div class="content">
<pre class="prettyprint highlight"><code
data-lang="groovy">grails.plugin.springsecurity.logout.handlerNames = [
'rememberMeServices', 'securityContextLogoutHandler', 'myLogoutHandler'
@@ -6973,7 +7090,7 @@ class SecureController {
<p>Returns <code>true</code> if there is an authenticated user.</p>
</div>
<div class="listingblock">
-<div class="title">Listing 83. Example use of <code>isLoggedIn()</code></div>
+<div class="title">Listing 90. Example use of <code>isLoggedIn()</code></div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">class MyController
{
@@ -7008,7 +7125,7 @@ class SecureController {
<p>Retrieves the current authenticated user’s Principal (a
<code>GrailsUser</code> instance unless you’ve customized this) or
<code>null</code> if not authenticated.</p>
</div>
<div class="listingblock">
-<div class="title">Listing 84. Example use of <code>getPrincipal()</code></div>
+<div class="title">Listing 91. Example use of <code>getPrincipal()</code></div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">class MyController
{
@@ -7035,7 +7152,7 @@ class SecureController {
<p>Loads the user domain class instance from the database that corresponds to
the currently authenticated user, or <code>null</code> if not authenticated.
This is the equivalent of adding a dependency injection for
<code>springSecurityService</code> and calling
<code>PersonDomainClassName.get(springSecurityService.principal.id)</code> (the
typical way that this is often done).</p>
</div>
<div class="listingblock">
-<div class="title">Listing 85. Example use of
<code>getAuthenticatedUser()</code></div>
+<div class="title">Listing 92. Example use of
<code>getAuthenticatedUser()</code></div>
<div class="content">
<pre class="prettyprint highlight"><code data-lang="groovy">class MyController
{
@@ -7272,7 +7389,7 @@ logger 'grails.plugin.springsecurity', DEBUG, ['STDOUT'],
false</code></pre>
<div id="footer">
<div id="footer-text">
Version 7.0.2-SNAPSHOT<br>
-Last updated 2026-02-15 20:09:26 UTC
+Last updated 2026-02-19 02:04:10 UTC
</div>
</div>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/run_prettify.min.js"></script>
diff --git a/snapshot/ldap-plugin/guide/index.html
b/snapshot/ldap-plugin/guide/index.html
index b5af04b98..14d649eba 100644
--- a/snapshot/ldap-plugin/guide/index.html
+++ b/snapshot/ldap-plugin/guide/index.html
@@ -1191,7 +1191,7 @@ beans = {
<div id="footer">
<div id="footer-text">
Version 7.0.2-SNAPSHOT<br>
-Last updated 2026-02-15 20:09:26 UTC
+Last updated 2026-02-19 02:04:10 UTC
</div>
</div>
</body>
diff --git a/snapshot/oauth2-plugin/guide/index.html
b/snapshot/oauth2-plugin/guide/index.html
index b400c037e..e128e6a41 100644
--- a/snapshot/oauth2-plugin/guide/index.html
+++ b/snapshot/oauth2-plugin/guide/index.html
@@ -915,7 +915,7 @@ protected void authenticateAndRedirect(OAuth2SpringToken
oAuthToken, redirectUrl
<div id="footer">
<div id="footer-text">
Version 7.0.2-SNAPSHOT<br>
-Last updated 2026-02-15 20:09:26 UTC
+Last updated 2026-02-19 02:04:10 UTC
</div>
</div>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/run_prettify.min.js"></script>
diff --git a/snapshot/rest-plugin/guide/index.html
b/snapshot/rest-plugin/guide/index.html
index 0e3730dbf..8dfb81321 100644
--- a/snapshot/rest-plugin/guide/index.html
+++ b/snapshot/rest-plugin/guide/index.html
@@ -3747,7 +3747,7 @@ way of using HTTP sessions. So not acceptable.</p>
<div id="footer">
<div id="footer-text">
Version 7.0.2-SNAPSHOT<br>
-Last updated 2026-02-15 20:09:26 UTC
+Last updated 2026-02-19 02:04:10 UTC
</div>
</div>
</body>
diff --git a/snapshot/ui-plugin/guide/index.html
b/snapshot/ui-plugin/guide/index.html
index 2c0f97377..646591770 100644
--- a/snapshot/ui-plugin/guide/index.html
+++ b/snapshot/ui-plugin/guide/index.html
@@ -2499,7 +2499,7 @@ The second service is a listener service which ensures
that anytime an answer is
<div id="footer">
<div id="footer-text">
Version 7.0.2-SNAPSHOT<br>
-Last updated 2026-02-15 20:09:26 UTC
+Last updated 2026-02-19 02:04:10 UTC
</div>
</div>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/run_prettify.min.js"></script>