|  | @@ -9,9 +9,9 @@
 | 
	
		
			
				|  |  |          <para> Namespace configuration has been available since version 2.0 of the Spring framework.
 | 
	
		
			
				|  |  |              It allows you to supplement the traditional Spring beans application context syntax with
 | 
	
		
			
				|  |  |              elements from additional XML schema. You can find more information in the Spring <link
 | 
	
		
			
				|  |  | -            xlink:href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/apc.html"
 | 
	
		
			
				|  |  | -            > Reference Documentation</link>. A namespace element can be used simply to allow a more
 | 
	
		
			
				|  |  | -            concise way of configuring an individual bean or, more powerfully, to define an
 | 
	
		
			
				|  |  | +                xlink:href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/apc.html"
 | 
	
		
			
				|  |  | +                > Reference Documentation</link>. A namespace element can be used simply to allow a
 | 
	
		
			
				|  |  | +            more concise way of configuring an individual bean or, more powerfully, to define an
 | 
	
		
			
				|  |  |              alternative configuration syntax which more closely matches the problem domain and hides
 | 
	
		
			
				|  |  |              the underlying complexity from the user. A simple element may conceal the fact that
 | 
	
		
			
				|  |  |              multiple beans and processing steps are being added to the application context. For
 | 
	
	
		
			
				|  | @@ -22,13 +22,13 @@
 | 
	
		
			
				|  |  |              beans. The most common alternative configuration requirements are supported by
 | 
	
		
			
				|  |  |              attributes on the <literal>ldap-server</literal> element and the user is isolated from
 | 
	
		
			
				|  |  |              worrying about which beans they need to create and what the bean property names are. <footnote>
 | 
	
		
			
				|  |  | -            <para>You can find out more about the use of the <literal>ldap-server</literal> element
 | 
	
		
			
				|  |  | -                in the chapter on <link xlink:href="#ldap">LDAP</link>.</para>
 | 
	
		
			
				|  |  | +                <para>You can find out more about the use of the <literal>ldap-server</literal>
 | 
	
		
			
				|  |  | +                    element in the chapter on <link xlink:href="#ldap">LDAP</link>.</para>
 | 
	
		
			
				|  |  |              </footnote>. Use of a good XML editor while editing the application context file should
 | 
	
		
			
				|  |  |              provide information on the attributes and elements that are available. We would
 | 
	
		
			
				|  |  |              recommend that you try out the <link
 | 
	
		
			
				|  |  | -            xlink:href="http://www.springsource.com/products/sts">SpringSource Tool Suite</link> as
 | 
	
		
			
				|  |  | -            it has special features for working with standard Spring namespaces. </para>
 | 
	
		
			
				|  |  | +                xlink:href="http://www.springsource.com/products/sts">SpringSource Tool Suite</link>
 | 
	
		
			
				|  |  | +            as it has special features for working with standard Spring namespaces. </para>
 | 
	
		
			
				|  |  |          <para> To start using the security namespace in your application context, all you need to do
 | 
	
		
			
				|  |  |              is add the schema declaration to your application context file: <programlisting language="xml">
 | 
	
		
			
				|  |  |    <![CDATA[
 | 
	
	
		
			
				|  | @@ -63,37 +63,43 @@
 | 
	
		
			
				|  |  |                  provide a simplified and concise syntax for enabling them within an application. The
 | 
	
		
			
				|  |  |                  design is based around the large-scale dependencies within the framework, and can be
 | 
	
		
			
				|  |  |                  divided up into the following areas: <itemizedlist>
 | 
	
		
			
				|  |  | -                <listitem>
 | 
	
		
			
				|  |  | -                    <para> <emphasis>Web/HTTP Security</emphasis> - the most complex part. Sets up
 | 
	
		
			
				|  |  | -                        the filters and related service beans used to apply the framework
 | 
	
		
			
				|  |  | -                        authentication mechanisms, to secure URLs, render login and error pages and
 | 
	
		
			
				|  |  | -                        much more.</para>
 | 
	
		
			
				|  |  | -                </listitem>
 | 
	
		
			
				|  |  | -                <listitem>
 | 
	
		
			
				|  |  | -                    <para> <emphasis>Business Object (Method) Security</emphasis> - options for
 | 
	
		
			
				|  |  | -                        securing the service layer.</para>
 | 
	
		
			
				|  |  | -                </listitem>
 | 
	
		
			
				|  |  | -                <listitem>
 | 
	
		
			
				|  |  | -                    <para> <emphasis>AuthenticationManager</emphasis> - handles authentication
 | 
	
		
			
				|  |  | -                        requests from other parts of the framework.</para>
 | 
	
		
			
				|  |  | -                </listitem>
 | 
	
		
			
				|  |  | -                <listitem>
 | 
	
		
			
				|  |  | -                    <para> <emphasis>AccessDecisionManager</emphasis> - provides access decisions
 | 
	
		
			
				|  |  | -                        for web and method security. A default one will be registered, but you can
 | 
	
		
			
				|  |  | -                        also choose to use a custom one, declared using normal Spring bean
 | 
	
		
			
				|  |  | -                        syntax.</para>
 | 
	
		
			
				|  |  | -                </listitem>
 | 
	
		
			
				|  |  | -                <listitem>
 | 
	
		
			
				|  |  | -                    <para> <emphasis>AuthenticationProvider</emphasis>s - mechanisms against which
 | 
	
		
			
				|  |  | -                        the authentication manager authenticates users. The namespace provides
 | 
	
		
			
				|  |  | -                        supports for several standard options and also a means of adding custom
 | 
	
		
			
				|  |  | -                        beans declared using a traditional syntax. </para>
 | 
	
		
			
				|  |  | -                </listitem>
 | 
	
		
			
				|  |  | -                <listitem>
 | 
	
		
			
				|  |  | -                    <para> <emphasis>UserDetailsService</emphasis> - closely related to
 | 
	
		
			
				|  |  | -                        authentication providers, but often also required by other beans.</para>
 | 
	
		
			
				|  |  | -                </listitem>
 | 
	
		
			
				|  |  | -                <!-- todo: diagram and link to other sections which describe the interfaces -->
 | 
	
		
			
				|  |  | +                    <listitem>
 | 
	
		
			
				|  |  | +                        <para>
 | 
	
		
			
				|  |  | +                            <emphasis>Web/HTTP Security</emphasis> - the most complex part. Sets up
 | 
	
		
			
				|  |  | +                            the filters and related service beans used to apply the framework
 | 
	
		
			
				|  |  | +                            authentication mechanisms, to secure URLs, render login and error pages
 | 
	
		
			
				|  |  | +                            and much more.</para>
 | 
	
		
			
				|  |  | +                    </listitem>
 | 
	
		
			
				|  |  | +                    <listitem>
 | 
	
		
			
				|  |  | +                        <para>
 | 
	
		
			
				|  |  | +                            <emphasis>Business Object (Method) Security</emphasis> - options for
 | 
	
		
			
				|  |  | +                            securing the service layer.</para>
 | 
	
		
			
				|  |  | +                    </listitem>
 | 
	
		
			
				|  |  | +                    <listitem>
 | 
	
		
			
				|  |  | +                        <para>
 | 
	
		
			
				|  |  | +                            <emphasis>AuthenticationManager</emphasis> - handles authentication
 | 
	
		
			
				|  |  | +                            requests from other parts of the framework.</para>
 | 
	
		
			
				|  |  | +                    </listitem>
 | 
	
		
			
				|  |  | +                    <listitem>
 | 
	
		
			
				|  |  | +                        <para>
 | 
	
		
			
				|  |  | +                            <emphasis>AccessDecisionManager</emphasis> - provides access decisions
 | 
	
		
			
				|  |  | +                            for web and method security. A default one will be registered, but you
 | 
	
		
			
				|  |  | +                            can also choose to use a custom one, declared using normal Spring bean
 | 
	
		
			
				|  |  | +                            syntax.</para>
 | 
	
		
			
				|  |  | +                    </listitem>
 | 
	
		
			
				|  |  | +                    <listitem>
 | 
	
		
			
				|  |  | +                        <para>
 | 
	
		
			
				|  |  | +                            <emphasis>AuthenticationProvider</emphasis>s - mechanisms against which
 | 
	
		
			
				|  |  | +                            the authentication manager authenticates users. The namespace provides
 | 
	
		
			
				|  |  | +                            supports for several standard options and also a means of adding custom
 | 
	
		
			
				|  |  | +                            beans declared using a traditional syntax. </para>
 | 
	
		
			
				|  |  | +                    </listitem>
 | 
	
		
			
				|  |  | +                    <listitem>
 | 
	
		
			
				|  |  | +                        <para>
 | 
	
		
			
				|  |  | +                            <emphasis>UserDetailsService</emphasis> - closely related to
 | 
	
		
			
				|  |  | +                            authentication providers, but often also required by other beans.</para>
 | 
	
		
			
				|  |  | +                    </listitem>
 | 
	
		
			
				|  |  | +                    <!-- todo: diagram and link to other sections which describe the interfaces -->
 | 
	
		
			
				|  |  |                  </itemizedlist></para>
 | 
	
		
			
				|  |  |              <para>We'll see how to configure these in the following sections.</para>
 | 
	
		
			
				|  |  |          </section>
 | 
	
	
		
			
				|  | @@ -109,7 +115,7 @@
 | 
	
		
			
				|  |  |          <section xml:id="ns-web-xml">
 | 
	
		
			
				|  |  |              <title><literal>web.xml</literal> Configuration</title>
 | 
	
		
			
				|  |  |              <para> The first thing you need to do is add the following filter declaration to your
 | 
	
		
			
				|  |  | -                <literal>web.xml</literal> file: <programlisting language="xml"><![CDATA[
 | 
	
		
			
				|  |  | +                    <literal>web.xml</literal> file: <programlisting language="xml"><![CDATA[
 | 
	
		
			
				|  |  |  <filter>
 | 
	
		
			
				|  |  |    <filter-name>springSecurityFilterChain</filter-name>
 | 
	
		
			
				|  |  |    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
 | 
	
	
		
			
				|  | @@ -123,11 +129,12 @@
 | 
	
		
			
				|  |  |                  infrastructure. <classname>DelegatingFilterProxy</classname> is a Spring Framework
 | 
	
		
			
				|  |  |                  class which delegates to a filter implementation which is defined as a Spring bean
 | 
	
		
			
				|  |  |                  in your application context. In this case, the bean is named
 | 
	
		
			
				|  |  | -                <quote>springSecurityFilterChain</quote>, which is an internal infrastructure bean
 | 
	
		
			
				|  |  | -                created by the namespace to handle web security. Note that you should not use this
 | 
	
		
			
				|  |  | -                bean name yourself. Once you've added this to your <filename>web.xml</filename>,
 | 
	
		
			
				|  |  | -                you're ready to start editing your application context file. Web security services
 | 
	
		
			
				|  |  | -                are configured using the <literal><http></literal> element. </para>
 | 
	
		
			
				|  |  | +                    <quote>springSecurityFilterChain</quote>, which is an internal infrastructure
 | 
	
		
			
				|  |  | +                bean created by the namespace to handle web security. Note that you should not use
 | 
	
		
			
				|  |  | +                this bean name yourself. Once you've added this to your
 | 
	
		
			
				|  |  | +                <filename>web.xml</filename>, you're ready to start editing your application context
 | 
	
		
			
				|  |  | +                file. Web security services are configured using the <literal><http></literal>
 | 
	
		
			
				|  |  | +                element. </para>
 | 
	
		
			
				|  |  |          </section>
 | 
	
		
			
				|  |  |          <section xml:id="ns-minimal">
 | 
	
		
			
				|  |  |              <title>A Minimal <literal><http></literal> Configuration</title>
 | 
	
	
		
			
				|  | @@ -138,30 +145,32 @@
 | 
	
		
			
				|  |  |    ]]>
 | 
	
		
			
				|  |  |  </programlisting> Which says that we want all URLs within our application to be secured,
 | 
	
		
			
				|  |  |                  requiring the role <literal>ROLE_USER</literal> to access them. The
 | 
	
		
			
				|  |  | -                <literal><http></literal> element is the parent for all web-related namespace
 | 
	
		
			
				|  |  | +                    <literal><http></literal> element is the parent for all web-related namespace
 | 
	
		
			
				|  |  |                  functionality. The <literal><intercept-url></literal> element defines a
 | 
	
		
			
				|  |  | -                <literal>pattern</literal> which is matched against the URLs of incoming requests
 | 
	
		
			
				|  |  | -                using an ant path style syntax. The <literal>access</literal> attribute defines the
 | 
	
		
			
				|  |  | -                access requirements for requests matching the given pattern. With the default
 | 
	
		
			
				|  |  | -                configuration, this is typically a comma-separated list of roles, one of which a
 | 
	
		
			
				|  |  | -                user must have to be allowed to make the request. The prefix <quote>ROLE_</quote> is
 | 
	
		
			
				|  |  | -                a marker which indicates that a simple comparison with the user's authorities should
 | 
	
		
			
				|  |  | -                be made. In other words, a normal role-based check should be used. Access-control in
 | 
	
		
			
				|  |  | -                Spring Security is not limited to the use of simple roles (hence the use of the
 | 
	
		
			
				|  |  | -                prefix to differentiate between different types of security attributes). We'll see
 | 
	
		
			
				|  |  | -                later how the interpretation can vary<footnote>
 | 
	
		
			
				|  |  | -                <para>The interpretation of the comma-separated values in the
 | 
	
		
			
				|  |  | -                    <literal>access</literal> attribute depends on the implementation of the <link
 | 
	
		
			
				|  |  | -                    xlink:href="#ns-access-manager">AccessDecisionManager</link> which is used. In
 | 
	
		
			
				|  |  | -                    Spring Security 3.0, the attribute can also be populated with an <link
 | 
	
		
			
				|  |  | -                    xlink:href="#el-access">EL expression</link>.</para>
 | 
	
		
			
				|  |  | +                    <literal>pattern</literal> which is matched against the URLs of incoming
 | 
	
		
			
				|  |  | +                requests using an ant path style syntax. You can also use regular-expression
 | 
	
		
			
				|  |  | +                matching as an alternative (see the namespace appendix for more details). The
 | 
	
		
			
				|  |  | +                    <literal>access</literal> attribute defines the access requirements for requests
 | 
	
		
			
				|  |  | +                matching the given pattern. With the default configuration, this is typically a
 | 
	
		
			
				|  |  | +                comma-separated list of roles, one of which a user must have to be allowed to make
 | 
	
		
			
				|  |  | +                the request. The prefix <quote>ROLE_</quote> is a marker which indicates that a
 | 
	
		
			
				|  |  | +                simple comparison with the user's authorities should be made. In other words, a
 | 
	
		
			
				|  |  | +                normal role-based check should be used. Access-control in Spring Security is not
 | 
	
		
			
				|  |  | +                limited to the use of simple roles (hence the use of the prefix to differentiate
 | 
	
		
			
				|  |  | +                between different types of security attributes). We'll see later how the
 | 
	
		
			
				|  |  | +                interpretation can vary<footnote>
 | 
	
		
			
				|  |  | +                    <para>The interpretation of the comma-separated values in the
 | 
	
		
			
				|  |  | +                            <literal>access</literal> attribute depends on the implementation of the
 | 
	
		
			
				|  |  | +                            <link xlink:href="#ns-access-manager">AccessDecisionManager</link> which
 | 
	
		
			
				|  |  | +                        is used. In Spring Security 3.0, the attribute can also be populated with an
 | 
	
		
			
				|  |  | +                            <link xlink:href="#el-access">EL expression</link>.</para>
 | 
	
		
			
				|  |  |                  </footnote>.</para>
 | 
	
		
			
				|  |  |              <note>
 | 
	
		
			
				|  |  |                  <para>You can use multiple <literal><intercept-url></literal> elements to
 | 
	
		
			
				|  |  |                      define different access requirements for different sets of URLs, but they will
 | 
	
		
			
				|  |  |                      be evaluated in the order listed and the first match will be used. So you must
 | 
	
		
			
				|  |  |                      put the most specific matches at the top. You can also add a
 | 
	
		
			
				|  |  | -                    <literal>method</literal> attribute to limit the match to a particular HTTP
 | 
	
		
			
				|  |  | +                        <literal>method</literal> attribute to limit the match to a particular HTTP
 | 
	
		
			
				|  |  |                      method (<literal>GET</literal>, <literal>POST</literal>, <literal>PUT</literal>
 | 
	
		
			
				|  |  |                      etc.). If a request matches multiple patterns, the method-specific match will
 | 
	
		
			
				|  |  |                      take precedence regardless of ordering.</para>
 | 
	
	
		
			
				|  | @@ -180,17 +189,17 @@
 | 
	
		
			
				|  |  |              <sidebar>
 | 
	
		
			
				|  |  |                  <para>If you are familiar with pre-namespace versions of the framework, you can
 | 
	
		
			
				|  |  |                      probably already guess roughly what's going on here. The
 | 
	
		
			
				|  |  | -                    <literal><http></literal> element is responsible for creating a
 | 
	
		
			
				|  |  | -                    <classname>FilterChainProxy</classname> and the filter beans which it uses.
 | 
	
		
			
				|  |  | +                        <literal><http></literal> element is responsible for creating a
 | 
	
		
			
				|  |  | +                        <classname>FilterChainProxy</classname> and the filter beans which it uses.
 | 
	
		
			
				|  |  |                      Common problems like incorrect filter ordering are no longer an issue as the
 | 
	
		
			
				|  |  |                      filter positions are predefined.</para>
 | 
	
		
			
				|  |  |                  <para>The <literal><authentication-provider></literal> element creates a
 | 
	
		
			
				|  |  | -                    <classname>DaoAuthenticationProvider</classname> bean and the
 | 
	
		
			
				|  |  | -                    <literal><user-service></literal> element creates an
 | 
	
		
			
				|  |  | -                    <classname>InMemoryDaoImpl</classname>. All
 | 
	
		
			
				|  |  | -                    <literal>authentication-provider</literal> elements must be children of the
 | 
	
		
			
				|  |  | -                    <literal><authentication-manager></literal> element, which creates a
 | 
	
		
			
				|  |  | -                    <classname>ProviderManager</classname> and registers the authentication
 | 
	
		
			
				|  |  | +                        <classname>DaoAuthenticationProvider</classname> bean and the
 | 
	
		
			
				|  |  | +                        <literal><user-service></literal> element creates an
 | 
	
		
			
				|  |  | +                        <classname>InMemoryDaoImpl</classname>. All
 | 
	
		
			
				|  |  | +                        <literal>authentication-provider</literal> elements must be children of the
 | 
	
		
			
				|  |  | +                        <literal><authentication-manager></literal> element, which creates a
 | 
	
		
			
				|  |  | +                        <classname>ProviderManager</classname> and registers the authentication
 | 
	
		
			
				|  |  |                      providers with it. You can find more detailed information on the beans that are
 | 
	
		
			
				|  |  |                      created in the <link xlink:href="#appendix-namespace">namespace appendix</link>.
 | 
	
		
			
				|  |  |                      It's worth cross-checking this if you want to start understanding what the
 | 
	
	
		
			
				|  | @@ -200,20 +209,20 @@
 | 
	
		
			
				|  |  |              <para> The configuration above defines two users, their passwords and their roles within
 | 
	
		
			
				|  |  |                  the application (which will be used for access control). It is also possible to load
 | 
	
		
			
				|  |  |                  user information from a standard properties file using the
 | 
	
		
			
				|  |  | -                <literal>properties</literal> attribute on <literal>user-service</literal>. See the
 | 
	
		
			
				|  |  | -                section on <link xlink:href="#core-services-in-memory-service">in-memory
 | 
	
		
			
				|  |  | -                authentication</link> for more details on the file format. Using the
 | 
	
		
			
				|  |  | -                <literal><authentication-provider></literal> element means that the user
 | 
	
		
			
				|  |  | +                    <literal>properties</literal> attribute on <literal>user-service</literal>. See
 | 
	
		
			
				|  |  | +                the section on <link xlink:href="#core-services-in-memory-service">in-memory
 | 
	
		
			
				|  |  | +                    authentication</link> for more details on the file format. Using the
 | 
	
		
			
				|  |  | +                    <literal><authentication-provider></literal> element means that the user
 | 
	
		
			
				|  |  |                  information will be used by the authentication manager to process authentication
 | 
	
		
			
				|  |  |                  requests. You can have multiple <literal><authentication-provider></literal>
 | 
	
		
			
				|  |  |                  elements to define different authentication sources and each will be consulted in
 | 
	
		
			
				|  |  |                  turn.</para>
 | 
	
		
			
				|  |  |              <para> At this point you should be able to start up your application and you will be
 | 
	
		
			
				|  |  |                  required to log in to proceed. Try it out, or try experimenting with the
 | 
	
		
			
				|  |  | -                <quote>tutorial</quote> sample application that comes with the project. The above
 | 
	
		
			
				|  |  | -                configuration actually adds quite a few services to the application because we have
 | 
	
		
			
				|  |  | -                used the <literal>auto-config</literal> attribute. For example, form-based login
 | 
	
		
			
				|  |  | -                processing is automatically enabled. </para>
 | 
	
		
			
				|  |  | +                    <quote>tutorial</quote> sample application that comes with the project. The
 | 
	
		
			
				|  |  | +                above configuration actually adds quite a few services to the application because we
 | 
	
		
			
				|  |  | +                have used the <literal>auto-config</literal> attribute. For example, form-based
 | 
	
		
			
				|  |  | +                login processing is automatically enabled. </para>
 | 
	
		
			
				|  |  |              <section xml:id="ns-auto-config">
 | 
	
		
			
				|  |  |                  <title>What does <literal>auto-config</literal> Include?</title>
 | 
	
		
			
				|  |  |                  <para> The <literal>auto-config</literal> attribute, as we have used it above, is
 | 
	
	
		
			
				|  | @@ -225,27 +234,27 @@
 | 
	
		
			
				|  |  |    </http>
 | 
	
		
			
				|  |  |    ]]></programlisting> These other elements are responsible for setting up form-login, basic
 | 
	
		
			
				|  |  |                      authentication and logout handling services respectively <footnote>
 | 
	
		
			
				|  |  | -                    <para>In versions prior to 3.0, this list also included remember-me
 | 
	
		
			
				|  |  | -                        functionality. This could cause some confusing errors with some
 | 
	
		
			
				|  |  | -                        configurations and was removed in 3.0. In 3.0, the addition of an
 | 
	
		
			
				|  |  | -                        <classname>AnonymousAuthenticationFilter</classname> is part of the default
 | 
	
		
			
				|  |  | -                        <literal><http></literal> configuration, so the <literal><anonymous
 | 
	
		
			
				|  |  | -                        /></literal> element is added regardless of whether
 | 
	
		
			
				|  |  | -                        <literal>auto-config</literal> is enabled.</para>
 | 
	
		
			
				|  |  | +                        <para>In versions prior to 3.0, this list also included remember-me
 | 
	
		
			
				|  |  | +                            functionality. This could cause some confusing errors with some
 | 
	
		
			
				|  |  | +                            configurations and was removed in 3.0. In 3.0, the addition of an
 | 
	
		
			
				|  |  | +                                <classname>AnonymousAuthenticationFilter</classname> is part of the
 | 
	
		
			
				|  |  | +                            default <literal><http></literal> configuration, so the
 | 
	
		
			
				|  |  | +                                <literal><anonymous /></literal> element is added regardless of
 | 
	
		
			
				|  |  | +                            whether <literal>auto-config</literal> is enabled.</para>
 | 
	
		
			
				|  |  |                      </footnote> . They each have attributes which can be used to alter their
 | 
	
		
			
				|  |  |                      behaviour. </para>
 | 
	
		
			
				|  |  |              </section>
 | 
	
		
			
				|  |  |          </section>
 | 
	
		
			
				|  |  |          <section xml:id="ns-form-and-basic">
 | 
	
		
			
				|  |  |              <title>Form and Basic Login Options</title>
 | 
	
		
			
				|  |  | -            <para> You might be wondering where the login form came from when you were prompted
 | 
	
		
			
				|  |  | -                to log in, since we made no mention of any HTML files or JSPs. In fact, since we
 | 
	
		
			
				|  |  | -                didn't explicitly set a URL for the login page, Spring Security generates one
 | 
	
		
			
				|  |  | -                automatically, based on the features that are enabled and using standard values
 | 
	
		
			
				|  |  | -                for the URL which processes the submitted login, the default target URL the user
 | 
	
		
			
				|  |  | -                will be sent to after loggin in and so on. However, the namespace offers plenty
 | 
	
		
			
				|  |  | -                of support to allow you to customize these options. For example, if you want to
 | 
	
		
			
				|  |  | -                supply your own login page, you could use: <programlisting language="xml"><![CDATA[
 | 
	
		
			
				|  |  | +            <para> You might be wondering where the login form came from when you were prompted to
 | 
	
		
			
				|  |  | +                log in, since we made no mention of any HTML files or JSPs. In fact, since we didn't
 | 
	
		
			
				|  |  | +                explicitly set a URL for the login page, Spring Security generates one
 | 
	
		
			
				|  |  | +                automatically, based on the features that are enabled and using standard values for
 | 
	
		
			
				|  |  | +                the URL which processes the submitted login, the default target URL the user will be
 | 
	
		
			
				|  |  | +                sent to after loggin in and so on. However, the namespace offers plenty of support
 | 
	
		
			
				|  |  | +                to allow you to customize these options. For example, if you want to supply your own
 | 
	
		
			
				|  |  | +                login page, you could use: <programlisting language="xml"><![CDATA[
 | 
	
		
			
				|  |  |    <http auto-config='true'>
 | 
	
		
			
				|  |  |      <intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
 | 
	
		
			
				|  |  |      <intercept-url pattern="/**" access="ROLE_USER" />
 | 
	
	
		
			
				|  | @@ -253,19 +262,19 @@
 | 
	
		
			
				|  |  |    </http>
 | 
	
		
			
				|  |  |    ]]>
 | 
	
		
			
				|  |  |      </programlisting> Note that you can still use <literal>auto-config</literal>. The
 | 
	
		
			
				|  |  | -                <literal>form-login</literal> element just overrides the default settings. Also
 | 
	
		
			
				|  |  | -                note that we've added an extra <literal>intercept-url</literal> element to say
 | 
	
		
			
				|  |  | -                that any requests for the login page should be available to anonymous users <footnote>
 | 
	
		
			
				|  |  | -                <para>See the chapter on <link xlink:href="#anonymous">anonymous
 | 
	
		
			
				|  |  | -                    authentication</link> and also the <link
 | 
	
		
			
				|  |  | -                    xlink:href="#authz-authenticated-voter">AuthenticatedVoter</link> class for
 | 
	
		
			
				|  |  | -                    more details on how the value
 | 
	
		
			
				|  |  | -                    <literal>IS_AUTHENTICATED_ANONYMOUSLY</literal> is processed.</para>
 | 
	
		
			
				|  |  | +                    <literal>form-login</literal> element just overrides the default settings. Also
 | 
	
		
			
				|  |  | +                note that we've added an extra <literal>intercept-url</literal> element to say that
 | 
	
		
			
				|  |  | +                any requests for the login page should be available to anonymous users <footnote>
 | 
	
		
			
				|  |  | +                    <para>See the chapter on <link xlink:href="#anonymous">anonymous
 | 
	
		
			
				|  |  | +                            authentication</link> and also the <link
 | 
	
		
			
				|  |  | +                            xlink:href="#authz-authenticated-voter">AuthenticatedVoter</link> class
 | 
	
		
			
				|  |  | +                        for more details on how the value
 | 
	
		
			
				|  |  | +                            <literal>IS_AUTHENTICATED_ANONYMOUSLY</literal> is processed.</para>
 | 
	
		
			
				|  |  |                  </footnote>. Otherwise the request would be matched by the pattern
 | 
	
		
			
				|  |  | -                <literal>/**</literal> and it wouldn't be possible to access the login page
 | 
	
		
			
				|  |  | -                itself! This is a common configuration error and will result in an infinite loop
 | 
	
		
			
				|  |  | -                in the application. Spring Security will emit a warning in the log if your login
 | 
	
		
			
				|  |  | -                page appears to be secured. It is also possible to have all requests matching a
 | 
	
		
			
				|  |  | +                    <literal>/**</literal> and it wouldn't be possible to access the login page
 | 
	
		
			
				|  |  | +                itself! This is a common configuration error and will result in an infinite loop in
 | 
	
		
			
				|  |  | +                the application. Spring Security will emit a warning in the log if your login page
 | 
	
		
			
				|  |  | +                appears to be secured. It is also possible to have all requests matching a
 | 
	
		
			
				|  |  |                  particular pattern bypass the security filter chain completely: <programlisting language="xml"><![CDATA[
 | 
	
		
			
				|  |  |    <http auto-config='true'>
 | 
	
		
			
				|  |  |      <intercept-url pattern="/css/**" filters="none"/>
 | 
	
	
		
			
				|  | @@ -276,10 +285,10 @@
 | 
	
		
			
				|  |  |    ]]>
 | 
	
		
			
				|  |  |        </programlisting>It's important to realise that these requests will be completely
 | 
	
		
			
				|  |  |                  oblivious to any further Spring Security web-related configuration or additional
 | 
	
		
			
				|  |  | -                attributes such as <literal>requires-channel</literal>, so you will not be able
 | 
	
		
			
				|  |  | -                to access information on the current user or call secured methods during the
 | 
	
		
			
				|  |  | -                request. Use <literal>access='IS_AUTHENTICATED_ANONYMOUSLY'</literal> as an
 | 
	
		
			
				|  |  | -                alternative if you still want the security filter chain to be applied.</para>
 | 
	
		
			
				|  |  | +                attributes such as <literal>requires-channel</literal>, so you will not be able to
 | 
	
		
			
				|  |  | +                access information on the current user or call secured methods during the request.
 | 
	
		
			
				|  |  | +                Use <literal>access='IS_AUTHENTICATED_ANONYMOUSLY'</literal> as an alternative if
 | 
	
		
			
				|  |  | +                you still want the security filter chain to be applied.</para>
 | 
	
		
			
				|  |  |              <para>If you want to use basic authentication instead of form login, then change the
 | 
	
		
			
				|  |  |                  configuration to <programlisting language="xml"><![CDATA[
 | 
	
		
			
				|  |  |    <http auto-config='true'>
 | 
	
	
		
			
				|  | @@ -288,18 +297,18 @@
 | 
	
		
			
				|  |  |    </http>
 | 
	
		
			
				|  |  |    ]]>
 | 
	
		
			
				|  |  |      </programlisting> Basic authentication will then take precedence and will be used to
 | 
	
		
			
				|  |  | -                prompt for a login when a user attempts to access a protected resource. Form
 | 
	
		
			
				|  |  | -                login is still available in this configuration if you wish to use it, for
 | 
	
		
			
				|  |  | -                example through a login form embedded in another web page. </para>
 | 
	
		
			
				|  |  | +                prompt for a login when a user attempts to access a protected resource. Form login
 | 
	
		
			
				|  |  | +                is still available in this configuration if you wish to use it, for example through
 | 
	
		
			
				|  |  | +                a login form embedded in another web page. </para>
 | 
	
		
			
				|  |  |              <section xml:id="ns-form-target">
 | 
	
		
			
				|  |  |                  <title>Setting a Default Post-Login Destination</title>
 | 
	
		
			
				|  |  | -                <para> If a form login isn't prompted by an attempt to access a protected
 | 
	
		
			
				|  |  | -                    resource, the <literal>default-target-url</literal> option comes into play.
 | 
	
		
			
				|  |  | -                    This is the URL the user will be taken to after successfully logging in, and
 | 
	
		
			
				|  |  | -                    defaults to "/". You can also configure things so that the user
 | 
	
		
			
				|  |  | -                    <emphasis>always</emphasis> ends up at this page (regardless of whether the
 | 
	
		
			
				|  |  | -                    login was "on-demand" or they explicitly chose to log in) by setting the
 | 
	
		
			
				|  |  | -                    <literal>always-use-default-target</literal> attribute to "true". This is
 | 
	
		
			
				|  |  | +                <para> If a form login isn't prompted by an attempt to access a protected resource,
 | 
	
		
			
				|  |  | +                    the <literal>default-target-url</literal> option comes into play. This is the
 | 
	
		
			
				|  |  | +                    URL the user will be taken to after successfully logging in, and defaults to
 | 
	
		
			
				|  |  | +                    "/". You can also configure things so that the user <emphasis>always</emphasis>
 | 
	
		
			
				|  |  | +                    ends up at this page (regardless of whether the login was "on-demand" or they
 | 
	
		
			
				|  |  | +                    explicitly chose to log in) by setting the
 | 
	
		
			
				|  |  | +                        <literal>always-use-default-target</literal> attribute to "true". This is
 | 
	
		
			
				|  |  |                      useful if your application always requires that the user starts at a "home"
 | 
	
		
			
				|  |  |                      page, for example: <programlisting language="xml"><![CDATA[
 | 
	
		
			
				|  |  |    <http>
 | 
	
	
		
			
				|  | @@ -310,12 +319,11 @@
 | 
	
		
			
				|  |  |    </http>
 | 
	
		
			
				|  |  |    ]]>         </programlisting></para>
 | 
	
		
			
				|  |  |                  <para>For even more control over the destination, you can use the
 | 
	
		
			
				|  |  | -                    <literal>authentication-success-handler-ref</literal> attribute as an
 | 
	
		
			
				|  |  | -                    alternative to <literal>default-target-url</literal>. The referenced bean
 | 
	
		
			
				|  |  | -                    should be an instance of
 | 
	
		
			
				|  |  | -                    <interfacename>AuthenticationSuccessHandler</interfacename>. You'll find
 | 
	
		
			
				|  |  | -                    more on this in the <link xlink:href="#form-login-flow-handling">Core
 | 
	
		
			
				|  |  | -                    Filters</link> chapter and also in the namespace appendix, as well as
 | 
	
		
			
				|  |  | +                        <literal>authentication-success-handler-ref</literal> attribute as an
 | 
	
		
			
				|  |  | +                    alternative to <literal>default-target-url</literal>. The referenced bean should
 | 
	
		
			
				|  |  | +                    be an instance of <interfacename>AuthenticationSuccessHandler</interfacename>.
 | 
	
		
			
				|  |  | +                    You'll find more on this in the <link xlink:href="#form-login-flow-handling"
 | 
	
		
			
				|  |  | +                        >Core Filters</link> chapter and also in the namespace appendix, as well as
 | 
	
		
			
				|  |  |                      information on how to customize the flow when authentication fails. </para>
 | 
	
		
			
				|  |  |              </section>
 | 
	
		
			
				|  |  |          </section>
 | 
	
	
		
			
				|  | @@ -326,7 +334,7 @@
 | 
	
		
			
				|  |  |                  user information in something like a database or an LDAP server. LDAP namespace
 | 
	
		
			
				|  |  |                  configuration is dealt with in the <link xlink:href="#ldap">LDAP chapter</link>, so
 | 
	
		
			
				|  |  |                  we won't cover it here. If you have a custom implementation of Spring Security's
 | 
	
		
			
				|  |  | -                <classname>UserDetailsService</classname>, called "myUserDetailsService" in your
 | 
	
		
			
				|  |  | +                    <classname>UserDetailsService</classname>, called "myUserDetailsService" in your
 | 
	
		
			
				|  |  |                  application context, then you can authenticate against this using <programlisting language="xml"><![CDATA[
 | 
	
		
			
				|  |  |    <authentication-manager>
 | 
	
		
			
				|  |  |      <authentication-provider user-service-ref='myUserDetailsService'/>
 | 
	
	
		
			
				|  | @@ -340,11 +348,12 @@
 | 
	
		
			
				|  |  |    </authentication-manager>
 | 
	
		
			
				|  |  |    ]]>
 | 
	
		
			
				|  |  |          </programlisting> Where <quote>securityDataSource</quote> is the name of a
 | 
	
		
			
				|  |  | -                <classname>DataSource</classname> bean in the application context, pointing at a
 | 
	
		
			
				|  |  | +                    <classname>DataSource</classname> bean in the application context, pointing at a
 | 
	
		
			
				|  |  |                  database containing the standard Spring Security <link
 | 
	
		
			
				|  |  | -                xlink:href="#db_schema_users_authorities">user data tables</link>. Alternatively,
 | 
	
		
			
				|  |  | -                you could configure a Spring Security <classname>JdbcDaoImpl</classname> bean and
 | 
	
		
			
				|  |  | -                point at that using the <literal>user-service-ref</literal> attribute: <programlisting language="xml"><![CDATA[
 | 
	
		
			
				|  |  | +                    xlink:href="#db_schema_users_authorities">user data tables</link>.
 | 
	
		
			
				|  |  | +                Alternatively, you could configure a Spring Security
 | 
	
		
			
				|  |  | +                    <classname>JdbcDaoImpl</classname> bean and point at that using the
 | 
	
		
			
				|  |  | +                    <literal>user-service-ref</literal> attribute: <programlisting language="xml"><![CDATA[
 | 
	
		
			
				|  |  |    <authentication-manager>
 | 
	
		
			
				|  |  |      <authentication-provider user-service-ref='myUserDetailsService'/>
 | 
	
		
			
				|  |  |    </authentication-manager>
 | 
	
	
		
			
				|  | @@ -355,18 +364,18 @@
 | 
	
		
			
				|  |  |    </beans:bean>
 | 
	
		
			
				|  |  |    ]]>
 | 
	
		
			
				|  |  |          </programlisting> You can also use standard
 | 
	
		
			
				|  |  | -                <interfacename>AuthenticationProvider</interfacename> beans as follows <programlisting language="xml"><![CDATA[
 | 
	
		
			
				|  |  | +                    <interfacename>AuthenticationProvider</interfacename> beans as follows <programlisting language="xml"><![CDATA[
 | 
	
		
			
				|  |  |    <authentication-manager>
 | 
	
		
			
				|  |  |      <authentication-provider ref='myAuthenticationProvider'/>
 | 
	
		
			
				|  |  |    </authentication-manager>
 | 
	
		
			
				|  |  |    ]]>
 | 
	
		
			
				|  |  |          </programlisting> where <literal>myAuthenticationProvider</literal> is the name of a
 | 
	
		
			
				|  |  |                  bean in your application context which implements
 | 
	
		
			
				|  |  | -                <interfacename>AuthenticationProvider</interfacename>. You can use multiple
 | 
	
		
			
				|  |  | -                <literal>authentication-provider</literal> elements, in which case the providers
 | 
	
		
			
				|  |  | +                    <interfacename>AuthenticationProvider</interfacename>. You can use multiple
 | 
	
		
			
				|  |  | +                    <literal>authentication-provider</literal> elements, in which case the providers
 | 
	
		
			
				|  |  |                  will be queried in the order they are declared. See <xref linkend="ns-auth-manager"
 | 
	
		
			
				|  |  |                  /> for more on information on how the Spring Security
 | 
	
		
			
				|  |  | -                <interfacename>AuthenticationManager</interfacename> is configured using the
 | 
	
		
			
				|  |  | +                    <interfacename>AuthenticationManager</interfacename> is configured using the
 | 
	
		
			
				|  |  |                  namespace. </para>
 | 
	
		
			
				|  |  |              <section xml:id="ns-password-encoder">
 | 
	
		
			
				|  |  |                  <title>Adding a Password Encoder</title>
 | 
	
	
		
			
				|  | @@ -397,8 +406,8 @@
 | 
	
		
			
				|  |  |      <salt-source user-property="username"/>
 | 
	
		
			
				|  |  |    </password-encoder>
 | 
	
		
			
				|  |  |      ]]></programlisting> You can use a custom password encoder bean by using the
 | 
	
		
			
				|  |  | -                    <literal>ref</literal> attribute of <literal>password-encoder</literal>. This
 | 
	
		
			
				|  |  | -                    should contain the name of a bean in the application context which is an
 | 
	
		
			
				|  |  | +                        <literal>ref</literal> attribute of <literal>password-encoder</literal>.
 | 
	
		
			
				|  |  | +                    This should contain the name of a bean in the application context which is an
 | 
	
		
			
				|  |  |                      instance of Spring Security's <interfacename>PasswordEncoder</interfacename>
 | 
	
		
			
				|  |  |                      interface. </para>
 | 
	
		
			
				|  |  |              </section>
 | 
	
	
		
			
				|  | @@ -415,8 +424,8 @@
 | 
	
		
			
				|  |  |              <title>Adding HTTP/HTTPS Channel Security</title>
 | 
	
		
			
				|  |  |              <para>If your application supports both HTTP and HTTPS, and you require that particular
 | 
	
		
			
				|  |  |                  URLs can only be accessed over HTTPS, then this is directly supported using the
 | 
	
		
			
				|  |  | -                <literal>requires-channel</literal> attribute on
 | 
	
		
			
				|  |  | -                <literal><intercept-url></literal>: <programlisting language="xml"><![CDATA[
 | 
	
		
			
				|  |  | +                    <literal>requires-channel</literal> attribute on
 | 
	
		
			
				|  |  | +                    <literal><intercept-url></literal>: <programlisting language="xml"><![CDATA[
 | 
	
		
			
				|  |  |    <http>
 | 
	
		
			
				|  |  |      <intercept-url pattern="/secure/**" access="ROLE_USER" requires-channel="https"/>
 | 
	
		
			
				|  |  |      <intercept-url pattern="/**" access="ROLE_USER" requires-channel="any"/>
 | 
	
	
		
			
				|  | @@ -454,8 +463,8 @@
 | 
	
		
			
				|  |  |                  <para>If you wish to place constraints on a single user's ability to log in to your
 | 
	
		
			
				|  |  |                      application, Spring Security supports this out of the box with the following
 | 
	
		
			
				|  |  |                      simple additions. First you need to add the following listener to your
 | 
	
		
			
				|  |  | -                    <filename>web.xml</filename> file to keep Spring Security updated about session
 | 
	
		
			
				|  |  | -                    lifecycle events: <programlisting language="xml"><![CDATA[
 | 
	
		
			
				|  |  | +                        <filename>web.xml</filename> file to keep Spring Security updated about
 | 
	
		
			
				|  |  | +                    session lifecycle events: <programlisting language="xml"><![CDATA[
 | 
	
		
			
				|  |  |    <listener>
 | 
	
		
			
				|  |  |      <listener-class>
 | 
	
		
			
				|  |  |        org.springframework.security.web.session.HttpSessionEventPublisher
 | 
	
	
		
			
				|  | @@ -478,44 +487,45 @@
 | 
	
		
			
				|  |  |      </session-management>
 | 
	
		
			
				|  |  |    </http>]]>
 | 
	
		
			
				|  |  |          </programlisting>The second login will then be rejected. By
 | 
	
		
			
				|  |  | -                    <quote>rejected</quote>, we mean that the user will be sent to the
 | 
	
		
			
				|  |  | -                    <literal>authentication-failure-url</literal> if form-based login is being used.
 | 
	
		
			
				|  |  | -                    If the second authentication takes place through another non-interactive
 | 
	
		
			
				|  |  | +                        <quote>rejected</quote>, we mean that the user will be sent to the
 | 
	
		
			
				|  |  | +                        <literal>authentication-failure-url</literal> if form-based login is being
 | 
	
		
			
				|  |  | +                    used. If the second authentication takes place through another non-interactive
 | 
	
		
			
				|  |  |                      mechanism, such as <quote>remember-me</quote>, an <quote>unauthorized</quote>
 | 
	
		
			
				|  |  |                      (402) error will be sent to the client. If instead you want to use an error
 | 
	
		
			
				|  |  |                      page, you can add the attribute
 | 
	
		
			
				|  |  | -                    <literal>session-authentication-error-url</literal> to the
 | 
	
		
			
				|  |  | -                    <literal>session-management</literal> element. </para>
 | 
	
		
			
				|  |  | +                        <literal>session-authentication-error-url</literal> to the
 | 
	
		
			
				|  |  | +                        <literal>session-management</literal> element. </para>
 | 
	
		
			
				|  |  |                  <para>If you are using a customized authentication filter for form-based login, then
 | 
	
		
			
				|  |  |                      you have to configure concurrent session control support explicitly. More
 | 
	
		
			
				|  |  |                      details can be found in the <link xlink:href="#session-mgmt">Session Management
 | 
	
		
			
				|  |  | -                    chapter</link>. </para>
 | 
	
		
			
				|  |  | +                        chapter</link>. </para>
 | 
	
		
			
				|  |  |              </section>
 | 
	
		
			
				|  |  |              <section xml:id="ns-session-fixation">
 | 
	
		
			
				|  |  |                  <title>Session Fixation Attack Protection</title>
 | 
	
		
			
				|  |  | -                <para> <link xlink:href="http://en.wikipedia.org/wiki/Session_fixation">Session
 | 
	
		
			
				|  |  | -                    fixation</link> attacks are a potential risk where it is possible for a
 | 
	
		
			
				|  |  | +                <para>
 | 
	
		
			
				|  |  | +                    <link xlink:href="http://en.wikipedia.org/wiki/Session_fixation">Session
 | 
	
		
			
				|  |  | +                        fixation</link> attacks are a potential risk where it is possible for a
 | 
	
		
			
				|  |  |                      malicious attacker to create a session by accessing a site, then persuade
 | 
	
		
			
				|  |  |                      another user to log in with the same session (by sending them a link containing
 | 
	
		
			
				|  |  |                      the session identifier as a parameter, for example). Spring Security protects
 | 
	
		
			
				|  |  |                      against this automatically by creating a new session when a user logs in. If you
 | 
	
		
			
				|  |  |                      don't require this protection, or it conflicts with some other requirement, you
 | 
	
		
			
				|  |  |                      can control the behaviour using the
 | 
	
		
			
				|  |  | -                    <literal>session-fixation-protection</literal> attribute on
 | 
	
		
			
				|  |  | -                    <literal><session-management></literal>, which has three options <itemizedlist>
 | 
	
		
			
				|  |  | -                    <listitem>
 | 
	
		
			
				|  |  | -                        <para><literal>migrateSession</literal> - creates a new session and copies
 | 
	
		
			
				|  |  | -                            the existing session attributes to the new session. This is the
 | 
	
		
			
				|  |  | -                            default.</para>
 | 
	
		
			
				|  |  | -                    </listitem>
 | 
	
		
			
				|  |  | -                    <listitem>
 | 
	
		
			
				|  |  | -                        <para><literal>none</literal> - Don't do anything. The original session will
 | 
	
		
			
				|  |  | -                            be retained.</para>
 | 
	
		
			
				|  |  | -                    </listitem>
 | 
	
		
			
				|  |  | -                    <listitem>
 | 
	
		
			
				|  |  | -                        <para><literal>newSession</literal> - Create a new "clean" session, without
 | 
	
		
			
				|  |  | -                            copying the existing session data.</para>
 | 
	
		
			
				|  |  | -                    </listitem>
 | 
	
		
			
				|  |  | +                        <literal>session-fixation-protection</literal> attribute on
 | 
	
		
			
				|  |  | +                        <literal><session-management></literal>, which has three options <itemizedlist>
 | 
	
		
			
				|  |  | +                        <listitem>
 | 
	
		
			
				|  |  | +                            <para><literal>migrateSession</literal> - creates a new session and
 | 
	
		
			
				|  |  | +                                copies the existing session attributes to the new session. This is
 | 
	
		
			
				|  |  | +                                the default.</para>
 | 
	
		
			
				|  |  | +                        </listitem>
 | 
	
		
			
				|  |  | +                        <listitem>
 | 
	
		
			
				|  |  | +                            <para><literal>none</literal> - Don't do anything. The original session
 | 
	
		
			
				|  |  | +                                will be retained.</para>
 | 
	
		
			
				|  |  | +                        </listitem>
 | 
	
		
			
				|  |  | +                        <listitem>
 | 
	
		
			
				|  |  | +                            <para><literal>newSession</literal> - Create a new "clean" session,
 | 
	
		
			
				|  |  | +                                without copying the existing session data.</para>
 | 
	
		
			
				|  |  | +                        </listitem>
 | 
	
		
			
				|  |  |                      </itemizedlist></para>
 | 
	
		
			
				|  |  |              </section>
 | 
	
		
			
				|  |  |          </section>
 | 
	
	
		
			
				|  | @@ -529,23 +539,24 @@
 | 
	
		
			
				|  |  |    </http>
 | 
	
		
			
				|  |  |  ]]></programlisting>You should then register yourself with an OpenID provider (such as
 | 
	
		
			
				|  |  |                  myopenid.com), and add the user information to your in-memory
 | 
	
		
			
				|  |  | -                <literal><user-service></literal> : <programlisting language="xml"><![CDATA[
 | 
	
		
			
				|  |  | +                    <literal><user-service></literal> : <programlisting language="xml"><![CDATA[
 | 
	
		
			
				|  |  |    <user name="http://jimi.hendrix.myopenid.com/" authorities="ROLE_USER" />
 | 
	
		
			
				|  |  |  ]]></programlisting> You should be able to login using the <literal>myopenid.com</literal> site to
 | 
	
		
			
				|  |  |                  authenticate. It is also possible to select a specific
 | 
	
		
			
				|  |  | -                <interfacename>UserDetailsService</interfacename> bean for use OpenID by setting the
 | 
	
		
			
				|  |  | -                <literal>user-service-ref</literal> attribute on the <literal>openid-login</literal>
 | 
	
		
			
				|  |  | -                element. See the previous section on <link xlink:href="#ns-auth-providers"
 | 
	
		
			
				|  |  | -                >authentication providers</link> for more information. Note that we have omitted the
 | 
	
		
			
				|  |  | -                password attribute from the above user configuration, since this set of user data is
 | 
	
		
			
				|  |  | -                only being used to load the authorities for the user. A random password will be
 | 
	
		
			
				|  |  | -                generate internally, preventing you from accidentally using this user data as an
 | 
	
		
			
				|  |  | -                authentication source elsewhere in your configuration.</para>
 | 
	
		
			
				|  |  | +                    <interfacename>UserDetailsService</interfacename> bean for use OpenID by setting
 | 
	
		
			
				|  |  | +                the <literal>user-service-ref</literal> attribute on the
 | 
	
		
			
				|  |  | +                    <literal>openid-login</literal> element. See the previous section on <link
 | 
	
		
			
				|  |  | +                    xlink:href="#ns-auth-providers">authentication providers</link> for more
 | 
	
		
			
				|  |  | +                information. Note that we have omitted the password attribute from the above user
 | 
	
		
			
				|  |  | +                configuration, since this set of user data is only being used to load the
 | 
	
		
			
				|  |  | +                authorities for the user. A random password will be generate internally, preventing
 | 
	
		
			
				|  |  | +                you from accidentally using this user data as an authentication source elsewhere in
 | 
	
		
			
				|  |  | +                your configuration.</para>
 | 
	
		
			
				|  |  |              <section>
 | 
	
		
			
				|  |  |                  <title>Attribute Exchange</title>
 | 
	
		
			
				|  |  |                  <para>Support for OpenID <link
 | 
	
		
			
				|  |  | -                    xlink:href="http://openid.net/specs/openid-attribute-exchange-1_0.html"
 | 
	
		
			
				|  |  | -                    >attribute exchange</link>. As an example, the following configuration would
 | 
	
		
			
				|  |  | +                        xlink:href="http://openid.net/specs/openid-attribute-exchange-1_0.html"
 | 
	
		
			
				|  |  | +                        >attribute exchange</link>. As an example, the following configuration would
 | 
	
		
			
				|  |  |                      attempt to retrieve the email and full name from the OpenID provider, for use by
 | 
	
		
			
				|  |  |                      the application:<programlisting language="xml"><![CDATA[
 | 
	
		
			
				|  |  |   <openid-login>
 | 
	
	
		
			
				|  | @@ -555,26 +566,27 @@
 | 
	
		
			
				|  |  |    </attribute-exchange>
 | 
	
		
			
				|  |  |   </openid-login>]]></programlisting>The <quote>type</quote> of each OpenID attribute is a URI,
 | 
	
		
			
				|  |  |                      determined by a particular schema, in this case <link
 | 
	
		
			
				|  |  | -                    xlink:href="http://axschema.org/">http://axschema.org/</link>. If an attribute
 | 
	
		
			
				|  |  | -                    must be retrieved for successful authentication, the <literal>required</literal>
 | 
	
		
			
				|  |  | -                    attribute can be set. The exact schema and attributes supported will depend on
 | 
	
		
			
				|  |  | -                    your OpenID provider. The attribute values are returned as part of the
 | 
	
		
			
				|  |  | -                    authentication process and can be accessed afterwards using the following code:
 | 
	
		
			
				|  |  | +                        xlink:href="http://axschema.org/">http://axschema.org/</link>. If an
 | 
	
		
			
				|  |  | +                    attribute must be retrieved for successful authentication, the
 | 
	
		
			
				|  |  | +                        <literal>required</literal> attribute can be set. The exact schema and
 | 
	
		
			
				|  |  | +                    attributes supported will depend on your OpenID provider. The attribute values
 | 
	
		
			
				|  |  | +                    are returned as part of the authentication process and can be accessed
 | 
	
		
			
				|  |  | +                    afterwards using the following code:
 | 
	
		
			
				|  |  |                      <programlisting language="java">
 | 
	
		
			
				|  |  |  OpenIDAuthenticationToken token = 
 | 
	
		
			
				|  |  |      (OpenIDAuthenticationToken)SecurityContextHolder.getContext().getAuthentication();
 | 
	
		
			
				|  |  |  List<OpenIDAttribute> attributes = token.getAttributes();</programlisting>The
 | 
	
		
			
				|  |  | -                    <classname>OpenIDAttribute</classname> contains the attribute type and the
 | 
	
		
			
				|  |  | +                        <classname>OpenIDAttribute</classname> contains the attribute type and the
 | 
	
		
			
				|  |  |                      retrieved value (or values in the case of multi-valued attributes). We'll see
 | 
	
		
			
				|  |  |                      more about how the <classname>SecurityContextHolder</classname> class is used
 | 
	
		
			
				|  |  |                      when we look at core Spring Security components in the <link
 | 
	
		
			
				|  |  | -                    xlink:href="core-components">technical overview</link> chapter. Multiple
 | 
	
		
			
				|  |  | +                        xlink:href="core-components">technical overview</link> chapter. Multiple
 | 
	
		
			
				|  |  |                      attribute exchange configurations are also be supported, if you wish to use
 | 
	
		
			
				|  |  |                      multiple identity providers. You can supply multiple
 | 
	
		
			
				|  |  | -                    <literal>attribute-exchange</literal> elements, using an
 | 
	
		
			
				|  |  | -                    <literal>identifier-matcher</literal> attribute on each. This contains a regular
 | 
	
		
			
				|  |  | -                    expression which will be matched against the OpenID identifier supplied by the
 | 
	
		
			
				|  |  | -                    user. See the OpenID sample application in the codebase for an example
 | 
	
		
			
				|  |  | +                        <literal>attribute-exchange</literal> elements, using an
 | 
	
		
			
				|  |  | +                        <literal>identifier-matcher</literal> attribute on each. This contains a
 | 
	
		
			
				|  |  | +                    regular expression which will be matched against the OpenID identifier supplied
 | 
	
		
			
				|  |  | +                    by the user. See the OpenID sample application in the codebase for an example
 | 
	
		
			
				|  |  |                      configuration, providing different attribute lists for the Google, Yahoo and
 | 
	
		
			
				|  |  |                      MyOpenID providers.</para>
 | 
	
		
			
				|  |  |              </section>
 | 
	
	
		
			
				|  | @@ -587,122 +599,123 @@ List<OpenIDAttribute> attributes = token.getAttributes();</programlisting>The
 | 
	
		
			
				|  |  |                  which there isn't currently a namespace configuration option (CAS, for example). Or
 | 
	
		
			
				|  |  |                  you might want to use a customized version of a standard namespace filter, such as
 | 
	
		
			
				|  |  |                  the <literal>UsernamePasswordAuthenticationFilter</literal> which is created by the
 | 
	
		
			
				|  |  | -                <literal><form-login></literal> element, taking advantage of some of the extra
 | 
	
		
			
				|  |  | -                configuration options which are available by using the bean explicitly. How can you
 | 
	
		
			
				|  |  | -                do this with namespace configuration, since the filter chain is not directly
 | 
	
		
			
				|  |  | +                    <literal><form-login></literal> element, taking advantage of some of the
 | 
	
		
			
				|  |  | +                extra configuration options which are available by using the bean explicitly. How
 | 
	
		
			
				|  |  | +                can you do this with namespace configuration, since the filter chain is not directly
 | 
	
		
			
				|  |  |                  exposed? </para>
 | 
	
		
			
				|  |  |              <para>The order of the filters is always strictly enforced when using the namespace.
 | 
	
		
			
				|  |  |                  When the application context is being created, the filter beans are sorted by the
 | 
	
		
			
				|  |  |                  namespace handling code and the standard Spring Security filters each have an alias
 | 
	
		
			
				|  |  |                  in the namespace and a well-known position.<note>
 | 
	
		
			
				|  |  | -                <para>In previous versions, the sorting took place after the filter instances had
 | 
	
		
			
				|  |  | -                    been created, during post-processing of the application context. In version 3.0+
 | 
	
		
			
				|  |  | -                    the sorting is now done at the bean metadata level, before the classes have been
 | 
	
		
			
				|  |  | -                    instantiated. This has implications for how you add your own filters to the
 | 
	
		
			
				|  |  | -                    stack as the entire filter list must be known during the parsing of the
 | 
	
		
			
				|  |  | -                    <literal><http></literal> element, so the syntax has changed slightly in
 | 
	
		
			
				|  |  | -                    3.0.</para>
 | 
	
		
			
				|  |  | +                    <para>In previous versions, the sorting took place after the filter instances
 | 
	
		
			
				|  |  | +                        had been created, during post-processing of the application context. In
 | 
	
		
			
				|  |  | +                        version 3.0+ the sorting is now done at the bean metadata level, before the
 | 
	
		
			
				|  |  | +                        classes have been instantiated. This has implications for how you add your
 | 
	
		
			
				|  |  | +                        own filters to the stack as the entire filter list must be known during the
 | 
	
		
			
				|  |  | +                        parsing of the <literal><http></literal> element, so the syntax has
 | 
	
		
			
				|  |  | +                        changed slightly in 3.0.</para>
 | 
	
		
			
				|  |  |                  </note>The filters, aliases and namespace elements/attributes which create the
 | 
	
		
			
				|  |  |                  filters are shown in <xref linkend="filter-stack"/>. The filters are listed in the
 | 
	
		
			
				|  |  |                  order in which they occur in the filter chain. <table xml:id="filter-stack">
 | 
	
		
			
				|  |  | -                <title>Standard Filter Aliases and Ordering</title>
 | 
	
		
			
				|  |  | -                <tgroup cols="3" align="left">
 | 
	
		
			
				|  |  | -                    <colspec colnum="1" colname="col1" colwidth="2*"/>
 | 
	
		
			
				|  |  | -                    <colspec colnum="2" colname="col2" colwidth="2*"/>
 | 
	
		
			
				|  |  | -                    <colspec colnum="3" colname="col3" colwidth="1*"/>
 | 
	
		
			
				|  |  | -                    <thead>
 | 
	
		
			
				|  |  | -                        <row>
 | 
	
		
			
				|  |  | -                            <entry align="center">Alias</entry>
 | 
	
		
			
				|  |  | -                            <entry align="center">Filter Class</entry>
 | 
	
		
			
				|  |  | -                            <entry align="center">Namespace Element or Attribute</entry>
 | 
	
		
			
				|  |  | -                        </row>
 | 
	
		
			
				|  |  | -                    </thead>
 | 
	
		
			
				|  |  | -                    <tbody>
 | 
	
		
			
				|  |  | -                        <row>
 | 
	
		
			
				|  |  | -                            <entry> CHANNEL_FILTER</entry>
 | 
	
		
			
				|  |  | -                            <entry><literal>ChannelProcessingFilter</literal></entry>
 | 
	
		
			
				|  |  | -                            <entry><literal>http/intercept-url@requires-channel</literal></entry>
 | 
	
		
			
				|  |  | -                        </row>
 | 
	
		
			
				|  |  | -                        <row>
 | 
	
		
			
				|  |  | -                            <entry> CONCURRENT_SESSION_FILTER</entry>
 | 
	
		
			
				|  |  | -                            <entry><literal>ConcurrentSessionFilter</literal> </entry>
 | 
	
		
			
				|  |  | -                            <entry><literal>session-management/concurrency-control</literal></entry>
 | 
	
		
			
				|  |  | -                        </row>
 | 
	
		
			
				|  |  | -                        <row>
 | 
	
		
			
				|  |  | -                            <entry> SECURITY_CONTEXT_FILTER</entry>
 | 
	
		
			
				|  |  | -                            <entry><classname>SecurityContextPersistenceFilter</classname></entry>
 | 
	
		
			
				|  |  | -                            <entry><literal>http</literal></entry>
 | 
	
		
			
				|  |  | -                        </row>
 | 
	
		
			
				|  |  | -                        <row>
 | 
	
		
			
				|  |  | -                            <entry> LOGOUT_FILTER </entry>
 | 
	
		
			
				|  |  | -                            <entry><literal>LogoutFilter</literal></entry>
 | 
	
		
			
				|  |  | -                            <entry><literal>http/logout</literal></entry>
 | 
	
		
			
				|  |  | -                        </row>
 | 
	
		
			
				|  |  | -                        <row>
 | 
	
		
			
				|  |  | -                            <entry> X509_FILTER </entry>
 | 
	
		
			
				|  |  | -                            <entry><literal>X509AuthenticationFilter</literal></entry>
 | 
	
		
			
				|  |  | -                            <entry><literal>http/x509</literal></entry>
 | 
	
		
			
				|  |  | -                        </row>
 | 
	
		
			
				|  |  | -                        <row>
 | 
	
		
			
				|  |  | -                            <entry> PRE_AUTH_FILTER </entry>
 | 
	
		
			
				|  |  | -                            <entry><literal>AstractPreAuthenticatedProcessingFilter</literal>
 | 
	
		
			
				|  |  | -                                Subclasses</entry>
 | 
	
		
			
				|  |  | -                            <entry>N/A</entry>
 | 
	
		
			
				|  |  | -                        </row>
 | 
	
		
			
				|  |  | -                        <row>
 | 
	
		
			
				|  |  | -                            <entry> CAS_FILTER </entry>
 | 
	
		
			
				|  |  | -                            <entry><literal>CasAuthenticationFilter</literal></entry>
 | 
	
		
			
				|  |  | -                            <entry>N/A</entry>
 | 
	
		
			
				|  |  | -                        </row>
 | 
	
		
			
				|  |  | -                        <row>
 | 
	
		
			
				|  |  | -                            <entry> FORM_LOGIN_FILTER </entry>
 | 
	
		
			
				|  |  | -                            <entry><literal>UsernamePasswordAuthenticationFilter</literal></entry>
 | 
	
		
			
				|  |  | -                            <entry><literal>http/form-login</literal></entry>
 | 
	
		
			
				|  |  | -                        </row>
 | 
	
		
			
				|  |  | -                        <row>
 | 
	
		
			
				|  |  | -                            <entry> BASIC_AUTH_FILTER </entry>
 | 
	
		
			
				|  |  | -                            <entry><literal>BasicAuthenticationFilter</literal></entry>
 | 
	
		
			
				|  |  | -                            <entry><literal>http/http-basic</literal></entry>
 | 
	
		
			
				|  |  | -                        </row>
 | 
	
		
			
				|  |  | -                        <row>
 | 
	
		
			
				|  |  | -                            <entry> SERVLET_API_SUPPORT_FILTER</entry>
 | 
	
		
			
				|  |  | -                            <entry><literal>SecurityContextHolderAwareFilter</literal></entry>
 | 
	
		
			
				|  |  | -                            <entry><literal>http/@servlet-api-provision</literal></entry>
 | 
	
		
			
				|  |  | -                        </row>
 | 
	
		
			
				|  |  | -                        <row>
 | 
	
		
			
				|  |  | -                            <entry> REMEMBER_ME_FILTER </entry>
 | 
	
		
			
				|  |  | -                            <entry><classname>RememberMeAuthenticationFilter</classname></entry>
 | 
	
		
			
				|  |  | -                            <entry><literal>http/remember-me</literal></entry>
 | 
	
		
			
				|  |  | -                        </row>
 | 
	
		
			
				|  |  | -                        <row>
 | 
	
		
			
				|  |  | -                            <entry> ANONYMOUS_FILTER </entry>
 | 
	
		
			
				|  |  | -                            <entry><literal>AnonymousAuthenticationFilter</literal></entry>
 | 
	
		
			
				|  |  | -                            <entry><literal>http/anonymous</literal></entry>
 | 
	
		
			
				|  |  | -                        </row>
 | 
	
		
			
				|  |  | -                        <row>
 | 
	
		
			
				|  |  | -                            <entry> SESSION_MANAGEMENT_FILTER</entry>
 | 
	
		
			
				|  |  | -                            <entry><literal>SessionManagementFilter</literal></entry>
 | 
	
		
			
				|  |  | -                            <entry><literal>session-management</literal></entry>
 | 
	
		
			
				|  |  | -                        </row>
 | 
	
		
			
				|  |  | -                        <row>
 | 
	
		
			
				|  |  | -                            <entry>EXCEPTION_TRANSLATION_FILTER </entry>
 | 
	
		
			
				|  |  | -                            <entry><classname>ExceptionTranslationFilter</classname></entry>
 | 
	
		
			
				|  |  | -                            <entry><literal>http</literal></entry>
 | 
	
		
			
				|  |  | -                        </row>
 | 
	
		
			
				|  |  | -                        <row>
 | 
	
		
			
				|  |  | -                            <entry> FILTER_SECURITY_INTERCEPTOR </entry>
 | 
	
		
			
				|  |  | -                            <entry><classname>FilterSecurityInterceptor</classname></entry>
 | 
	
		
			
				|  |  | -                            <entry><literal>http</literal></entry>
 | 
	
		
			
				|  |  | -                        </row>
 | 
	
		
			
				|  |  | -                        <row>
 | 
	
		
			
				|  |  | -                            <entry> SWITCH_USER_FILTER </entry>
 | 
	
		
			
				|  |  | -                            <entry><literal>SwitchUserFilter</literal></entry>
 | 
	
		
			
				|  |  | -                            <entry>N/A</entry>
 | 
	
		
			
				|  |  | -                        </row>
 | 
	
		
			
				|  |  | -                    </tbody>
 | 
	
		
			
				|  |  | -                </tgroup>
 | 
	
		
			
				|  |  | +                    <title>Standard Filter Aliases and Ordering</title>
 | 
	
		
			
				|  |  | +                    <tgroup cols="3" align="left">
 | 
	
		
			
				|  |  | +                        <colspec colnum="1" colname="col1" colwidth="2*"/>
 | 
	
		
			
				|  |  | +                        <colspec colnum="2" colname="col2" colwidth="2*"/>
 | 
	
		
			
				|  |  | +                        <colspec colnum="3" colname="col3" colwidth="1*"/>
 | 
	
		
			
				|  |  | +                        <thead>
 | 
	
		
			
				|  |  | +                            <row>
 | 
	
		
			
				|  |  | +                                <entry align="center">Alias</entry>
 | 
	
		
			
				|  |  | +                                <entry align="center">Filter Class</entry>
 | 
	
		
			
				|  |  | +                                <entry align="center">Namespace Element or Attribute</entry>
 | 
	
		
			
				|  |  | +                            </row>
 | 
	
		
			
				|  |  | +                        </thead>
 | 
	
		
			
				|  |  | +                        <tbody>
 | 
	
		
			
				|  |  | +                            <row>
 | 
	
		
			
				|  |  | +                                <entry> CHANNEL_FILTER</entry>
 | 
	
		
			
				|  |  | +                                <entry><literal>ChannelProcessingFilter</literal></entry>
 | 
	
		
			
				|  |  | +                                <entry><literal>http/intercept-url@requires-channel</literal></entry>
 | 
	
		
			
				|  |  | +                            </row>
 | 
	
		
			
				|  |  | +                            <row>
 | 
	
		
			
				|  |  | +                                <entry> CONCURRENT_SESSION_FILTER</entry>
 | 
	
		
			
				|  |  | +                                <entry><literal>ConcurrentSessionFilter</literal>
 | 
	
		
			
				|  |  | +                                </entry>
 | 
	
		
			
				|  |  | +                                <entry><literal>session-management/concurrency-control</literal></entry>
 | 
	
		
			
				|  |  | +                            </row>
 | 
	
		
			
				|  |  | +                            <row>
 | 
	
		
			
				|  |  | +                                <entry> SECURITY_CONTEXT_FILTER</entry>
 | 
	
		
			
				|  |  | +                                <entry><classname>SecurityContextPersistenceFilter</classname></entry>
 | 
	
		
			
				|  |  | +                                <entry><literal>http</literal></entry>
 | 
	
		
			
				|  |  | +                            </row>
 | 
	
		
			
				|  |  | +                            <row>
 | 
	
		
			
				|  |  | +                                <entry> LOGOUT_FILTER </entry>
 | 
	
		
			
				|  |  | +                                <entry><literal>LogoutFilter</literal></entry>
 | 
	
		
			
				|  |  | +                                <entry><literal>http/logout</literal></entry>
 | 
	
		
			
				|  |  | +                            </row>
 | 
	
		
			
				|  |  | +                            <row>
 | 
	
		
			
				|  |  | +                                <entry> X509_FILTER </entry>
 | 
	
		
			
				|  |  | +                                <entry><literal>X509AuthenticationFilter</literal></entry>
 | 
	
		
			
				|  |  | +                                <entry><literal>http/x509</literal></entry>
 | 
	
		
			
				|  |  | +                            </row>
 | 
	
		
			
				|  |  | +                            <row>
 | 
	
		
			
				|  |  | +                                <entry> PRE_AUTH_FILTER </entry>
 | 
	
		
			
				|  |  | +                                <entry><literal>AstractPreAuthenticatedProcessingFilter</literal>
 | 
	
		
			
				|  |  | +                                    Subclasses</entry>
 | 
	
		
			
				|  |  | +                                <entry>N/A</entry>
 | 
	
		
			
				|  |  | +                            </row>
 | 
	
		
			
				|  |  | +                            <row>
 | 
	
		
			
				|  |  | +                                <entry> CAS_FILTER </entry>
 | 
	
		
			
				|  |  | +                                <entry><literal>CasAuthenticationFilter</literal></entry>
 | 
	
		
			
				|  |  | +                                <entry>N/A</entry>
 | 
	
		
			
				|  |  | +                            </row>
 | 
	
		
			
				|  |  | +                            <row>
 | 
	
		
			
				|  |  | +                                <entry> FORM_LOGIN_FILTER </entry>
 | 
	
		
			
				|  |  | +                                <entry><literal>UsernamePasswordAuthenticationFilter</literal></entry>
 | 
	
		
			
				|  |  | +                                <entry><literal>http/form-login</literal></entry>
 | 
	
		
			
				|  |  | +                            </row>
 | 
	
		
			
				|  |  | +                            <row>
 | 
	
		
			
				|  |  | +                                <entry> BASIC_AUTH_FILTER </entry>
 | 
	
		
			
				|  |  | +                                <entry><literal>BasicAuthenticationFilter</literal></entry>
 | 
	
		
			
				|  |  | +                                <entry><literal>http/http-basic</literal></entry>
 | 
	
		
			
				|  |  | +                            </row>
 | 
	
		
			
				|  |  | +                            <row>
 | 
	
		
			
				|  |  | +                                <entry> SERVLET_API_SUPPORT_FILTER</entry>
 | 
	
		
			
				|  |  | +                                <entry><literal>SecurityContextHolderAwareFilter</literal></entry>
 | 
	
		
			
				|  |  | +                                <entry><literal>http/@servlet-api-provision</literal></entry>
 | 
	
		
			
				|  |  | +                            </row>
 | 
	
		
			
				|  |  | +                            <row>
 | 
	
		
			
				|  |  | +                                <entry> REMEMBER_ME_FILTER </entry>
 | 
	
		
			
				|  |  | +                                <entry><classname>RememberMeAuthenticationFilter</classname></entry>
 | 
	
		
			
				|  |  | +                                <entry><literal>http/remember-me</literal></entry>
 | 
	
		
			
				|  |  | +                            </row>
 | 
	
		
			
				|  |  | +                            <row>
 | 
	
		
			
				|  |  | +                                <entry> ANONYMOUS_FILTER </entry>
 | 
	
		
			
				|  |  | +                                <entry><literal>AnonymousAuthenticationFilter</literal></entry>
 | 
	
		
			
				|  |  | +                                <entry><literal>http/anonymous</literal></entry>
 | 
	
		
			
				|  |  | +                            </row>
 | 
	
		
			
				|  |  | +                            <row>
 | 
	
		
			
				|  |  | +                                <entry> SESSION_MANAGEMENT_FILTER</entry>
 | 
	
		
			
				|  |  | +                                <entry><literal>SessionManagementFilter</literal></entry>
 | 
	
		
			
				|  |  | +                                <entry><literal>session-management</literal></entry>
 | 
	
		
			
				|  |  | +                            </row>
 | 
	
		
			
				|  |  | +                            <row>
 | 
	
		
			
				|  |  | +                                <entry>EXCEPTION_TRANSLATION_FILTER </entry>
 | 
	
		
			
				|  |  | +                                <entry><classname>ExceptionTranslationFilter</classname></entry>
 | 
	
		
			
				|  |  | +                                <entry><literal>http</literal></entry>
 | 
	
		
			
				|  |  | +                            </row>
 | 
	
		
			
				|  |  | +                            <row>
 | 
	
		
			
				|  |  | +                                <entry> FILTER_SECURITY_INTERCEPTOR </entry>
 | 
	
		
			
				|  |  | +                                <entry><classname>FilterSecurityInterceptor</classname></entry>
 | 
	
		
			
				|  |  | +                                <entry><literal>http</literal></entry>
 | 
	
		
			
				|  |  | +                            </row>
 | 
	
		
			
				|  |  | +                            <row>
 | 
	
		
			
				|  |  | +                                <entry> SWITCH_USER_FILTER </entry>
 | 
	
		
			
				|  |  | +                                <entry><literal>SwitchUserFilter</literal></entry>
 | 
	
		
			
				|  |  | +                                <entry>N/A</entry>
 | 
	
		
			
				|  |  | +                            </row>
 | 
	
		
			
				|  |  | +                        </tbody>
 | 
	
		
			
				|  |  | +                    </tgroup>
 | 
	
		
			
				|  |  |                  </table> You can add your own filter to the stack, using the
 | 
	
		
			
				|  |  | -                <literal>custom-filter</literal> element and one of these names to specify the
 | 
	
		
			
				|  |  | +                    <literal>custom-filter</literal> element and one of these names to specify the
 | 
	
		
			
				|  |  |                  position your filter should appear at: <programlisting language="xml"><![CDATA[
 | 
	
		
			
				|  |  |    <http>
 | 
	
		
			
				|  |  |       <custom-filter position="FORM_LOGIN_FILTER" ref="myFilter" />
 | 
	
	
		
			
				|  | @@ -713,20 +726,20 @@ List<OpenIDAttribute> attributes = token.getAttributes();</programlisting>The
 | 
	
		
			
				|  |  |    </programlisting> You can also use the <literal>after</literal> or <literal>before</literal>
 | 
	
		
			
				|  |  |                  attributes if you want your filter to be inserted before or after another filter in
 | 
	
		
			
				|  |  |                  the stack. The names "FIRST" and "LAST" can be used with the
 | 
	
		
			
				|  |  | -                <literal>position</literal> attribute to indicate that you want your filter to
 | 
	
		
			
				|  |  | +                    <literal>position</literal> attribute to indicate that you want your filter to
 | 
	
		
			
				|  |  |                  appear before or after the entire stack, respectively. </para>
 | 
	
		
			
				|  |  |              <tip>
 | 
	
		
			
				|  |  |                  <title>Avoiding filter position conflicts</title>
 | 
	
		
			
				|  |  |                  <para> If you are inserting a custom filter which may occupy the same position as
 | 
	
		
			
				|  |  |                      one of the standard filters created by the namespace then it's important that
 | 
	
		
			
				|  |  |                      you don't include the namespace versions by mistake. Avoid using the
 | 
	
		
			
				|  |  | -                    <literal>auto-config</literal> attribute and remove any elements which create
 | 
	
		
			
				|  |  | -                    filters whose functionality you want to replace. </para>
 | 
	
		
			
				|  |  | +                        <literal>auto-config</literal> attribute and remove any elements which
 | 
	
		
			
				|  |  | +                    create filters whose functionality you want to replace. </para>
 | 
	
		
			
				|  |  |                  <para> Note that you can't replace filters which are created by the use of the
 | 
	
		
			
				|  |  | -                    <literal><http></literal> element itself -
 | 
	
		
			
				|  |  | -                    <classname>SecurityContextPersistenceFilter</classname>,
 | 
	
		
			
				|  |  | -                    <classname>ExceptionTranslationFilter</classname> or
 | 
	
		
			
				|  |  | -                    <classname>FilterSecurityInterceptor</classname>. </para>
 | 
	
		
			
				|  |  | +                        <literal><http></literal> element itself -
 | 
	
		
			
				|  |  | +                        <classname>SecurityContextPersistenceFilter</classname>,
 | 
	
		
			
				|  |  | +                        <classname>ExceptionTranslationFilter</classname> or
 | 
	
		
			
				|  |  | +                        <classname>FilterSecurityInterceptor</classname>. </para>
 | 
	
		
			
				|  |  |              </tip>
 | 
	
		
			
				|  |  |              <para> If you're replacing a namespace filter which requires an authentication entry
 | 
	
		
			
				|  |  |                  point (i.e. where the authentication process is triggered by an attempt by an
 | 
	
	
		
			
				|  | @@ -740,11 +753,11 @@ List<OpenIDAttribute> attributes = token.getAttributes();</programlisting>The
 | 
	
		
			
				|  |  |                      a traditional bean syntax and link them into the namespace, as we've just seen.
 | 
	
		
			
				|  |  |                      The corresponding <interfacename>AuthenticationEntryPoint</interfacename> can be
 | 
	
		
			
				|  |  |                      set using the <literal>entry-point-ref</literal> attribute on the
 | 
	
		
			
				|  |  | -                    <literal><http></literal> element. </para>
 | 
	
		
			
				|  |  | +                        <literal><http></literal> element. </para>
 | 
	
		
			
				|  |  |                  <para> The CAS sample application is a good example of the use of custom beans with
 | 
	
		
			
				|  |  |                      the namespace, including this syntax. If you aren't familiar with authentication
 | 
	
		
			
				|  |  |                      entry points, they are discussed in the <link
 | 
	
		
			
				|  |  | -                    xlink:href="#tech-intro-auth-entry-point">technical overview</link> chapter.
 | 
	
		
			
				|  |  | +                        xlink:href="#tech-intro-auth-entry-point">technical overview</link> chapter.
 | 
	
		
			
				|  |  |                  </para>
 | 
	
		
			
				|  |  |              </section>
 | 
	
		
			
				|  |  |          </section>
 | 
	
	
		
			
				|  | @@ -755,9 +768,9 @@ List<OpenIDAttribute> attributes = token.getAttributes();</programlisting>The
 | 
	
		
			
				|  |  |              security to your service layer methods. It provides support for JSR-250 annotation
 | 
	
		
			
				|  |  |              security as well as the framework's original <literal>@Secured</literal> annotation.
 | 
	
		
			
				|  |  |              From 3.0 you can also make use of new <link xlink:href="el-access">expression-based
 | 
	
		
			
				|  |  | -            annotations</link>. You can apply security to a single bean, using the
 | 
	
		
			
				|  |  | -            <literal>intercept-methods</literal> element to decorate the bean declaration, or you
 | 
	
		
			
				|  |  | -            can secure multiple beans across the entire service layer using the AspectJ style
 | 
	
		
			
				|  |  | +                annotations</link>. You can apply security to a single bean, using the
 | 
	
		
			
				|  |  | +                <literal>intercept-methods</literal> element to decorate the bean declaration, or
 | 
	
		
			
				|  |  | +            you can secure multiple beans across the entire service layer using the AspectJ style
 | 
	
		
			
				|  |  |              pointcuts. </para>
 | 
	
		
			
				|  |  |          <section xml:id="ns-global-method">
 | 
	
		
			
				|  |  |              <title>The <literal><global-method-security></literal> Element</title>
 | 
	
	
		
			
				|  | @@ -765,14 +778,14 @@ List<OpenIDAttribute> attributes = token.getAttributes();</programlisting>The
 | 
	
		
			
				|  |  |                  setting the appropriate attributes on the element), and also to group together
 | 
	
		
			
				|  |  |                  security pointcut declarations which will be applied across your entire application
 | 
	
		
			
				|  |  |                  context. You should only declare one
 | 
	
		
			
				|  |  | -                <literal><global-method-security></literal> element. The following declaration
 | 
	
		
			
				|  |  | -                would enable support for Spring Security's <literal>@Secured</literal>: <programlisting><![CDATA[
 | 
	
		
			
				|  |  | +                    <literal><global-method-security></literal> element. The following
 | 
	
		
			
				|  |  | +                declaration would enable support for Spring Security's <literal>@Secured</literal>: <programlisting><![CDATA[
 | 
	
		
			
				|  |  |    <global-method-security secured-annotations="enabled" />
 | 
	
		
			
				|  |  |    ]]>
 | 
	
		
			
				|  |  |  </programlisting> Adding an annotation to a method (on an class or interface) would then limit
 | 
	
		
			
				|  |  |                  the access to that method accordingly. Spring Security's native annotation support
 | 
	
		
			
				|  |  |                  defines a set of attributes for the method. These will be passed to the
 | 
	
		
			
				|  |  | -                <interfacename>AccessDecisionManager</interfacename> for it to make the actual
 | 
	
		
			
				|  |  | +                    <interfacename>AccessDecisionManager</interfacename> for it to make the actual
 | 
	
		
			
				|  |  |                  decision:
 | 
	
		
			
				|  |  |                  <programlisting language="java">
 | 
	
		
			
				|  |  |    public interface BankService {
 | 
	
	
		
			
				|  | @@ -825,8 +838,8 @@ List<OpenIDAttribute> attributes = token.getAttributes();</programlisting>The
 | 
	
		
			
				|  |  |            </programlisting> This will protect all methods on beans declared in the application
 | 
	
		
			
				|  |  |                      context whose classes are in the <literal>com.mycompany</literal> package and
 | 
	
		
			
				|  |  |                      whose class names end in "Service". Only users with the
 | 
	
		
			
				|  |  | -                    <literal>ROLE_USER</literal> role will be able to invoke these methods. As with
 | 
	
		
			
				|  |  | -                    URL matching, the most specific matches must come first in the list of
 | 
	
		
			
				|  |  | +                        <literal>ROLE_USER</literal> role will be able to invoke these methods. As
 | 
	
		
			
				|  |  | +                    with URL matching, the most specific matches must come first in the list of
 | 
	
		
			
				|  |  |                      pointcuts, as the first matching expression will be used. </para>
 | 
	
		
			
				|  |  |              </section>
 | 
	
		
			
				|  |  |          </section>
 | 
	
	
		
			
				|  | @@ -838,24 +851,24 @@ List<OpenIDAttribute> attributes = token.getAttributes();</programlisting>The
 | 
	
		
			
				|  |  |              later, as this section is only really relevant for people who need to do some
 | 
	
		
			
				|  |  |              customization in order to use more than simple role-based security. </para>
 | 
	
		
			
				|  |  |          <para> When you use a namespace configuration, a default instance of
 | 
	
		
			
				|  |  | -            <interfacename>AccessDecisionManager</interfacename> is automatically registered for you
 | 
	
		
			
				|  |  | -            and will be used for making access decisions for method invocations and web URL access,
 | 
	
		
			
				|  |  | -            based on the access attributes you specify in your <literal>intercept-url</literal> and
 | 
	
		
			
				|  |  | -            <literal>protect-pointcut</literal> declarations (and in annotations if you are using
 | 
	
		
			
				|  |  | -            annotation secured methods). </para>
 | 
	
		
			
				|  |  | +                <interfacename>AccessDecisionManager</interfacename> is automatically registered for
 | 
	
		
			
				|  |  | +            you and will be used for making access decisions for method invocations and web URL
 | 
	
		
			
				|  |  | +            access, based on the access attributes you specify in your
 | 
	
		
			
				|  |  | +                <literal>intercept-url</literal> and <literal>protect-pointcut</literal>
 | 
	
		
			
				|  |  | +            declarations (and in annotations if you are using annotation secured methods). </para>
 | 
	
		
			
				|  |  |          <para> The default strategy is to use an <classname>AffirmativeBased</classname>
 | 
	
		
			
				|  |  |              <interfacename>AccessDecisionManager</interfacename> with a
 | 
	
		
			
				|  |  | -            <classname>RoleVoter</classname> and an <classname>AuthenticatedVoter</classname>. You
 | 
	
		
			
				|  |  | -            can find out more about these in the chapter on <link xlink:href="authorization"
 | 
	
		
			
				|  |  | -            >authorization</link>.</para>
 | 
	
		
			
				|  |  | +                <classname>RoleVoter</classname> and an <classname>AuthenticatedVoter</classname>.
 | 
	
		
			
				|  |  | +            You can find out more about these in the chapter on <link xlink:href="authorization"
 | 
	
		
			
				|  |  | +                >authorization</link>.</para>
 | 
	
		
			
				|  |  |          <section xml:id="ns-custom-access-mgr">
 | 
	
		
			
				|  |  |              <title>Customizing the AccessDecisionManager</title>
 | 
	
		
			
				|  |  |              <para> If you need to use a more complicated access control strategy then it is easy to
 | 
	
		
			
				|  |  |                  set an alternative for both method and web security. </para>
 | 
	
		
			
				|  |  |              <para> For method security, you do this by setting the
 | 
	
		
			
				|  |  | -                <literal>access-decision-manager-ref</literal> attribute on
 | 
	
		
			
				|  |  | -                <literal>global-method-security</literal> to the Id of the appropriate
 | 
	
		
			
				|  |  | -                <interfacename>AccessDecisionManager</interfacename> bean in the application
 | 
	
		
			
				|  |  | +                    <literal>access-decision-manager-ref</literal> attribute on
 | 
	
		
			
				|  |  | +                    <literal>global-method-security</literal> to the Id of the appropriate
 | 
	
		
			
				|  |  | +                    <interfacename>AccessDecisionManager</interfacename> bean in the application
 | 
	
		
			
				|  |  |                  context: <programlisting language="xml"><![CDATA[
 | 
	
		
			
				|  |  |    <global-method-security access-decision-manager-ref="myAccessDecisionManagerBean">
 | 
	
		
			
				|  |  |      ...
 | 
	
	
		
			
				|  | @@ -872,7 +885,7 @@ List<OpenIDAttribute> attributes = token.getAttributes();</programlisting>The
 | 
	
		
			
				|  |  |      <section xml:id="ns-auth-manager">
 | 
	
		
			
				|  |  |          <title>The Authentication Manager and the Namespace</title>
 | 
	
		
			
				|  |  |          <para> The main interface which provides authentication services in Spring Security is the
 | 
	
		
			
				|  |  | -            <interfacename>AuthenticationManager</interfacename>. This is usually an instance of
 | 
	
		
			
				|  |  | +                <interfacename>AuthenticationManager</interfacename>. This is usually an instance of
 | 
	
		
			
				|  |  |              Spring Security's <classname>ProviderManager</classname> class, which you may already be
 | 
	
		
			
				|  |  |              familiar with if you've used the framework before. If not, it will be covered later, in
 | 
	
		
			
				|  |  |              the <link xlink:href="#tech-intro-authentication">technical overview chapter</link>. The
 | 
	
	
		
			
				|  | @@ -880,12 +893,12 @@ List<OpenIDAttribute> attributes = token.getAttributes();</programlisting>The
 | 
	
		
			
				|  |  |              namespace element. You can't use a custom <classname>AuthenticationManager</classname>
 | 
	
		
			
				|  |  |              if you are using either HTTP or method security through the namespace, but this should
 | 
	
		
			
				|  |  |              not be a problem as you have full control over the
 | 
	
		
			
				|  |  | -            <classname>AuthenticationProvider</classname>s that are used.</para>
 | 
	
		
			
				|  |  | +                <classname>AuthenticationProvider</classname>s that are used.</para>
 | 
	
		
			
				|  |  |          <para> You may want to register additional <classname>AuthenticationProvider</classname>
 | 
	
		
			
				|  |  |              beans with the <classname>ProviderManager</classname> and you can do this using the
 | 
	
		
			
				|  |  | -            <literal><authentication-provider></literal> element with the
 | 
	
		
			
				|  |  | -            <literal>ref</literal> attribute, where the value of the attribute is the name of the
 | 
	
		
			
				|  |  | -            provider bean you want to add. For example: <programlisting language="xml"><![CDATA[
 | 
	
		
			
				|  |  | +                <literal><authentication-provider></literal> element with the
 | 
	
		
			
				|  |  | +                <literal>ref</literal> attribute, where the value of the attribute is the name of
 | 
	
		
			
				|  |  | +            the provider bean you want to add. For example: <programlisting language="xml"><![CDATA[
 | 
	
		
			
				|  |  |    <authentication-manager>
 | 
	
		
			
				|  |  |      <authentication-provider ref="casAuthenticationProvider"/>
 | 
	
		
			
				|  |  |    </authentication-manager>
 |