Removing $Id$ markers and stripping trailing whitespace from the codebase.
This commit is contained in:
@@ -167,7 +167,7 @@
|
||||
DEBUG [ExceptionTranslationFilter] - Access is denied (user is anonymous); redirecting to authentication entry point
|
||||
org.springframework.security.AccessDeniedException: Access is denied
|
||||
at org.springframework.security.vote.AffirmativeBased.decide(AffirmativeBased.java:68)
|
||||
at org.springframework.security.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:262)
|
||||
at org.springframework.security.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:262)
|
||||
</programlisting>
|
||||
It is normal and shouldn't be anything to worry about. </para></answer>
|
||||
</qandaentry>
|
||||
@@ -225,10 +225,10 @@
|
||||
<answer><para>Make sure you have added the listener to your web.xml file. It is
|
||||
essential to make sure that the Spring Security session registry is notified
|
||||
when a session is destroyed. Without it, the session information will not be
|
||||
removed from the registry.</para><programlisting><![CDATA[
|
||||
removed from the registry.</para><programlisting><![CDATA[
|
||||
<listener>
|
||||
<listener-class>org.springframework.security.ui.session.HttpSessionEventPublisher</listener-class>
|
||||
</listener> ]]>
|
||||
</listener> ]]>
|
||||
</programlisting></answer>
|
||||
</qandaentry>
|
||||
<qandaentry xml:id="faq-no-filters-no-context">
|
||||
@@ -288,20 +288,20 @@
|
||||
<answer>
|
||||
<para>Spring Security has a voter-based architecture which means that an access
|
||||
decision is made by a series of <interfacename>AccessDecisionVoter</interfacename>s.
|
||||
The voters act on the <quote>configuration attributes</quote> which are specified for a
|
||||
The voters act on the <quote>configuration attributes</quote> which are specified for a
|
||||
secured resource (such as a method invocation). With this approach, not all attributes may
|
||||
be relevant to all voters and a voter needs to know when it should ignore an attribute (abstain) and
|
||||
when it should vote to grant or deny access based on the attribute value.
|
||||
when it should vote to grant or deny access based on the attribute value.
|
||||
The most common voter is the <classname>RoleVoter</classname> which by default votes
|
||||
whenever it finds an attribute with the <quote>ROLE_</quote> prefix. It makes a simple comparison
|
||||
of the attribute (such as <quote>ROLE_USER</quote>) with the name names of the authorities which
|
||||
the current user has been assigned. If it finds a match (they have an authority called
|
||||
<quote>ROLE_USER</quote>), it votes to grant access, otherwise it votes to deny access.
|
||||
the current user has been assigned. If it finds a match (they have an authority called
|
||||
<quote>ROLE_USER</quote>), it votes to grant access, otherwise it votes to deny access.
|
||||
</para>
|
||||
<para>
|
||||
The prefix can be changed by setting the <literal>rolePrefix</literal> property of
|
||||
The prefix can be changed by setting the <literal>rolePrefix</literal> property of
|
||||
<classname>RoleVoter</classname>. If you only need to use roles in your application and have
|
||||
no need for other custom voters, then you can set the prefix to a blank string, in which case the
|
||||
no need for other custom voters, then you can set the prefix to a blank string, in which case the
|
||||
<classname>RoleVoter</classname> will treat all attributes as roles.
|
||||
</para>
|
||||
</answer>
|
||||
@@ -379,26 +379,26 @@
|
||||
contain.</para></footnote>. A very basic outline would look something
|
||||
like this: <programlisting language="java"><![CDATA[
|
||||
public class MyFilterSecurityMetadataSource implements FilterInvocationSecurityMetadataSource {
|
||||
|
||||
|
||||
public List<ConfigAttribute> getAttributes(Object object) {
|
||||
FilterInvocation fi = (FilterInvocation) object;
|
||||
FilterInvocation fi = (FilterInvocation) object;
|
||||
String url = fi.getRequestUrl();
|
||||
String httpMethod = fi.getRequest().getMethod();
|
||||
List<ConfigAttribute> attributes = new ArrayList<ConfigAttribute>();
|
||||
|
||||
// Lookup your database (or other source) using this information and populate the
|
||||
// list of attributes
|
||||
|
||||
|
||||
return attributes;
|
||||
}
|
||||
}
|
||||
|
||||
public Collection<ConfigAttribute> getAllConfigAttributes() {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public boolean supports(Class<?> clazz) {
|
||||
return FilterInvocation.class.isAssignableFrom(clazz);
|
||||
}
|
||||
}
|
||||
}
|
||||
]]></programlisting> For more information, look at the code for
|
||||
<classname>DefaultFilterInvocationSecurityMetadataSource</classname>.
|
||||
@@ -445,13 +445,13 @@
|
||||
public class MyAuthoritiesPopulator implements LdapAuthoritiesPopulator {
|
||||
@Autowired
|
||||
JdbcTemplate template;
|
||||
|
||||
|
||||
List<GrantedAuthority> getGrantedAuthorities(DirContextOperations userData, String username) {
|
||||
List<GrantedAuthority> = template.query("select role from roles where username = ?", new String[] {username}, new RowMapper<GrantedAuthority>() {
|
||||
/**
|
||||
* We're assuming here that you're using the standard convention of using the role
|
||||
/**
|
||||
* We're assuming here that you're using the standard convention of using the role
|
||||
* prefix "ROLE_" to mark attributes which are supported by Spring Security's RoleVoter.
|
||||
*/
|
||||
*/
|
||||
public GrantedAuthority mapRow(ResultSet rs, int rowNum) throws SQLException {
|
||||
return new GrantedAuthorityImpl("ROLE_" + rs.getString(1);
|
||||
}
|
||||
|
||||
@@ -32,18 +32,18 @@
|
||||
<classname>JdbcDaoImpl</classname>. The table structure if groups are enabled is as
|
||||
follows:<programlisting xml:id="db-schema-groups">
|
||||
create table groups (
|
||||
id bigint generated by default as identity(start with 0) primary key,
|
||||
id bigint generated by default as identity(start with 0) primary key,
|
||||
group_name varchar_ignorecase(50) not null);
|
||||
|
||||
create table group_authorities (
|
||||
group_id bigint not null,
|
||||
authority varchar(50) not null,
|
||||
group_id bigint not null,
|
||||
authority varchar(50) not null,
|
||||
constraint fk_group_authorities_group foreign key(group_id) references groups(id));
|
||||
|
||||
create table group_members (
|
||||
id bigint generated by default as identity(start with 0) primary key,
|
||||
username varchar(50) not null,
|
||||
group_id bigint not null,
|
||||
id bigint generated by default as identity(start with 0) primary key,
|
||||
username varchar(50) not null,
|
||||
group_id bigint not null,
|
||||
constraint fk_group_members_group foreign key(group_id) references groups(id));
|
||||
</programlisting></para>
|
||||
</section>
|
||||
@@ -56,9 +56,9 @@ create table group_members (
|
||||
directly or through the namespace, then you will need this table.
|
||||
<programlisting xml:id="db-schema-remeber-me">
|
||||
create table persistent_logins (
|
||||
username varchar(64) not null,
|
||||
username varchar(64) not null,
|
||||
series varchar(64) primary key,
|
||||
token varchar(64) not null,
|
||||
token varchar(64) not null,
|
||||
last_used timestamp not null);
|
||||
</programlisting></para>
|
||||
</section>
|
||||
@@ -94,7 +94,7 @@ create table persistent_logins (
|
||||
<title>Hypersonic SQL</title>
|
||||
<para>The default schema works with the embedded HSQLDB database that is used in unit tests
|
||||
within the
|
||||
framework.<programlisting xml:id="dbschema-acl-hsql">
|
||||
framework.<programlisting xml:id="dbschema-acl-hsql">
|
||||
create table acl_sid (
|
||||
id bigint generated by default as identity(start with 100) not null primary key,
|
||||
principal boolean not null,
|
||||
@@ -102,30 +102,30 @@ create table acl_sid (
|
||||
constraint unique_uk_1 unique(sid,principal) );
|
||||
|
||||
create table acl_class (
|
||||
id bigint generated by default as identity(start with 100) not null primary key,
|
||||
class varchar_ignorecase(100) not null,
|
||||
id bigint generated by default as identity(start with 100) not null primary key,
|
||||
class varchar_ignorecase(100) not null,
|
||||
constraint unique_uk_2 unique(class) );
|
||||
|
||||
create table acl_object_identity (
|
||||
id bigint generated by default as identity(start with 100) not null primary key,
|
||||
object_id_class bigint not null,
|
||||
object_id_identity bigint not null,
|
||||
parent_object bigint,
|
||||
owner_sid bigint not null,
|
||||
entries_inheriting boolean not null,
|
||||
constraint unique_uk_3 unique(object_id_class,object_id_identity),
|
||||
constraint foreign_fk_1 foreign key(parent_object)references acl_object_identity(id),
|
||||
constraint foreign_fk_2 foreign key(object_id_class)references acl_class(id),
|
||||
id bigint generated by default as identity(start with 100) not null primary key,
|
||||
object_id_class bigint not null,
|
||||
object_id_identity bigint not null,
|
||||
parent_object bigint,
|
||||
owner_sid bigint not null,
|
||||
entries_inheriting boolean not null,
|
||||
constraint unique_uk_3 unique(object_id_class,object_id_identity),
|
||||
constraint foreign_fk_1 foreign key(parent_object)references acl_object_identity(id),
|
||||
constraint foreign_fk_2 foreign key(object_id_class)references acl_class(id),
|
||||
constraint foreign_fk_3 foreign key(owner_sid)references acl_sid(id) );
|
||||
|
||||
create table acl_entry (
|
||||
id bigint generated by default as identity(start with 100) not null primary key,
|
||||
acl_object_identity bigint not null,ace_order int not null,sid bigint not null,
|
||||
mask integer not null,granting boolean not null,audit_success boolean not null,
|
||||
create table acl_entry (
|
||||
id bigint generated by default as identity(start with 100) not null primary key,
|
||||
acl_object_identity bigint not null,ace_order int not null,sid bigint not null,
|
||||
mask integer not null,granting boolean not null,audit_success boolean not null,
|
||||
audit_failure boolean not null,
|
||||
constraint unique_uk_4 unique(acl_object_identity,ace_order),
|
||||
constraint foreign_fk_4 foreign key(acl_object_identity)
|
||||
references acl_object_identity(id),
|
||||
constraint unique_uk_4 unique(acl_object_identity,ace_order),
|
||||
constraint foreign_fk_4 foreign key(acl_object_identity)
|
||||
references acl_object_identity(id),
|
||||
constraint foreign_fk_5 foreign key(sid) references acl_sid(id) );
|
||||
|
||||
</programlisting></para>
|
||||
@@ -165,7 +165,7 @@ create table acl_entry(
|
||||
audit_success boolean not null,
|
||||
audit_failure boolean not null,
|
||||
constraint unique_uk_4 unique(acl_object_identity,ace_order),
|
||||
constraint foreign_fk_4 foreign key(acl_object_identity)
|
||||
constraint foreign_fk_4 foreign key(acl_object_identity)
|
||||
references acl_object_identity(id),
|
||||
constraint foreign_fk_5 foreign key(sid) references acl_sid(id));
|
||||
</programlisting>
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
access control decisions. The <interfacename>AccessDecisionManager</interfacename> interface
|
||||
contains three methods:
|
||||
<programlisting>
|
||||
void decide(Authentication authentication, Object secureObject,
|
||||
void decide(Authentication authentication, Object secureObject,
|
||||
List<ConfigAttribute> config) throws AccessDeniedException;
|
||||
boolean supports(ConfigAttribute attribute);
|
||||
boolean supports(Class clazz);
|
||||
@@ -93,7 +93,7 @@
|
||||
<figure xml:id="authz-access-voting">
|
||||
<title>Voting Decision Manager</title>
|
||||
<mediaobject>
|
||||
<!--
|
||||
<!--
|
||||
<imageobject role="fo">
|
||||
<imagedata align="center" fileref="resources/images/AccessDecisionVoting.gif" format="GIF"/>
|
||||
</imageobject>
|
||||
@@ -232,7 +232,7 @@ boolean supports(Class clazz);
|
||||
latter (recommended) approach is usually achieved through a <literal>ROLE_USER</literal> or
|
||||
<literal>ROLE_AUTHENTICATED</literal> configuration attribute.</para>
|
||||
<!-- TODO: Move to ACL section and add reference here -->
|
||||
<!--
|
||||
<!--
|
||||
<section xml:id="after-invocation-acl-aware">
|
||||
<info>
|
||||
<title>ACL-Aware AfterInvocationProviders</title>
|
||||
@@ -292,7 +292,7 @@ boolean supports(Class clazz);
|
||||
<literal>AfterInvocationProvider</literal>s.</para>
|
||||
</section> -->
|
||||
</section>
|
||||
<!-- TODO: Move taglibs to a separate chapter which describes them all
|
||||
<!-- TODO: Move taglibs to a separate chapter which describes them all
|
||||
<section xml:id="authorization-taglibs">
|
||||
<info>
|
||||
<title>Authorization Tag Libraries</title>
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
its required collaborator:</para>
|
||||
<para>
|
||||
<programlisting language="xml"><![CDATA[
|
||||
<bean id="basicAuthenticationFilter"
|
||||
<bean id="basicAuthenticationFilter"
|
||||
class="org.springframework.security.web.authentication.www.BasicAuthenticationFilter">
|
||||
<property name="authenticationManager" ref="authenticationManager"/>
|
||||
<property name="authenticationEntryPoint" ref="authenticationEntryPoint"/>
|
||||
@@ -41,7 +41,7 @@
|
||||
<bean id="authenticationEntryPoint"
|
||||
class="org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint">
|
||||
<property name="realmName" value="Name Of Your Realm"/>
|
||||
</bean>]]>
|
||||
</bean>]]>
|
||||
</programlisting>
|
||||
</para>
|
||||
<para>The configured <interfacename>AuthenticationManager</interfacename> processes each
|
||||
@@ -83,7 +83,7 @@
|
||||
<para>
|
||||
<programlisting>
|
||||
base64(expirationTime + ":" + md5Hex(expirationTime + ":" + key))
|
||||
|
||||
|
||||
expirationTime: The date and time when the nonce expires, expressed in milliseconds
|
||||
key: A private key to prevent modification of the nonce token
|
||||
</programlisting>
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
<!--
|
||||
<section xml:id="cas-sequence">
|
||||
<title>Spring Security and CAS Interaction Sequence</title>
|
||||
|
||||
|
||||
TODO: Needs reviewed
|
||||
<para>The basic interaction between a web browser, CAS server and a
|
||||
Spring Security-secured service is as follows:</para>
|
||||
@@ -255,9 +255,9 @@
|
||||
context. This represents your CAS service:</para>
|
||||
<para>
|
||||
<programlisting><![CDATA[
|
||||
<bean id="serviceProperties"
|
||||
<bean id="serviceProperties"
|
||||
class="org.springframework.security.cas.ServiceProperties">
|
||||
<property name="service"
|
||||
<property name="service"
|
||||
value="https://localhost:8443/cas-sample/j_spring_cas_security_check"/>
|
||||
<property name="sendRenew" value="false"/>
|
||||
</bean>]]>
|
||||
@@ -277,13 +277,13 @@
|
||||
...
|
||||
<custom-filter position="FORM_LOGIN_FILTER" ref="myFilter" />
|
||||
</security:http>
|
||||
|
||||
<bean id="casFilter"
|
||||
|
||||
<bean id="casFilter"
|
||||
class="org.springframework.security.cas.web.CasAuthenticationFilter">
|
||||
<property name="authenticationManager" ref="authenticationManager"/>
|
||||
</bean>
|
||||
|
||||
<bean id="casEntryPoint"
|
||||
<bean id="casEntryPoint"
|
||||
class="org.springframework.security.cas.web.CasAuthenticationEntryPoint">
|
||||
<property name="loginUrl" value="https://localhost:9443/cas/login"/>
|
||||
<property name="serviceProperties" ref="serviceProperties"/>
|
||||
@@ -295,7 +295,7 @@
|
||||
authentication using <link xlink:href="ns-entry-point-ref"
|
||||
><literal>entry-point-ref</literal></link>. </para>
|
||||
<para>The <classname>CasAuthenticationFilter</classname> has very similar properties to the
|
||||
<classname>UsernamePasswordAuthenticationFilter</classname> (used for form-based logins).
|
||||
<classname>UsernamePasswordAuthenticationFilter</classname> (used for form-based logins).
|
||||
</para>
|
||||
<para>For CAS to operate, the <classname>ExceptionTranslationFilter</classname> must have its
|
||||
<literal>authenticationEntryPoint</literal> property set to the
|
||||
@@ -305,10 +305,10 @@
|
||||
enterprise's CAS login server. This is where the user's browser will be redirected.</para>
|
||||
<para>Next you need to add a <literal>CasAuthenticationProvider</literal> and its collaborators: <programlisting><![CDATA[
|
||||
<security:authentication-manager alias="authenticationManager">
|
||||
<security:authentication-provider ref="casAuthenticationProvider" />
|
||||
<security:authentication-provider ref="casAuthenticationProvider" />
|
||||
</security:authentication-manager>
|
||||
|
||||
<bean id="casAuthenticationProvider"
|
||||
<bean id="casAuthenticationProvider"
|
||||
class="org.springframework.security.cas.authentication.CasAuthenticationProvider">
|
||||
<property name="userDetailsService" ref="userService"/>
|
||||
<property name="serviceProperties" ref="serviceProperties" />
|
||||
@@ -319,11 +319,11 @@
|
||||
</property>
|
||||
<property name="key" value="an_id_for_this_auth_provider_only"/>
|
||||
</bean>
|
||||
|
||||
|
||||
<security:user-service id="userService">
|
||||
<security:user name="joe" password="joe" authorities="ROLE_USER" />
|
||||
...
|
||||
</security:user-service>]]>
|
||||
</security:user-service>]]>
|
||||
</programlisting> The
|
||||
<classname>CasAuthenticationProvider</classname> uses a
|
||||
<interfacename>UserDetailsService</interfacename> instance to load the authorities for a
|
||||
@@ -331,7 +331,7 @@
|
||||
<para>The beans are all reasonable self-explanatory if you refer back to the "How CAS Works"
|
||||
section.</para>
|
||||
</section>
|
||||
<!--
|
||||
<!--
|
||||
<para>Note the <literal>CasProxyTicketValidator</literal> has a
|
||||
remarked out <literal>trustStore</literal> property. This property
|
||||
might be helpful if you experience HTTPS certificate issues. Also note
|
||||
|
||||
@@ -39,23 +39,23 @@
|
||||
recommended approach).</para>
|
||||
<para>To configure channel security explicitly, you would define the following the filter in
|
||||
your application context: <programlisting><![CDATA[
|
||||
<bean id="channelProcessingFilter"
|
||||
<bean id="channelProcessingFilter"
|
||||
class="org.springframework.security.web.access.channel.ChannelProcessingFilter">
|
||||
<property name="channelDecisionManager" ref="channelDecisionManager"/>
|
||||
<property name="securityMetadataSource">
|
||||
<security:filter-security-metadata-source path-type="regex">
|
||||
<security:intercept-url pattern="\A/secure/.*\Z"
|
||||
<security:intercept-url pattern="\A/secure/.*\Z"
|
||||
access="REQUIRES_SECURE_CHANNEL"/>
|
||||
<security:intercept-url pattern="\A/acegilogin.jsp.*\Z"
|
||||
<security:intercept-url pattern="\A/acegilogin.jsp.*\Z"
|
||||
access="REQUIRES_SECURE_CHANNEL"/>
|
||||
<security:intercept-url pattern="\A/j_spring_security_check.*\Z"
|
||||
<security:intercept-url pattern="\A/j_spring_security_check.*\Z"
|
||||
access="REQUIRES_SECURE_CHANNEL"/>
|
||||
<security:intercept-url pattern="\A/.*\Z" access="ANY_CHANNEL"/>
|
||||
</security:filter-security-metadata-source>
|
||||
</security:filter-security-metadata-source>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<bean id="channelDecisionManager"
|
||||
|
||||
<bean id="channelDecisionManager"
|
||||
class="org.springframework.security.access.channel.ChannelDecisionManagerImpl">
|
||||
<property name="channelProcessors">
|
||||
<list>
|
||||
@@ -64,11 +64,11 @@
|
||||
</list>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<bean id="secureChannelProcessor"
|
||||
|
||||
<bean id="secureChannelProcessor"
|
||||
class="org.springframework.security.access.channel.SecureChannelProcessor"/>
|
||||
<bean id="insecureChannelProcessor"
|
||||
class="org.springframework.security.access.channel.InsecureChannelProcessor"/>]]>
|
||||
<bean id="insecureChannelProcessor"
|
||||
class="org.springframework.security.access.channel.InsecureChannelProcessor"/>]]>
|
||||
</programlisting>
|
||||
Like <classname>FilterSecurityInterceptor</classname>, Apache Ant style paths are also
|
||||
supported by the <literal>ChannelProcessingFilter</literal>.</para>
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
# Processes the ref manual docbook files, building an index of classname to section ids where the class is referenced
|
||||
#
|
||||
#
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
|
||||
@@ -28,12 +28,12 @@
|
||||
contributing, including reading the forum and responding to questions from other people,
|
||||
writing new code, improving existing code, assisting with documentation, developing
|
||||
samples or tutorials, or simply making suggestions.</para>
|
||||
<!-- TODO: Not currently there on SSec 2.0
|
||||
<!-- TODO: Not currently there on SSec 2.0
|
||||
<para>Please read our project policies web page that is available on
|
||||
Spring Security home page. This explains the path to become a
|
||||
committer, and the administration approaches we use within the
|
||||
project.</para>
|
||||
|
||||
|
||||
-->
|
||||
</section>
|
||||
<section xml:id="further-info">
|
||||
|
||||
@@ -111,7 +111,7 @@
|
||||
<property name="authenticationEntryPoint" ref="authenticationEntryPoint"/>
|
||||
<property name="accessDeniedHandler" ref="accessDeniedHandler"/>
|
||||
</bean>
|
||||
|
||||
|
||||
<bean id="authenticationEntryPoint"
|
||||
class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
|
||||
<property name="loginFormUrl" value="/login.jsp"/>
|
||||
@@ -196,8 +196,8 @@ class="org.springframework.security.web.context.SecurityContextPersistenceFilter
|
||||
<programlisting language="java">
|
||||
public interface SecurityContextRepository {
|
||||
SecurityContext loadContext(HttpRequestResponseHolder requestResponseHolder);
|
||||
void saveContext(SecurityContext context, HttpServletRequest request,
|
||||
HttpServletResponse response);
|
||||
void saveContext(SecurityContext context, HttpServletRequest request,
|
||||
HttpServletResponse response);
|
||||
}
|
||||
</programlisting>
|
||||
The <classname>HttpRequestResponseHolder</classname> is simply a container for the
|
||||
@@ -268,12 +268,12 @@ class="org.springframework.security.web.context.SecurityContextPersistenceFilter
|
||||
</orderedlist> The login form simply contains <literal>j_username</literal> and
|
||||
<literal>j_password</literal> input fields, and posts to the URL that is monitored
|
||||
by the filter (by default this is <literal>/j_spring_security_check</literal>). The
|
||||
basic filter configuration looks something like this: <programlisting><![CDATA[
|
||||
basic filter configuration looks something like this: <programlisting><![CDATA[
|
||||
<bean id="authenticationFilter" class=
|
||||
"org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
|
||||
<property name="authenticationManager" ref="authenticationManager"/>
|
||||
<property name="filterProcessesUrl" value="/j_spring_security_check"/>
|
||||
</bean> ]]>
|
||||
</bean> ]]>
|
||||
</programlisting></para>
|
||||
<section xml:id="form-login-flow-handling">
|
||||
<title>Application Flow on Authentication Success and Failure</title>
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
<property name="userDetailsService" ref="inMemoryDaoImpl"/>
|
||||
<property name="saltSource" ref bean="saltSource"/>
|
||||
<property name="passwordEncoder" ref="passwordEncoder"/>
|
||||
</bean> ]]>
|
||||
</bean> ]]>
|
||||
</programlisting>
|
||||
</para>
|
||||
<para>The <literal>PasswordEncoder</literal> and <literal>SaltSource</literal> are optional.
|
||||
@@ -68,20 +68,20 @@
|
||||
<property name="userDetailsService" ref="userDetailsService"/>
|
||||
<property name="userCache" ref="userCache"/>
|
||||
</bean>
|
||||
|
||||
|
||||
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
|
||||
<property name="configLocation" value="classpath:/ehcache-failsafe.xml"/>
|
||||
</bean>
|
||||
|
||||
|
||||
<bean id="userCacheBackend" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
|
||||
<property name="cacheManager" ref="cacheManager"/>
|
||||
<property name="cacheName" value="userCache"/>
|
||||
</bean>
|
||||
|
||||
<bean id="userCache"
|
||||
<bean id="userCache"
|
||||
class="org.springframework.security.core.userdetails.cache.EhCacheBasedUserCache">
|
||||
<property name="cache" ref="userCacheBackend"/>
|
||||
</bean>]]>
|
||||
</bean>]]>
|
||||
</programlisting>
|
||||
</para>
|
||||
<para>All Spring Security EH-CACHE implementations (including
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
elements to contain Spring EL expressions. The expressions should evaluate to a boolean,
|
||||
defining whether access should be allowed or not. For example:<programlisting><![CDATA[
|
||||
<http use-expressions="true">
|
||||
<intercept-url pattern="/admin*"
|
||||
<intercept-url pattern="/admin*"
|
||||
access="hasRole('admin') and hasIpAddress('192.168.1.0/24')"/>
|
||||
...
|
||||
</http>
|
||||
@@ -224,7 +224,7 @@
|
||||
<security:expression-handler ref="expressionHandler"/>
|
||||
</security:global-method-security>
|
||||
|
||||
<bean id="expressionHandler"
|
||||
<bean id="expressionHandler"
|
||||
class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
|
||||
<property name="permissionEvaluator" ref="myPermissionEvaluator"/>
|
||||
</bean>]]></programlisting>Where <literal>myPermissionEvaluator</literal> is the bean which
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
<chapter xmlns="http://docbook.org/ns/docbook" version="5.0" xml:id="form">
|
||||
<info><title>Form Authentication Mechanism</title></info>
|
||||
|
||||
|
||||
<section xml:id="form-overview">
|
||||
<info><title>Overview</title></info>
|
||||
|
||||
|
||||
<para>HTTP Form Authentication involves using the
|
||||
<literal>UsernamePasswordAuthenticationFilter</literal> to process a login
|
||||
form. This is the most common way for an application to authenticate end
|
||||
@@ -13,40 +13,40 @@
|
||||
and it's recommended that you use that unless you have specific customization requirements.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
|
||||
<section xml:id="form-config">
|
||||
<info><title>Configuration</title></info>
|
||||
|
||||
|
||||
<para>The login form simply contains <literal>j_username</literal> and
|
||||
<literal>j_password</literal> input fields, and posts to a URL that is
|
||||
monitored by the filter (by default
|
||||
<literal>/j_spring_security_check</literal>). You should add an
|
||||
<literal>/j_spring_security_check</literal>). You should add an
|
||||
<literal>UsernamePasswordAuthenticationFilter</literal> to your application context:
|
||||
<programlisting><![CDATA[
|
||||
<programlisting><![CDATA[
|
||||
<bean id="authenticationProcessingFilter" class=
|
||||
"org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
|
||||
<property name="authenticationManager" ref="authenticationManager"/>
|
||||
<property name="filterProcessesUrl" value="/j_spring_security_check"/>
|
||||
</bean> ]]>
|
||||
</bean> ]]>
|
||||
</programlisting></para>
|
||||
<para>
|
||||
The configured <interfacename>AuthenticationManager</interfacename>
|
||||
processes each authentication request. The destination following a successful authentication
|
||||
or an authentication failure is controlled by the <interfacename>AuthenticationSuccessHandler</interfacename>
|
||||
and <interfacename>AuthenticationFailureHandler</interfacename> interfaces, respectively.
|
||||
The filter has properties which allow you to set these
|
||||
The filter has properties which allow you to set these
|
||||
<footnote><para>In versions prior to 3.0, the application flow at this point had evolved to a stage
|
||||
was controlled by a mix of properties on this class and strategy plugins. The
|
||||
decision was made for 3.0 to refactor the code to make these two strategies entirely responsible.
|
||||
</para></footnote>.
|
||||
Some standard implementations are supplied for these such as
|
||||
<classname>SimpleUrlAuthenticationSuccessHandler</classname>,
|
||||
<classname>SavedRequestAwareAuthenticationSuccessHandler</classname>,
|
||||
<classname>SimpleUrlAuthenticationFailureHandler</classname> and
|
||||
<classname>SavedRequestAwareAuthenticationSuccessHandler</classname>,
|
||||
<classname>SimpleUrlAuthenticationFailureHandler</classname> and
|
||||
<classname>ExceptionMappingAuthenticationFailureHandler</classname>. Have a look at the Javadoc
|
||||
for these classes to see how they work.
|
||||
for these classes to see how they work.
|
||||
</para>
|
||||
|
||||
|
||||
<para>If authentication is successful, the resulting
|
||||
<interfacename>Authentication</interfacename> object will be placed into the
|
||||
<classname>SecurityContextHolder</classname>.
|
||||
@@ -58,7 +58,7 @@
|
||||
<para>
|
||||
The <classname>ExceptionTranslationFilter</classname> caches the original request a user makes.
|
||||
When the user authenticates, the request handler makes use of this cached request to obtain the original
|
||||
URL and redirect to it. The original request is then rebuilt and used as an alternative.
|
||||
URL and redirect to it. The original request is then rebuilt and used as an alternative.
|
||||
</para>
|
||||
</note>
|
||||
If authentication fails, the configured <interfacename>AuthenticationFailureHandler</interfacename> will be invoked.
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
</t:titlepage-content>
|
||||
|
||||
<t:titlepage-content t:side="verso">
|
||||
<legalnotice/>
|
||||
<legalnotice/>
|
||||
</t:titlepage-content>
|
||||
|
||||
<t:titlepage-separator>
|
||||
|
||||
@@ -6,26 +6,26 @@
|
||||
<para>Spring Security provides a package able to delegate
|
||||
authentication requests to the Java Authentication and Authorization
|
||||
Service (JAAS). This package is discussed in detail below.</para>
|
||||
|
||||
|
||||
<para>Central to JAAS operation are login configuration files. To
|
||||
learn more about JAAS login configuration files, consult the JAAS
|
||||
reference documentation available from Sun Microsystems. We expect you
|
||||
to have a basic understanding of JAAS and its login configuration file
|
||||
syntax in order to understand this section.</para>
|
||||
</section>
|
||||
|
||||
|
||||
<section xml:id="jaas-config">
|
||||
<info><title>Configuration</title></info>
|
||||
<para>The <literal>JaasAuthenticationProvider</literal> attempts to
|
||||
authenticate a user’s principal and credentials through JAAS.</para>
|
||||
|
||||
|
||||
<para>Let’s assume we have a JAAS login configuration file,
|
||||
<literal>/WEB-INF/login.conf</literal>, with the following
|
||||
contents:
|
||||
<programlisting>
|
||||
JAASTest {
|
||||
sample.SampleLoginModule required;
|
||||
};</programlisting></para>
|
||||
};</programlisting></para>
|
||||
<para>Like all Spring Security beans, the
|
||||
<classname>JaasAuthenticationProvider</classname> is configured via the
|
||||
application context. The following definitions would correspond to the
|
||||
@@ -37,9 +37,9 @@ JAASTest {
|
||||
<property name="loginContextName" value="JAASTest"/>
|
||||
<property name="callbackHandlers">
|
||||
<list>
|
||||
<bean
|
||||
<bean
|
||||
class="org.springframework.security.authentication.jaas.JaasNameCallbackHandler"/>
|
||||
<bean
|
||||
<bean
|
||||
class="org.springframework.security.authentication.jaas.JaasPasswordCallbackHandler"/>
|
||||
</list>
|
||||
</property>
|
||||
@@ -48,19 +48,19 @@ JAASTest {
|
||||
<bean class="org.springframework.security.authentication.jaas.TestAuthorityGranter"/>
|
||||
</list>
|
||||
</property>
|
||||
</bean>
|
||||
</bean>
|
||||
]]></programlisting></para>
|
||||
|
||||
|
||||
<para>The <literal>CallbackHandler</literal>s and
|
||||
<interfacename>AuthorityGranter</interfacename>s are discussed below.</para>
|
||||
|
||||
|
||||
<section xml:id="jaas-callbackhandler">
|
||||
<info><title xml:id="jaas-callback-handler">JAAS CallbackHandler</title></info>
|
||||
|
||||
|
||||
<para>Most JAAS <literal>LoginModule</literal>s require a callback
|
||||
of some sort. These callbacks are usually used to obtain the
|
||||
username and password from the user.</para>
|
||||
|
||||
|
||||
<para>In a Spring Security deployment, Spring Security is
|
||||
responsible for this user interaction (via the authentication
|
||||
mechanism). Thus, by the time the authentication request is
|
||||
@@ -69,7 +69,7 @@ JAASTest {
|
||||
<interfacename>Authentication</interfacename> object containing all the
|
||||
information required by the JAAS
|
||||
<literal>LoginModule</literal>.</para>
|
||||
|
||||
|
||||
<para>Therefore, the JAAS package for Spring Security provides two
|
||||
default callback handlers,
|
||||
<literal>JaasNameCallbackHandler</literal> and
|
||||
@@ -78,7 +78,7 @@ JAASTest {
|
||||
<literal>JaasAuthenticationCallbackHandler</literal>. In most cases
|
||||
these callback handlers can simply be used without understanding the
|
||||
internal mechanics.</para>
|
||||
|
||||
|
||||
<para>For those needing full control over the callback behavior,
|
||||
internally <literal>JaasAuthenticationProvider</literal> wraps these
|
||||
<literal>JaasAuthenticationCallbackHandler</literal>s with an
|
||||
@@ -93,10 +93,10 @@ JAASTest {
|
||||
passed to the <literal>JaasAuthenticationCallbackHandler</literal>s
|
||||
being wrapped.</para>
|
||||
</section>
|
||||
|
||||
|
||||
<section xml:id="jaas-authoritygranter">
|
||||
<info><title xml:id="jaas-authority-granter">JAAS AuthorityGranter</title></info>
|
||||
|
||||
|
||||
<para>JAAS works with principals. Even "roles" are represented as
|
||||
principals in JAAS. Spring Security, on the other hand, works with
|
||||
<interfacename>Authentication</interfacename> objects. Each
|
||||
@@ -105,10 +105,10 @@ JAASTest {
|
||||
facilitate mapping between these different concepts, Spring
|
||||
Security's JAAS package includes an
|
||||
<literal>AuthorityGranter</literal> interface.</para>
|
||||
|
||||
|
||||
<para>An <literal>AuthorityGranter</literal> is responsible for
|
||||
inspecting a JAAS principal and returning a set of
|
||||
<literal>String</literal>s, representing the authorities assigned to the principal.
|
||||
inspecting a JAAS principal and returning a set of
|
||||
<literal>String</literal>s, representing the authorities assigned to the principal.
|
||||
For each returned authority string, the
|
||||
<classname>JaasAuthenticationProvider</classname> creates a
|
||||
<classname>JaasGrantedAuthority</classname> (which implements Spring
|
||||
@@ -124,7 +124,7 @@ JAASTest {
|
||||
<interfacename>AuthorityGranter</interfacename> defined against the
|
||||
<literal>JaasAuthenticationProvider.setAuthorityGranters(List)</literal>
|
||||
property.</para>
|
||||
|
||||
|
||||
<para>Spring Security does not include any production
|
||||
<interfacename>AuthorityGranter</interfacename>s given that every JAAS principal
|
||||
has an implementation-specific meaning. However, there is a
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
from the security namespace. This can be configured to point at an external LDAP server,
|
||||
using the <literal>url</literal> attribute: <programlisting><![CDATA[
|
||||
<ldap-server url="ldap://springframework.org:389/dc=springframework,dc=org" />
|
||||
]]>
|
||||
]]>
|
||||
</programlisting></para>
|
||||
<section>
|
||||
<info>
|
||||
@@ -70,7 +70,7 @@
|
||||
embedded server, which can be very useful for testing and demonstrations. In this
|
||||
case you use it without the <literal>url</literal> attribute: <programlisting><![CDATA[
|
||||
<ldap-server root="dc=springframework,dc=org"/>
|
||||
]]>
|
||||
]]>
|
||||
</programlisting> Here we've specified that the root DIT of the directory should be
|
||||
<quote>dc=springframework,dc=org</quote>, which is the default. Used this way,
|
||||
the namespace parser will create an embedded Apache Directory server and scan the
|
||||
@@ -96,7 +96,7 @@
|
||||
that user with the login password. This is OK if all your users are stored under a
|
||||
single node in the directory. If instead you wished to configure an LDAP search
|
||||
filter to locate the user, you could use the following: <programlisting><![CDATA[
|
||||
<ldap-authentication-provider user-search-filter="(uid={0})"
|
||||
<ldap-authentication-provider user-search-filter="(uid={0})"
|
||||
user-search-base="ou=people"/>
|
||||
]]></programlisting> If used with the server definition above, this would
|
||||
perform a search under the DN <literal>ou=people,dc=springframework,dc=org</literal>
|
||||
@@ -134,7 +134,7 @@
|
||||
on the login name.</para>
|
||||
</listitem>
|
||||
</itemizedlist> So if we used the following configuration <programlisting><![CDATA[
|
||||
<ldap-authentication-provider user-dn-pattern="uid={0},ou=people"
|
||||
<ldap-authentication-provider user-dn-pattern="uid={0},ou=people"
|
||||
group-search-base="ou=groups" />
|
||||
]]></programlisting> and authenticated successfully as user <quote>ben</quote>, the subsequent
|
||||
loading of authorities would perform a search under the directory entry
|
||||
@@ -314,7 +314,7 @@
|
||||
</bean>
|
||||
</constructor-arg>
|
||||
<constructor-arg>
|
||||
<bean
|
||||
<bean
|
||||
class="org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator">
|
||||
<constructor-arg ref="contextSource"/>
|
||||
<constructor-arg value="ou=groups"/>
|
||||
@@ -338,7 +338,7 @@
|
||||
<constructor-arg index="0" value=""/>
|
||||
<constructor-arg index="1" value="(uid={0})"/>
|
||||
<constructor-arg index="2" ref="contextSource" />
|
||||
</bean> ]]>
|
||||
</bean> ]]>
|
||||
</programlisting> and use it by setting the
|
||||
<classname>BindAuthenticator</classname> bean's <property>userSearch</property>
|
||||
property. The authenticator would then call the search object to obtain the correct
|
||||
@@ -359,11 +359,11 @@
|
||||
provider's <interfacename>UserDetailsContextMapper</interfacename> strategy, which
|
||||
is responsible for mapping user objects to and from LDAP context data: <programlisting><![CDATA[
|
||||
public interface UserDetailsContextMapper {
|
||||
UserDetails mapUserFromContext(DirContextOperations ctx, String username,
|
||||
UserDetails mapUserFromContext(DirContextOperations ctx, String username,
|
||||
Collection<GrantedAuthority> authorities);
|
||||
|
||||
void mapUserToContext(UserDetails user, DirContextAdapter ctx);
|
||||
}]]>
|
||||
}]]>
|
||||
</programlisting> Only the first method is relevant for
|
||||
authentication. If you provide an implementation of this interface, you can control
|
||||
exactly how the UserDetails object is created. The first parameter is an instance of
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
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 example, adding the following
|
||||
element from the security namespace to an application context will start up an embedded LDAP
|
||||
server for testing use within the application: <programlisting language="xml"><![CDATA[
|
||||
server for testing use within the application: <programlisting language="xml"><![CDATA[
|
||||
<security:ldap-server />
|
||||
]]></programlisting> This is much simpler than wiring up the equivalent Apache Directory Server
|
||||
beans. The most common alternative configuration requirements are supported by attributes on
|
||||
@@ -34,10 +34,10 @@
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:security="http://www.springframework.org/schema/security"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans
|
||||
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
|
||||
http://www.springframework.org/schema/security
|
||||
http://www.springframework.org/schema/security/spring-security-3.0.xsd">
|
||||
http://www.springframework.org/schema/security
|
||||
http://www.springframework.org/schema/security/spring-security-3.0.xsd">
|
||||
...
|
||||
</beans>
|
||||
]]></programlisting> In many of the examples you will see (and in the sample) applications, we
|
||||
@@ -49,10 +49,10 @@
|
||||
<beans:beans xmlns="http://www.springframework.org/schema/security"
|
||||
xmlns:beans="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans
|
||||
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
|
||||
http://www.springframework.org/schema/security
|
||||
http://www.springframework.org/schema/security/spring-security-3.0.xsd">
|
||||
http://www.springframework.org/schema/security
|
||||
http://www.springframework.org/schema/security/spring-security-3.0.xsd">
|
||||
...
|
||||
</beans:beans>
|
||||
]]></programlisting> We'll assume this syntax is being used from now on in this chapter. </para>
|
||||
@@ -101,11 +101,11 @@
|
||||
<filter-name>springSecurityFilterChain</filter-name>
|
||||
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
|
||||
</filter>
|
||||
|
||||
|
||||
<filter-mapping>
|
||||
<filter-name>springSecurityFilterChain</filter-name>
|
||||
<url-pattern>/*</url-pattern>
|
||||
</filter-mapping>]]>
|
||||
</filter-mapping>]]>
|
||||
</programlisting> This provides a hook into the Spring Security web
|
||||
infrastructure. <classname>DelegatingFilterProxy</classname> is a Spring Framework class
|
||||
which delegates to a filter implementation which is defined as a Spring bean in your
|
||||
@@ -224,7 +224,7 @@
|
||||
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="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
|
||||
<intercept-url pattern="/**" access="ROLE_USER" />
|
||||
<form-login login-page='/login.jsp'/>
|
||||
</http>
|
||||
@@ -243,8 +243,8 @@
|
||||
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"/>
|
||||
<intercept-url pattern="/login.jsp*" filters="none"/>
|
||||
<intercept-url pattern="/css/**" filters="none"/>
|
||||
<intercept-url pattern="/login.jsp*" filters="none"/>
|
||||
<intercept-url pattern="/**" access="ROLE_USER" />
|
||||
<form-login login-page='/login.jsp'/>
|
||||
</http>
|
||||
@@ -276,9 +276,9 @@
|
||||
<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>
|
||||
<intercept-url pattern='/login.htm*' filters='none'/>
|
||||
<intercept-url pattern='/login.htm*' filters='none'/>
|
||||
<intercept-url pattern='/**' access='ROLE_USER' />
|
||||
<form-login login-page='/login.htm' default-target-url='/home.htm'
|
||||
<form-login login-page='/login.htm' default-target-url='/home.htm'
|
||||
always-use-default-target='true' />
|
||||
</http>
|
||||
]]>
|
||||
@@ -315,8 +315,8 @@
|
||||
<authentication-manager>
|
||||
<authentication-provider user-service-ref='myUserDetailsService'/>
|
||||
</authentication-manager>
|
||||
|
||||
<beans:bean id="myUserDetailsService"
|
||||
|
||||
<beans:bean id="myUserDetailsService"
|
||||
class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
|
||||
<beans:property name="dataSource" ref="dataSource"/>
|
||||
</beans:bean>
|
||||
@@ -341,9 +341,9 @@
|
||||
<authentication-provider>
|
||||
<password-encoder hash="sha"/>
|
||||
<user-service>
|
||||
<user name="jimi" password="d7e6351eaa13189a5a3641bab846c8e8c69ba39f"
|
||||
<user name="jimi" password="d7e6351eaa13189a5a3641bab846c8e8c69ba39f"
|
||||
authorities="ROLE_USER, ROLE_ADMIN" />
|
||||
<user name="bob" password="4e7421b1b8765d8f9406d87e7cc6aa784c4ab97f"
|
||||
<user name="bob" password="4e7421b1b8765d8f9406d87e7cc6aa784c4ab97f"
|
||||
authorities="ROLE_USER" />
|
||||
</user-service>
|
||||
</authentication-provider>
|
||||
@@ -380,7 +380,7 @@
|
||||
<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"/>
|
||||
<intercept-url pattern="/**" access="ROLE_USER" requires-channel="any"/>
|
||||
...
|
||||
</http>]]>
|
||||
</programlisting>With this configuration in place, if a user attempts to access
|
||||
@@ -388,7 +388,7 @@
|
||||
HTTPS URL. The available options are "http", "https" or "any". Using the value "any" means
|
||||
that either HTTP or HTTPS can be used. </para>
|
||||
<para>If your application uses non-standard ports for HTTP and/or HTTPS, you can specify a
|
||||
list of port mappings as follows: <programlisting><![CDATA[
|
||||
list of port mappings as follows: <programlisting><![CDATA[
|
||||
<http>
|
||||
...
|
||||
<port-mappings>
|
||||
@@ -404,7 +404,7 @@
|
||||
<title>Detecting Timeouts</title>
|
||||
<para> You can configure Spring Security to detect the submission of an invalid session ID
|
||||
and redirect the user to an appropriate URL. This is achieved through the
|
||||
<literal>session-management</literal> element: <programlisting language="xml"><![CDATA[
|
||||
<literal>session-management</literal> element: <programlisting language="xml"><![CDATA[
|
||||
<http>
|
||||
...
|
||||
<session-management invalid-session-url="/sessionTimeout.htm" />
|
||||
@@ -416,13 +416,13 @@
|
||||
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[
|
||||
lifecycle events: <programlisting language="xml"><![CDATA[
|
||||
<listener>
|
||||
<listener-class>
|
||||
org.springframework.security.web.session.HttpSessionEventPublisher
|
||||
</listener-class>
|
||||
</listener>
|
||||
]]></programlisting> Then add the following lines to your application context: <programlisting language="xml"><![CDATA[
|
||||
]]></programlisting> Then add the following lines to your application context: <programlisting language="xml"><![CDATA[
|
||||
<http>
|
||||
...
|
||||
<session-management>
|
||||
@@ -431,7 +431,7 @@
|
||||
</http>]]>
|
||||
</programlisting> This will prevent a user from logging in multiple times - a
|
||||
second login will cause the first to be invalidated. Often you would prefer to prevent a
|
||||
second login, in which case you can use <programlisting language="xml"><![CDATA[
|
||||
second login, in which case you can use <programlisting language="xml"><![CDATA[
|
||||
<http>
|
||||
...
|
||||
<session-management>
|
||||
@@ -579,8 +579,8 @@ List<OpenIDAttribute> attributes = token.getAttributes();</programlisting>The
|
||||
<http>
|
||||
<custom-filter position="FORM_LOGIN_FILTER" ref="myFilter" />
|
||||
</http>
|
||||
|
||||
<beans:bean id="myFilter" class="com.mycompany.MySpecialAuthenticationFilter"/>
|
||||
|
||||
<beans:bean id="myFilter" class="com.mycompany.MySpecialAuthenticationFilter"/>
|
||||
]]>
|
||||
</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
|
||||
@@ -642,13 +642,13 @@ List<OpenIDAttribute> attributes = token.getAttributes();</programlisting>The
|
||||
<interfacename>AccessDecisionManager</interfacename> for it to make the actual decision:
|
||||
<programlisting language="java">
|
||||
public interface BankService {
|
||||
|
||||
|
||||
@Secured("IS_AUTHENTICATED_ANONYMOUSLY")
|
||||
public Account readAccount(Long id);
|
||||
|
||||
|
||||
@Secured("IS_AUTHENTICATED_ANONYMOUSLY")
|
||||
public Account[] findAccounts();
|
||||
|
||||
|
||||
@Secured("ROLE_TELLER")
|
||||
public Account post(Account account, double amount);
|
||||
}
|
||||
@@ -661,10 +661,10 @@ List<OpenIDAttribute> attributes = token.getAttributes();</programlisting>The
|
||||
|
||||
@PreAuthorize("isAnonymous()")
|
||||
public Account readAccount(Long id);
|
||||
|
||||
|
||||
@PreAuthorize("isAnonymous()")
|
||||
public Account[] findAccounts();
|
||||
|
||||
|
||||
@PreAuthorize("hasAuthority('ROLE_TELLER')")
|
||||
public Account post(Account account, double amount);
|
||||
}
|
||||
@@ -675,7 +675,7 @@ List<OpenIDAttribute> attributes = token.getAttributes();</programlisting>The
|
||||
you to apply security to many beans with only a simple declaration. Consider the following
|
||||
example: <programlisting language="xml"><![CDATA[
|
||||
<global-method-security>
|
||||
<protect-pointcut expression="execution(* com.mycompany.*Service.*(..))"
|
||||
<protect-pointcut expression="execution(* com.mycompany.*Service.*(..))"
|
||||
access="ROLE_USER"/>
|
||||
</global-method-security>
|
||||
]]>
|
||||
@@ -712,12 +712,12 @@ List<OpenIDAttribute> attributes = token.getAttributes();</programlisting>The
|
||||
<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">
|
||||
...
|
||||
...
|
||||
</global-method-security>
|
||||
]]></programlisting></para>
|
||||
<para> The syntax for web security is the same, but on the <literal>http</literal> element: <programlisting language="xml"><![CDATA[
|
||||
<http access-decision-manager-ref="myAccessDecisionManagerBean">
|
||||
...
|
||||
...
|
||||
</http>
|
||||
]]></programlisting></para>
|
||||
</section>
|
||||
@@ -742,7 +742,7 @@ List<OpenIDAttribute> attributes = token.getAttributes();</programlisting>The
|
||||
<authentication-provider ref="casAuthenticationProvider"/>
|
||||
</authentication-manager>
|
||||
|
||||
<bean id="casAuthenticationProvider"
|
||||
<bean id="casAuthenticationProvider"
|
||||
class="org.springframework.security.cas.authentication.CasAuthenticationProvider">
|
||||
...
|
||||
</bean>
|
||||
@@ -750,12 +750,12 @@ List<OpenIDAttribute> attributes = token.getAttributes();</programlisting>The
|
||||
<para> Another common requirement is that another bean in the context may require a reference to
|
||||
the <interfacename>AuthenticationManager</interfacename>. You can easily register an alias for
|
||||
the <interfacename>AuthenticationManager</interfacename> and use this name elsewhere in your
|
||||
application context. <programlisting language="xml"><![CDATA[
|
||||
<security:authentication-manager alias="authenticationManager">
|
||||
application context. <programlisting language="xml"><![CDATA[
|
||||
<security:authentication-manager alias="authenticationManager">
|
||||
...
|
||||
</security:authentication-manager>
|
||||
|
||||
<bean id="customizedFormLoginFilter"
|
||||
<bean id="customizedFormLoginFilter"
|
||||
class="com.somecompany.security.web.CustomFormLoginFilter">
|
||||
<property name="authenticationManager" ref="authenticationManager"/>
|
||||
...
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
|
||||
<t:titlepage t:element="book" t:wrapper="fo:block">
|
||||
<t:titlepage-content t:side="recto">
|
||||
<title
|
||||
<title
|
||||
t:named-template="division.title"
|
||||
param:node="ancestor-or-self::book[1]"
|
||||
text-align="center"
|
||||
@@ -48,43 +48,43 @@
|
||||
space-before="&hsize5space;"
|
||||
font-weight="bold"
|
||||
font-family="{$title.fontset}"
|
||||
/>
|
||||
<subtitle
|
||||
/>
|
||||
<subtitle
|
||||
text-align="center"
|
||||
font-size="&hsize4;"
|
||||
space-before="&hsize4space;"
|
||||
font-family="{$title.fontset}"
|
||||
/>
|
||||
/>
|
||||
|
||||
<corpauthor space-before="0.5em"
|
||||
<corpauthor space-before="0.5em"
|
||||
font-size="&hsize2;"
|
||||
/>
|
||||
|
||||
<authorgroup space-before="0.5em"
|
||||
font-size="&hsize2;"
|
||||
/>
|
||||
|
||||
<author space-before="0.5em" font-size="&hsize2;"/>
|
||||
<mediaobject space-before="2em" space-after="2em"/>
|
||||
<releaseinfo space-before="5em" font-size="&hsize2;"/>
|
||||
/>
|
||||
|
||||
<othercredit space-before="2em" font-weight="normal" font-size="8"/>
|
||||
<pubdate space-before="0.5em"/>
|
||||
<revision space-before="0.5em"/>
|
||||
<revhistory space-before="0.5em"/>
|
||||
|
||||
<abstract space-before="0.5em"
|
||||
<authorgroup space-before="0.5em"
|
||||
font-size="&hsize2;"
|
||||
/>
|
||||
|
||||
<author space-before="0.5em" font-size="&hsize2;"/>
|
||||
<mediaobject space-before="2em" space-after="2em"/>
|
||||
<releaseinfo space-before="5em" font-size="&hsize2;"/>
|
||||
|
||||
<othercredit space-before="2em" font-weight="normal" font-size="8"/>
|
||||
<pubdate space-before="0.5em"/>
|
||||
<revision space-before="0.5em"/>
|
||||
<revhistory space-before="0.5em"/>
|
||||
|
||||
<abstract space-before="0.5em"
|
||||
text-align="start"
|
||||
margin-left="0.1in"
|
||||
margin-right="0.1in"
|
||||
font-family="{$body.fontset}"
|
||||
/>
|
||||
</t:titlepage-content>
|
||||
/>
|
||||
</t:titlepage-content>
|
||||
|
||||
<t:titlepage-content t:side="verso" text-align="start">
|
||||
<copyright space-before="1.5em"/>
|
||||
<legalnotice space-before="15em"/>
|
||||
</t:titlepage-content>
|
||||
<copyright space-before="1.5em"/>
|
||||
<legalnotice space-before="15em"/>
|
||||
</t:titlepage-content>
|
||||
|
||||
<t:titlepage-separator>
|
||||
</t:titlepage-separator>
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
methods to obtain this information:
|
||||
<programlisting language="java">
|
||||
protected abstract Object getPreAuthenticatedPrincipal(HttpServletRequest request);
|
||||
|
||||
|
||||
protected abstract Object getPreAuthenticatedCredentials(HttpServletRequest request);
|
||||
</programlisting>
|
||||
After calling these, the filter will create a
|
||||
@@ -90,7 +90,7 @@
|
||||
<programlisting language="java">
|
||||
public interface AuthenticationUserDetailsService {
|
||||
UserDetails loadUserDetails(Authentication token) throws UsernameNotFoundException;
|
||||
}
|
||||
}
|
||||
</programlisting>
|
||||
This interface may have also other uses but with pre-authentication it allows access to the
|
||||
authorities which were packaged in the <interfacename>Authentication</interfacename> object,
|
||||
@@ -141,8 +141,8 @@
|
||||
<!-- Additional http configuration omitted -->
|
||||
<security:custom-filter ref="siteminderFilter" />
|
||||
</security:http>
|
||||
|
||||
<bean id="siteminderFilter" class=
|
||||
|
||||
<bean id="siteminderFilter" class=
|
||||
"org.springframework.security.web.authentication.preauth.header.RequestHeaderAuthenticationFilter">
|
||||
<property name="principalRequestHeader" value="SM_USER"/>
|
||||
<property name="authenticationManager" ref="authenticationManager" />
|
||||
@@ -151,17 +151,17 @@
|
||||
<bean id="preauthAuthProvider"
|
||||
class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
|
||||
<property name="preAuthenticatedUserDetailsService">
|
||||
<bean id="userDetailsServiceWrapper"
|
||||
<bean id="userDetailsServiceWrapper"
|
||||
class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
|
||||
<property name="userDetailsService" ref="userDetailsService"/>
|
||||
</bean>
|
||||
</bean>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<security:authentication-manager alias="authenticationManager">
|
||||
<security:authentication-provider ref="preauthAuthProvider" />
|
||||
</security-authentication-manager>
|
||||
]]>
|
||||
</bean>
|
||||
|
||||
<security:authentication-manager alias="authenticationManager">
|
||||
<security:authentication-provider ref="preauthAuthProvider" />
|
||||
</security-authentication-manager>
|
||||
]]>
|
||||
</programlisting> We've assumed here that the security namespace is being used for
|
||||
configuration (hence the user of the <literal>custom-filter</literal>,
|
||||
<literal>authentication-manager</literal> and
|
||||
|
||||
@@ -28,12 +28,12 @@
|
||||
cookie is sent to the browser upon successful interactive authentication, with the
|
||||
cookie being composed as follows:
|
||||
<programlisting>
|
||||
base64(username + ":" + expirationTime + ":" +
|
||||
base64(username + ":" + expirationTime + ":" +
|
||||
md5Hex(username + ":" + expirationTime + ":" password + ":" + key))
|
||||
|
||||
|
||||
username: As identifiable to the <interfacename>UserDetailsService</interfacename>
|
||||
password: That matches the one in the retrieved UserDetails
|
||||
expirationTime: The date and time when the remember-me token expires,
|
||||
password: That matches the one in the retrieved UserDetails
|
||||
expirationTime: The date and time when the remember-me token expires,
|
||||
expressed in milliseconds
|
||||
key: A private key to prevent modification of the remember-me token
|
||||
</programlisting></para>
|
||||
@@ -78,7 +78,7 @@
|
||||
<literal>persistent_logins</literal> table, created using the following SQL (or
|
||||
equivalent):
|
||||
<programlisting>
|
||||
create table persistent_logins (username varchar(64) not null, series varchar(64) primary key, token varchar(64) not null, last_used timestamp not null)
|
||||
create table persistent_logins (username varchar(64) not null, series varchar(64) primary key, token varchar(64) not null, last_used timestamp not null)
|
||||
</programlisting></para>
|
||||
<!-- TODO: Add more info on the implementation and behaviour when tokens are stolen etc. Also some info for admins on invalidating tokens using key, or deleting info from db -->
|
||||
</section>
|
||||
@@ -95,7 +95,7 @@
|
||||
<programlisting language="java">
|
||||
Authentication autoLogin(HttpServletRequest request, HttpServletResponse response);
|
||||
void loginFail(HttpServletRequest request, HttpServletResponse response);
|
||||
void loginSuccess(HttpServletRequest request, HttpServletResponse response,
|
||||
void loginSuccess(HttpServletRequest request, HttpServletResponse response,
|
||||
Authentication successfulAuthentication);
|
||||
</programlisting>
|
||||
Please refer to the JavaDocs for a fuller discussion on what the methods do, although
|
||||
@@ -129,24 +129,24 @@
|
||||
so can be used with <classname>LogoutFilter</classname> to have the cookie cleared
|
||||
automatically. </para>
|
||||
<para>The beans required in an application context to enable remember-me services are as
|
||||
follows: <programlisting language="xml"><![CDATA[
|
||||
follows: <programlisting language="xml"><![CDATA[
|
||||
<bean id="rememberMeFilter" class=
|
||||
"org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter">
|
||||
<property name="rememberMeServices" ref="rememberMeServices"/>
|
||||
<property name="authenticationManager" ref="theAuthenticationManager" />
|
||||
<property name="authenticationManager" ref="theAuthenticationManager" />
|
||||
</bean>
|
||||
|
||||
|
||||
<bean id="rememberMeServices" class=
|
||||
"org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices">
|
||||
<property name="userDetailsService" ref="myUserDetailsService"/>
|
||||
<property name="key" value="springRocks"/>
|
||||
</bean>
|
||||
|
||||
|
||||
<bean id="rememberMeAuthenticationProvider" class=
|
||||
"org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationProvider">
|
||||
<property name="key" value="springRocks"/>
|
||||
</bean>
|
||||
]]>
|
||||
]]>
|
||||
</programlisting>Don't forget to add your
|
||||
<interfacename>RememberMeServices</interfacename> implementation to your
|
||||
<literal>UsernamePasswordAuthenticationFilter.setRememberMeServices()</literal>
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
<info><title>Configuration</title></info>
|
||||
<para>A <literal>RunAsManager</literal> interface is provided by Spring Security:
|
||||
<programlisting>
|
||||
Authentication buildRunAs(Authentication authentication, Object object,
|
||||
Authentication buildRunAs(Authentication authentication, Object object,
|
||||
List<ConfigAttribute> config);
|
||||
boolean supports(ConfigAttribute attribute);
|
||||
boolean supports(Class clazz);
|
||||
@@ -88,7 +88,7 @@
|
||||
bean context with the same key:
|
||||
<programlisting>
|
||||
<![CDATA[
|
||||
<bean id="runAsManager"
|
||||
<bean id="runAsManager"
|
||||
class="org.springframework.security.access.intercept.RunAsManagerImpl">
|
||||
<property name="key" value="my_run_as_password"/>
|
||||
</bean>
|
||||
|
||||
@@ -47,15 +47,15 @@
|
||||
<literallayout>
|
||||
Security Debug Information
|
||||
|
||||
Authentication object is of type:
|
||||
Authentication object is of type:
|
||||
org.springframework.security.authentication.UsernamePasswordAuthenticationToken
|
||||
|
||||
Authentication object as a String:
|
||||
|
||||
org.springframework.security.authentication.UsernamePasswordAuthenticationToken@1f127853:
|
||||
Principal: org.springframework.security.core.userdetails.User@b07ed00: Username: rod; \
|
||||
Password: [PROTECTED]; Enabled: true; AccountNonExpired: true;
|
||||
credentialsNonExpired: true; AccountNonLocked: true; \
|
||||
Password: [PROTECTED]; Enabled: true; AccountNonExpired: true;
|
||||
credentialsNonExpired: true; AccountNonLocked: true; \
|
||||
Granted Authorities: ROLE_SUPERVISOR, ROLE_USER; \
|
||||
Password: [PROTECTED]; Authenticated: true; \
|
||||
Details: org.springframework.security.web.authentication.WebAuthenticationDetails@0: \
|
||||
@@ -67,7 +67,7 @@ Authentication object holds the following granted authorities:
|
||||
ROLE_SUPERVISOR (getAuthority(): ROLE_SUPERVISOR)
|
||||
ROLE_USER (getAuthority(): ROLE_USER)
|
||||
|
||||
Success! Your web filters appear to be properly configured!
|
||||
Success! Your web filters appear to be properly configured!
|
||||
</literallayout></para>
|
||||
<para>Once you successfully receive the above message, return to the sample application's
|
||||
home page and click "Manage". You can then try out the application. Notice that only the
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
interfaces. Spring's <classname>DelegatingFilterProxy</classname> provides the link between
|
||||
<filename>web.xml</filename> and the application context. </para>
|
||||
<para>When using <classname>DelegatingFilterProxy</classname>, you will see something like this
|
||||
in the <filename>web.xml</filename> file: <programlisting><![CDATA[
|
||||
in the <filename>web.xml</filename> file: <programlisting><![CDATA[
|
||||
<filter>
|
||||
<filter-name>myFilter</filter-name>
|
||||
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
|
||||
@@ -74,7 +74,7 @@
|
||||
filterSecurityInterceptor" />
|
||||
</sec:filter-chain-map>
|
||||
</bean>
|
||||
]]>
|
||||
]]>
|
||||
</programlisting> The namespace element <literal>filter-chain-map</literal> is used
|
||||
to set up the security filter chain(s) which are required within the
|
||||
application<footnote><para>Note that you'll need to include the security namespace in your
|
||||
|
||||
@@ -38,23 +38,23 @@
|
||||
<classname>AbstractAuthenticationProcessingFilter</classname>, so if you are using a
|
||||
customized form-login class, for example, you will need to inject it into both of these. In
|
||||
this case, a typical configuration, combining the namespace and custom beans might look like this:<programlisting><![CDATA[
|
||||
<http>
|
||||
<custom-filter position="FORM_LOGIN_FILTER" ref="myAuthFilter" />
|
||||
<session-management session-authentication-strategy-ref="sas"/>
|
||||
<http>
|
||||
<custom-filter position="FORM_LOGIN_FILTER" ref="myAuthFilter" />
|
||||
<session-management session-authentication-strategy-ref="sas"/>
|
||||
</http>
|
||||
|
||||
<beans:bean id="myAuthFilter"
|
||||
|
||||
<beans:bean id="myAuthFilter"
|
||||
class="org.springframework.security.web.authentcation.UsernamePasswordAuthenticationFilter">
|
||||
<beans:property name="sessionAuthenticationStrategy" ref="sas" />
|
||||
...
|
||||
</beans:bean>
|
||||
|
||||
<beans:bean id="sas"
|
||||
|
||||
<beans:bean id="sas"
|
||||
class="org.springframework.security.web.session.DefaultAuthenticatedSessionStrategy">
|
||||
<beans:property name="sessionRegistry" ref="sessionRegistry" />
|
||||
<beans:property name="maximumSessions" value="1" />
|
||||
</beans:bean>
|
||||
]]>
|
||||
]]>
|
||||
</programlisting></para>
|
||||
</section>
|
||||
<section xml:id="concurrent-sessions">
|
||||
@@ -87,7 +87,7 @@
|
||||
<listener-class>
|
||||
org.springframework.security.web.session.HttpSessionEventPublisher
|
||||
</listener-class>
|
||||
</listener> ]]>
|
||||
</listener> ]]>
|
||||
</programlisting></para>
|
||||
<para>In addition, you will need to add the <literal>ConcurrentSessionFilter</literal> to your
|
||||
<classname>FilterChainProxy</classname>. The <classname>ConcurrentSessionFilter</classname>
|
||||
@@ -97,32 +97,32 @@
|
||||
to create the <classname>FilterChainProxy</classname> and other default beans might look like
|
||||
this: <programlisting><![CDATA[
|
||||
<http>
|
||||
<custom-filter position="CONCURRENT_SESSION_FILTER" ref="concurrencyFilter" />
|
||||
<custom-filter position="AUTHENTICATION_PROCESSING_FILTER" ref="myAuthFilter" />
|
||||
|
||||
<session-management session-authentication-strategy-ref="sas"/>
|
||||
<custom-filter position="CONCURRENT_SESSION_FILTER" ref="concurrencyFilter" />
|
||||
<custom-filter position="AUTHENTICATION_PROCESSING_FILTER" ref="myAuthFilter" />
|
||||
|
||||
<session-management session-authentication-strategy-ref="sas"/>
|
||||
</http>
|
||||
|
||||
<beans:bean id="concurrencyFilter"
|
||||
|
||||
<beans:bean id="concurrencyFilter"
|
||||
class="org.springframework.security.web.session.ConcurrentSessionFilter">
|
||||
<beans:property name="sessionRegistry" ref="sessionRegistry" />
|
||||
<beans:property name="expiredUrl" value="/session-expired.htm" />
|
||||
</beans:bean>
|
||||
|
||||
<beans:bean id="myAuthFilter"
|
||||
|
||||
<beans:bean id="myAuthFilter"
|
||||
class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
|
||||
<beans:property name="sessionAuthenticationStrategy" ref="sas" />
|
||||
<beans:property name="authenticationManager" ref="authenticationManager" />
|
||||
</beans:bean>
|
||||
|
||||
<beans:bean id="sas"
|
||||
|
||||
<beans:bean id="sas"
|
||||
class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy">
|
||||
<beans:constructor-arg name="sessionRegistry" ref="sessionRegistry" />
|
||||
<beans:property name="maximumSessions" value="1" />
|
||||
</beans:bean>
|
||||
|
||||
|
||||
<beans:bean id="sessionRegistry" class="org.springframework.security.core.session.SessionRegistryImpl" />
|
||||
]]>
|
||||
]]>
|
||||
</programlisting></para>
|
||||
<para>Adding the listener to <filename>web.xml</filename> causes an
|
||||
<literal>ApplicationEvent</literal> to be published to the Spring
|
||||
|
||||
@@ -120,7 +120,7 @@
|
||||
<xi:include href="session-mgmt.xml"/>
|
||||
<xi:include href="anon-auth-provider.xml"/>
|
||||
</part>
|
||||
<!--
|
||||
<!--
|
||||
<part xml:id="authentication">
|
||||
<title>Authentication</title>
|
||||
<partintro>
|
||||
@@ -165,8 +165,8 @@
|
||||
</part>
|
||||
<part xml:id="advanced-topics">
|
||||
<title>Additional Topics</title>
|
||||
<!--
|
||||
Essentially standalone features which do not have to follow on directly from earlier chapters
|
||||
<!--
|
||||
Essentially standalone features which do not have to follow on directly from earlier chapters
|
||||
-->
|
||||
<partintro>
|
||||
<para> In this part we cover features which require a knowledge of previous chapters as well
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<literal><http></literal> namespace configuration to make sure this service is
|
||||
available). So, for example, you might
|
||||
have<programlisting><sec:authorize access="hasRole('supervisor')">
|
||||
|
||||
|
||||
This content will only be visible to users who have
|
||||
the "supervisor" authority in their list of <tt>GrantedAuthority</tt>s.
|
||||
|
||||
|
||||
@@ -592,7 +592,7 @@ Successfully authenticated. Security context contains: \
|
||||
below:</para>
|
||||
<para>
|
||||
<programlisting><![CDATA[
|
||||
<bean id="messageSource"
|
||||
<bean id="messageSource"
|
||||
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
|
||||
<property name="basename" value="org/springframework/security/messages"/>
|
||||
</bean>
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
interfaces. Spring's <classname>DelegatingFilterProxy</classname> provides the link between
|
||||
<filename>web.xml</filename> and the application context. </para>
|
||||
<para>When using <classname>DelegatingFilterProxy</classname>, you will see something like
|
||||
this in the <filename>web.xml</filename> file: <programlisting><![CDATA[
|
||||
this in the <filename>web.xml</filename> file: <programlisting><![CDATA[
|
||||
<filter>
|
||||
<filter-name>myFilter</filter-name>
|
||||
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
|
||||
@@ -77,7 +77,7 @@
|
||||
filterSecurityInterceptor" />
|
||||
</sec:filter-chain-map>
|
||||
</bean>
|
||||
]]>
|
||||
]]>
|
||||
</programlisting> The namespace element <literal>filter-chain-map</literal> is
|
||||
used to set up the security filter chain(s) which are required within the application<footnote>
|
||||
<para>Note that you'll need to include the security namespace in your application context
|
||||
@@ -132,7 +132,7 @@
|
||||
<section>
|
||||
<title>Filter Ordering</title>
|
||||
<para>The order that filters are defined in the chain is very important. Irrespective of which
|
||||
filters you are actually using, the order should be as follows:
|
||||
filters you are actually using, the order should be as follows:
|
||||
<orderedlist>
|
||||
<listitem>
|
||||
<para><classname>ChannelProcessingFilter</classname>, because it might need to redirect
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<chapter xmlns="http://docbook.org/ns/docbook" version="5.0" xml:id="x509">
|
||||
<info><title>X.509 Authentication</title></info>
|
||||
|
||||
|
||||
<section xml:id="x509-overview"><info><title>Overview</title></info>
|
||||
|
||||
|
||||
<para>The most common use of X.509 certificate authentication is in verifying the identity
|
||||
of a server when using SSL, most commonly when using HTTPS from a browser. The browser
|
||||
will automatically check that the certificate presented by a server has been issued (ie
|
||||
@@ -13,7 +13,7 @@
|
||||
will authenticate the client by checking that its certificate is signed by an
|
||||
acceptable authority. If a valid certificate has been provided, it can be obtained
|
||||
through the servlet API in an application. Spring Security X.509 module extracts the
|
||||
certificate using a filter. It maps the certificate to an application user and loads that
|
||||
certificate using a filter. It maps the certificate to an application user and loads that
|
||||
user's set of granted authorities for use with the standard Spring Security infrastructure.</para>
|
||||
<para>You should be familiar with using certificates and setting up client authentication
|
||||
for your servlet container before attempting to use it with Spring Security. Most of the
|
||||
@@ -22,7 +22,7 @@
|
||||
you get this working before trying it out with Spring Security</para>
|
||||
</section>
|
||||
<section><info><title>Adding X.509 Authentication to Your Web Application</title></info>
|
||||
|
||||
|
||||
<para> Enabling X.509 client authentication is very straightforward. Just add the <literal><x509/></literal> element to your http security namespace configuration. <programlisting>
|
||||
<http>
|
||||
...
|
||||
@@ -55,31 +55,31 @@
|
||||
</section>
|
||||
<section xml:id="x509-ssl-config">
|
||||
<info><title>Setting up SSL in Tomcat</title></info>
|
||||
|
||||
<para>There are some pre-generated certificates in the
|
||||
<filename>samples/certificate</filename> directory in the Spring Security project.
|
||||
|
||||
<para>There are some pre-generated certificates in the
|
||||
<filename>samples/certificate</filename> directory in the Spring Security project.
|
||||
You can use these to enable SSL for testing if you don't want to generate your own. The file
|
||||
<filename>server.jks</filename> contains the server certificate, private key and the
|
||||
issuing certificate authority certificate. There are also some client certificate files
|
||||
for the users from the sample applications. You can install these in your browser to enable
|
||||
issuing certificate authority certificate. There are also some client certificate files
|
||||
for the users from the sample applications. You can install these in your browser to enable
|
||||
SSL client authentication.
|
||||
</para>
|
||||
<para>
|
||||
To run tomcat with SSL support, drop the <filename>server.jks</filename> file into the
|
||||
To run tomcat with SSL support, drop the <filename>server.jks</filename> file into the
|
||||
tomcat <filename>conf</filename> directory and add the following connector to the
|
||||
<filename>server.xml</filename> file
|
||||
<programlisting>
|
||||
<filename>server.xml</filename> file
|
||||
<programlisting>
|
||||
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" scheme="https" secure="true"
|
||||
clientAuth="true" sslProtocol="TLS"
|
||||
clientAuth="true" sslProtocol="TLS"
|
||||
keystoreFile="${catalina.home}/conf/server.jks"
|
||||
keystoreType="JKS" keystorePass="password"
|
||||
truststoreFile="${catalina.home}/conf/server.jks"
|
||||
truststoreType="JKS" truststorePass="password"
|
||||
/>
|
||||
/>
|
||||
</programlisting>
|
||||
<parameter>clientAuth</parameter> can also be set to <parameter>want</parameter> if you still
|
||||
want SSL connections to succeed even if the client doesn't provide a certificate.
|
||||
Clients which don't present a certificate won't be able to access any objects secured by
|
||||
Clients which don't present a certificate won't be able to access any objects secured by
|
||||
Spring Security unless you use a non-X.509 authentication mechanism, such as form authentication.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
Reference in New Issue
Block a user