|  | @@ -5,20 +5,25 @@
 | 
	
		
			
				|  |  |   | $Id$
 | 
	
		
			
				|  |  |   -->
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  <xsl:output doctype-public="-//SPRING//DTD BEAN//EN"
 | 
	
		
			
				|  |  |              doctype-system="http://www.springframework.org/dtd/spring-beans.dtd"
 | 
	
		
			
				|  |  |              indent="yes"/>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +<!-- Variables for case conversions -->
 | 
	
		
			
				|  |  |  <xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'"/>
 | 
	
		
			
				|  |  |  <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>    
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  <xsl:variable name="welcome-files" select="web-app/welcome-file-list/welcome-file"/>
 | 
	
		
			
				|  |  | -<!-- convert the auth-method content to upper case -->
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +<!-- Convert the auth-method content to upper case -->
 | 
	
		
			
				|  |  |  <xsl:variable name="auth-method" select="translate(string(web-app/login-config/auth-method), $lowercase, $uppercase)"/>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +<!-- 
 | 
	
		
			
				|  |  | + | Find the security-role elements in the file and uses them to build a list of 
 | 
	
		
			
				|  |  | + | all defined roles. 
 | 
	
		
			
				|  |  | + -->
 | 
	
		
			
				|  |  |  <xsl:variable name="all-roles">
 | 
	
		
			
				|  |  |      <xsl:for-each select="web-app/security-role/role-name">
 | 
	
		
			
				|  |  |          <xsl:text>ROLE_</xsl:text>
 | 
	
	
		
			
				|  | @@ -27,7 +32,9 @@
 | 
	
		
			
				|  |  |      </xsl:for-each>    
 | 
	
		
			
				|  |  |  </xsl:variable>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -<!-- The list of filters for use in filterToBeanProxy -->
 | 
	
		
			
				|  |  | +<!-- 
 | 
	
		
			
				|  |  | + | The list of filters for use in filterToBeanProxy 
 | 
	
		
			
				|  |  | + -->
 | 
	
		
			
				|  |  |  <xsl:variable name="filter-list">
 | 
	
		
			
				|  |  |  <xsl:text>/**=httpSessionContextIntegrationFilter</xsl:text>
 | 
	
		
			
				|  |  |  <xsl:choose>
 | 
	
	
		
			
				|  | @@ -44,8 +51,9 @@
 | 
	
		
			
				|  |  |  <xsl:text>,rememberMeProcessingFilter,anonymousProcessingFilter,securityEnforcementFilter</xsl:text>
 | 
	
		
			
				|  |  |  </xsl:variable>
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | +<!-- 
 | 
	
		
			
				|  |  | + | The main template (where the processing work starts)
 | 
	
		
			
				|  |  | + -->    
 | 
	
		
			
				|  |  |  <xsl:template match = "web-app">
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  <beans>
 | 
	
	
		
			
				|  | @@ -57,6 +65,10 @@
 | 
	
		
			
				|  |  |  </beans>
 | 
	
		
			
				|  |  |  </xsl:template>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +<!--
 | 
	
		
			
				|  |  | + | Mainly static set of beans. The InMemoryDaoImpl instance is created with a single user
 | 
	
		
			
				|  |  | + | called "superuser" who has all the defined roles in the web.xml file.
 | 
	
		
			
				|  |  | + -->   
 | 
	
		
			
				|  |  |  <xsl:template name="authentication-beans">
 | 
	
		
			
				|  |  |      <xsl:comment>======================== AUTHENTICATION =======================</xsl:comment>
 | 
	
		
			
				|  |  |      
 | 
	
	
		
			
				|  | @@ -110,9 +122,26 @@
 | 
	
		
			
				|  |  |      </bean>    
 | 
	
		
			
				|  |  |  </xsl:template>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -<!-- login configuration -->
 | 
	
		
			
				|  |  | +<!-- 
 | 
	
		
			
				|  |  | + | Processes the login-config definition and inserts the SecurityEnforcementFilter with 
 | 
	
		
			
				|  |  | + | the appropriate beans for either form or basic authentication.
 | 
	
		
			
				|  |  | + -->
 | 
	
		
			
				|  |  |  <xsl:template match="login-config">
 | 
	
		
			
				|  |  | -    <xsl:call-template name="security-enforcement-filter"/>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   <bean id="securityEnforcementFilter" class="net.sf.acegisecurity.intercept.web.SecurityEnforcementFilter">
 | 
	
		
			
				|  |  | +      <property name="filterSecurityInterceptor"><ref local="filterInvocationInterceptor"/></property>
 | 
	
		
			
				|  |  | +      <property name="authenticationEntryPoint">
 | 
	
		
			
				|  |  | +    <xsl:choose>
 | 
	
		
			
				|  |  | +        <xsl:when test="$auth-method = 'FORM'">
 | 
	
		
			
				|  |  | +      <ref local="authenticationProcessingFilterEntryPoint"/>
 | 
	
		
			
				|  |  | +        </xsl:when>
 | 
	
		
			
				|  |  | +        <xsl:when test="$auth-method = 'BASIC'">
 | 
	
		
			
				|  |  | +      <ref local="basicProcessingFilterEntryPoint"/>              
 | 
	
		
			
				|  |  | +        </xsl:when>
 | 
	
		
			
				|  |  | +    </xsl:choose>
 | 
	
		
			
				|  |  | +      </property>
 | 
	
		
			
				|  |  | +   </bean>    
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      <xsl:choose>
 | 
	
		
			
				|  |  |          <xsl:when test="$auth-method = 'FORM'">
 | 
	
		
			
				|  |  |              <xsl:call-template name="form-login"/>
 | 
	
	
		
			
				|  | @@ -132,23 +161,29 @@
 | 
	
		
			
				|  |  |  </xsl:template>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  <!-- 
 | 
	
		
			
				|  |  | - | Inserts the security enforcement filter bean with the appropriate entry point 
 | 
	
		
			
				|  |  | - | (depending on whether FORM or BASIC authentication is selected in web.xml). 
 | 
	
		
			
				|  |  | - -->    
 | 
	
		
			
				|  |  | -<xsl:template name="security-enforcement-filter">
 | 
	
		
			
				|  |  | -   <bean id="securityEnforcementFilter" class="net.sf.acegisecurity.intercept.web.SecurityEnforcementFilter">
 | 
	
		
			
				|  |  | -      <property name="filterSecurityInterceptor"><ref local="filterInvocationInterceptor"/></property>
 | 
	
		
			
				|  |  | -      <property name="authenticationEntryPoint">
 | 
	
		
			
				|  |  | -    <xsl:choose>
 | 
	
		
			
				|  |  | -        <xsl:when test="$auth-method = 'FORM'">
 | 
	
		
			
				|  |  | -      <ref local="authenticationProcessingFilterEntryPoint"/>
 | 
	
		
			
				|  |  | -        </xsl:when>
 | 
	
		
			
				|  |  | -        <xsl:when test="$auth-method = 'BASIC'">
 | 
	
		
			
				|  |  | -      <ref local="basicProcessingFilterEntryPoint"/>              
 | 
	
		
			
				|  |  | -        </xsl:when>
 | 
	
		
			
				|  |  | -    </xsl:choose>
 | 
	
		
			
				|  |  | -      </property>
 | 
	
		
			
				|  |  | + |   Converts a form login configuration to an Acegi AuthenticationProcessingFilter and its entry point.
 | 
	
		
			
				|  |  | + |   The content of the form-login-page element is used for the loginFormUrl property of the entry point 
 | 
	
		
			
				|  |  | + |   and the form-error-page is used for the authenticationFailureUrl property of the filter.
 | 
	
		
			
				|  |  | + |   
 | 
	
		
			
				|  |  | + |   The user must manually change the form Url to "j_acegi_security_check" in their login page.
 | 
	
		
			
				|  |  | + -->
 | 
	
		
			
				|  |  | +<xsl:template name="form-login">
 | 
	
		
			
				|  |  | +    <xsl:message>Processing form login configuration</xsl:message>
 | 
	
		
			
				|  |  | +    <xsl:message>Remember to switch your login form action from "j_security_check" to "j_acegi_security_check"</xsl:message>       
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +   <bean id="authenticationProcessingFilter" class="net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
 | 
	
		
			
				|  |  | +      <property name="authenticationManager"><ref bean="authenticationManager"/></property>
 | 
	
		
			
				|  |  | +      <property name="authenticationFailureUrl"><value><xsl:value-of select="form-login-config/form-error-page"/></value></property>
 | 
	
		
			
				|  |  | +      <property name="defaultTargetUrl"><value></value></property>
 | 
	
		
			
				|  |  | +      <property name="filterProcessesUrl"><value>/j_acegi_security_check</value></property>
 | 
	
		
			
				|  |  | +      <property name="rememberMeServices"><ref local="rememberMeServices"/></property>
 | 
	
		
			
				|  |  |     </bean>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   <bean id="authenticationProcessingFilterEntryPoint" class="net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
 | 
	
		
			
				|  |  | +      <property name="loginFormUrl"><value><xsl:value-of select="form-login-config/form-login-page"/></value></property>
 | 
	
		
			
				|  |  | +      <property name="forceHttps"><value>false</value></property>
 | 
	
		
			
				|  |  | +   </bean> 
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  |  </xsl:template>
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |  <!--
 | 
	
	
		
			
				|  | @@ -171,88 +206,63 @@
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  </xsl:template>
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  | -<!-- 
 | 
	
		
			
				|  |  | -    Converts a form login configuration to an Acegi AuthenticationProcessingFilter and its entry point.
 | 
	
		
			
				|  |  | -    The content of the form-login-page element is used for the loginFormUrl property of the entry point 
 | 
	
		
			
				|  |  | -    and the form-error-page is used for the authenticationFailureUrl property of the filter.
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -    The user must manually change the form Url to "j_acegi_security_check"
 | 
	
		
			
				|  |  | - -->
 | 
	
		
			
				|  |  | -    <xsl:template name="form-login">
 | 
	
		
			
				|  |  | -        <xsl:message>Processing form login configuration</xsl:message>
 | 
	
		
			
				|  |  | -        <xsl:message>Remember to switch your login form action from "j_security_check" to "j_acegi_security_check"</xsl:message>       
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | -   <bean id="authenticationProcessingFilter" class="net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
 | 
	
		
			
				|  |  | -      <property name="authenticationManager"><ref bean="authenticationManager"/></property>
 | 
	
		
			
				|  |  | -      <property name="authenticationFailureUrl"><value><xsl:value-of select="form-login-config/form-error-page"/></value></property>
 | 
	
		
			
				|  |  | -      <property name="defaultTargetUrl"><value></value></property>
 | 
	
		
			
				|  |  | -      <property name="filterProcessesUrl"><value>/j_acegi_security_check</value></property>
 | 
	
		
			
				|  |  | -      <property name="rememberMeServices"><ref local="rememberMeServices"/></property>
 | 
	
		
			
				|  |  | -   </bean>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   <bean id="authenticationProcessingFilterEntryPoint" class="net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
 | 
	
		
			
				|  |  | -      <property name="loginFormUrl"><value><xsl:value-of select="form-login-config/form-login-page"/></value></property>
 | 
	
		
			
				|  |  | -      <property name="forceHttps"><value>false</value></property>
 | 
	
		
			
				|  |  | -   </bean> 
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | -    </xsl:template>
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -    <xsl:template name="filter-invocation-interceptor">
 | 
	
		
			
				|  |  | -        <bean id="httpRequestAccessDecisionManager" class="net.sf.acegisecurity.vote.AffirmativeBased">
 | 
	
		
			
				|  |  | -            <property name="allowIfAllAbstainDecisions"><value>false</value></property>
 | 
	
		
			
				|  |  | -            <property name="decisionVoters">
 | 
	
		
			
				|  |  | -                <list>
 | 
	
		
			
				|  |  | -                    <ref bean="roleVoter"/>
 | 
	
		
			
				|  |  | -                </list>
 | 
	
		
			
				|  |  | -            </property>
 | 
	
		
			
				|  |  | -        </bean>
 | 
	
		
			
				|  |  | +<xsl:template name="filter-invocation-interceptor">
 | 
	
		
			
				|  |  | +    <bean id="httpRequestAccessDecisionManager" class="net.sf.acegisecurity.vote.AffirmativeBased">
 | 
	
		
			
				|  |  | +        <property name="allowIfAllAbstainDecisions"><value>false</value></property>
 | 
	
		
			
				|  |  | +        <property name="decisionVoters">
 | 
	
		
			
				|  |  | +            <list>
 | 
	
		
			
				|  |  | +                <ref bean="roleVoter"/>
 | 
	
		
			
				|  |  | +            </list>
 | 
	
		
			
				|  |  | +        </property>
 | 
	
		
			
				|  |  | +    </bean>
 | 
	
		
			
				|  |  |          
 | 
	
		
			
				|  |  | -       <!-- An access decision voter that reads ROLE_* configuration settings -->
 | 
	
		
			
				|  |  | +    <xsl:comment>An access decision voter that reads ROLE_* configuration settings</xsl:comment>
 | 
	
		
			
				|  |  |          <bean id="roleVoter" class="net.sf.acegisecurity.vote.RoleVoter"/>        
 | 
	
		
			
				|  |  |          
 | 
	
		
			
				|  |  |          <xsl:text>
</xsl:text>
 | 
	
		
			
				|  |  | -       <xsl:comment> 
 | 
	
		
			
				|  |  | +    <xsl:comment> 
 | 
	
		
			
				|  |  |         Note the order that entries are placed against the objectDefinitionSource is critical.
 | 
	
		
			
				|  |  |         The FilterSecurityInterceptor will work from the top of the list down to the FIRST pattern that matches the request URL.
 | 
	
		
			
				|  |  |         Accordingly, you should place MOST SPECIFIC (ie a/b/c/d.*) expressions first, with LEAST SPECIFIC (ie a/.*) expressions last
 | 
	
		
			
				|  |  | -       </xsl:comment>
 | 
	
		
			
				|  |  | -        <bean id="filterInvocationInterceptor" class="net.sf.acegisecurity.intercept.web.FilterSecurityInterceptor">
 | 
	
		
			
				|  |  | -          <property name="authenticationManager"><ref bean="authenticationManager"/></property>
 | 
	
		
			
				|  |  | -          <property name="accessDecisionManager"><ref local="httpRequestAccessDecisionManager"/></property>
 | 
	
		
			
				|  |  | -          <property name="objectDefinitionSource">
 | 
	
		
			
				|  |  | -             <value>
 | 
	
		
			
				|  |  | -                <xsl:text>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
</xsl:text>                 
 | 
	
		
			
				|  |  | -                <xsl:text>PATTERN_TYPE_APACHE_ANT
</xsl:text>
 | 
	
		
			
				|  |  | -                <xsl:apply-templates select="security-constraint"/>
 | 
	
		
			
				|  |  | -             </value>
 | 
	
		
			
				|  |  | -          </property>
 | 
	
		
			
				|  |  | -        </bean>        
 | 
	
		
			
				|  |  | -    </xsl:template>
 | 
	
		
			
				|  |  | +    </xsl:comment>
 | 
	
		
			
				|  |  | +    <bean id="filterInvocationInterceptor" class="net.sf.acegisecurity.intercept.web.FilterSecurityInterceptor">
 | 
	
		
			
				|  |  | +      <property name="authenticationManager"><ref bean="authenticationManager"/></property>
 | 
	
		
			
				|  |  | +      <property name="accessDecisionManager"><ref local="httpRequestAccessDecisionManager"/></property>
 | 
	
		
			
				|  |  | +      <property name="objectDefinitionSource">
 | 
	
		
			
				|  |  | +         <value>
 | 
	
		
			
				|  |  | +            <xsl:text>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
</xsl:text>                 
 | 
	
		
			
				|  |  | +            <xsl:text>PATTERN_TYPE_APACHE_ANT
</xsl:text>
 | 
	
		
			
				|  |  | +            <xsl:apply-templates select="security-constraint"/>
 | 
	
		
			
				|  |  | +         </value>
 | 
	
		
			
				|  |  | +      </property>
 | 
	
		
			
				|  |  | +    </bean>        
 | 
	
		
			
				|  |  | +</xsl:template>
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  | -    <xsl:template match="security-constraint">
 | 
	
		
			
				|  |  | -        <xsl:value-of select="web-resource-collection/url-pattern"/>
 | 
	
		
			
				|  |  | -        <xsl:text>=</xsl:text>
 | 
	
		
			
				|  |  | -        <xsl:for-each select="./auth-constraint/role-name">
 | 
	
		
			
				|  |  | -            <xsl:choose>
 | 
	
		
			
				|  |  | -                <xsl:when test="string() = '*'">
 | 
	
		
			
				|  |  | -                    <xsl:value-of select="$all-roles"/>
 | 
	
		
			
				|  |  | -                </xsl:when>
 | 
	
		
			
				|  |  | -                <xsl:otherwise>
 | 
	
		
			
				|  |  | -                    <xsl:text>ROLE_</xsl:text>
 | 
	
		
			
				|  |  | -                    <xsl:value-of select="translate(string(), $lowercase, $uppercase)"/>
 | 
	
		
			
				|  |  | -                </xsl:otherwise>
 | 
	
		
			
				|  |  | -            </xsl:choose>
 | 
	
		
			
				|  |  | -            <xsl:if test="position() != last()">,</xsl:if>
 | 
	
		
			
				|  |  | -        </xsl:for-each>
 | 
	
		
			
				|  |  | -        <xsl:text>
</xsl:text>
 | 
	
		
			
				|  |  | -    </xsl:template>
 | 
	
		
			
				|  |  | +<!-- 
 | 
	
		
			
				|  |  | + | Converts a security-constraint (a url-pattern and the associated role-name elements)
 | 
	
		
			
				|  |  | + | to the form
 | 
	
		
			
				|  |  | + |     antUrlPattern=list of allowed roles
 | 
	
		
			
				|  |  | + | Roles are converted to upper case and have the "ROLE_" prefix appended.
 | 
	
		
			
				|  |  | + |
 | 
	
		
			
				|  |  | + | In the case of role-name='*', signifying "any authenticated role", the complete list of roles 
 | 
	
		
			
				|  |  | + | defined in the web.xml file is used. 
 | 
	
		
			
				|  |  | + -->
 | 
	
		
			
				|  |  | +<xsl:template match="security-constraint">
 | 
	
		
			
				|  |  | +    <xsl:value-of select="web-resource-collection/url-pattern"/>
 | 
	
		
			
				|  |  | +    <xsl:text>=</xsl:text>
 | 
	
		
			
				|  |  | +    <xsl:for-each select="./auth-constraint/role-name">
 | 
	
		
			
				|  |  | +        <xsl:choose>
 | 
	
		
			
				|  |  | +            <xsl:when test="string() = '*'">
 | 
	
		
			
				|  |  | +                <xsl:value-of select="$all-roles"/>
 | 
	
		
			
				|  |  | +            </xsl:when>
 | 
	
		
			
				|  |  | +            <xsl:otherwise>
 | 
	
		
			
				|  |  | +                <xsl:text>ROLE_</xsl:text>
 | 
	
		
			
				|  |  | +                <xsl:value-of select="translate(string(), $lowercase, $uppercase)"/>
 | 
	
		
			
				|  |  | +            </xsl:otherwise>
 | 
	
		
			
				|  |  | +        </xsl:choose>
 | 
	
		
			
				|  |  | +        <xsl:if test="position() != last()">,</xsl:if>
 | 
	
		
			
				|  |  | +    </xsl:for-each>
 | 
	
		
			
				|  |  | +    <xsl:text>
</xsl:text>
 | 
	
		
			
				|  |  | +</xsl:template>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    <xsl:template name="list-roles">
 | 
	
		
			
				|  |  | -        <xsl:for-each select="security-role/role-name">
 | 
	
		
			
				|  |  | -            <xsl:text>ROLE_</xsl:text>
 | 
	
		
			
				|  |  | -            <xsl:value-of select="translate(string(), $lowercase, $uppercase)"/>           
 | 
	
		
			
				|  |  | -            <xsl:if test="position() != last()">,</xsl:if>
 | 
	
		
			
				|  |  | -        </xsl:for-each>
 | 
	
		
			
				|  |  | -    </xsl:template>    
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  |  </xsl:stylesheet>
 |