|
|
|
|
@ -5,20 +5,25 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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> |
|
|
|
|
|