import
This commit is contained in:
117
conf/authn/authn-comparison.xml
Normal file
117
conf/authn/authn-comparison.xml
Normal file
@@ -0,0 +1,117 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:util="http://www.springframework.org/schema/util"
|
||||
xmlns:p="http://www.springframework.org/schema/p"
|
||||
xmlns:c="http://www.springframework.org/schema/c"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
|
||||
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
|
||||
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
|
||||
|
||||
default-init-method="initialize"
|
||||
default-destroy-method="destroy">
|
||||
|
||||
<!--
|
||||
This is a map used to "weight" particular methods above others if the IdP has to randomly select one
|
||||
to insert into a SAML authentication statement. The typical use shown below is to bias the IdP in favor
|
||||
of expressing the SAML 2 PasswordProtectedTransport class over the more vanilla Password class on the
|
||||
assumption that the IdP doesn't accept passwords via an insecure channel. This map never causes the IdP
|
||||
to violate its matching rules if an RP requests a particular value; it only matters when nothing specific
|
||||
is chosen. Anything not in the map has a weight of zero.
|
||||
-->
|
||||
|
||||
<util:map id="shibboleth.AuthenticationPrincipalWeightMap">
|
||||
<entry>
|
||||
<key>
|
||||
<bean parent="shibboleth.SAML2AuthnContextClassRef"
|
||||
c:classRef="urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport" />
|
||||
</key>
|
||||
<value>1</value>
|
||||
</entry>
|
||||
</util:map>
|
||||
|
||||
<!--
|
||||
Uncomment and add entries to this map to support "inexact" SAML RequestedAuthnContext operators.
|
||||
Please refer to the AuthenticationFlowSelection documentation topic for details and examples.
|
||||
-->
|
||||
<!--
|
||||
<util:map id="shibboleth.AuthnComparisonRules">
|
||||
</util:map>
|
||||
-->
|
||||
|
||||
<!-- List of context classes or declarations to ignore if an SP requests them. -->
|
||||
|
||||
<util:list id="shibboleth.IgnoredContexts">
|
||||
<value>urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified</value>
|
||||
</util:list>
|
||||
|
||||
<!--
|
||||
Mappings to transform custom Principals for proxied AuthnRequests.
|
||||
Key is the input, value is a collection of possibly empty outputs.
|
||||
Used by default to transform authentication type values from
|
||||
SPs -> Proxied IdPs.
|
||||
-->
|
||||
<util:map id="shibboleth.PrincipalProxyRequestMappings">
|
||||
<!--
|
||||
<entry>
|
||||
<key>
|
||||
<bean parent="shibboleth.SAML1AuthenticationMethod"
|
||||
c:classRef="https://sp.example.org/context" />
|
||||
</key>
|
||||
<list>
|
||||
<bean parent="shibboleth.SAML2AuthnContextClassRef"
|
||||
c:classRef="https://proxy.example.org/context1" />
|
||||
<bean parent="shibboleth.SAML2AuthnContextClassRef"
|
||||
c:classRef="https://proxy.example.org/context2" />
|
||||
</list>
|
||||
</entry>
|
||||
<entry>
|
||||
<key>
|
||||
<bean parent="shibboleth.SAML2AuthnContextClassRef"
|
||||
c:classRef="https://sp.example.org/context" />
|
||||
</key>
|
||||
<list>
|
||||
<bean parent="shibboleth.SAML2AuthnContextClassRef"
|
||||
c:classRef="https://proxy.example.org/context1" />
|
||||
<bean parent="shibboleth.SAML2AuthnContextClassRef"
|
||||
c:classRef="https://proxy.example.org/context2" />
|
||||
</list>
|
||||
</entry>
|
||||
-->
|
||||
</util:map>
|
||||
|
||||
<!--
|
||||
Mappings to transform proxied Principals for inclusion in Subjects.
|
||||
Key is the input, value is a collection of possibly empty outputs.
|
||||
Used by default to transform values from Proxied IdP. ->
|
||||
-->
|
||||
<util:map id="shibboleth.PrincipalProxyResponseMappings">
|
||||
<!--
|
||||
<entry>
|
||||
<key>
|
||||
<bean parent="shibboleth.SAML2AuthnContextClassRef"
|
||||
c:classRef="https://proxy.example.org/context1" />
|
||||
</key>
|
||||
<list>
|
||||
<bean parent="shibboleth.SAML1AuthenticationMethod"
|
||||
c:classRef="https://sp.example.org/context" />
|
||||
<bean parent="shibboleth.SAML2AuthnContextClassRef"
|
||||
c:classRef="https://sp.example.org/context" />
|
||||
</list>
|
||||
</entry>
|
||||
<entry>
|
||||
<key>
|
||||
<bean parent="shibboleth.SAML2AuthnContextClassRef"
|
||||
c:classRef="https://proxy.example.org/context2" />
|
||||
</key>
|
||||
<list>
|
||||
<bean parent="shibboleth.SAML1AuthenticationMethod"
|
||||
c:classRef="https://sp.example.org/context" />
|
||||
<bean parent="shibboleth.SAML2AuthnContextClassRef"
|
||||
c:classRef="https://sp.example.org/context" />
|
||||
</list>
|
||||
</entry>
|
||||
-->
|
||||
</util:map>
|
||||
|
||||
</beans>
|
22
conf/authn/authn-events-flow.xml
Normal file
22
conf/authn/authn-events-flow.xml
Normal file
@@ -0,0 +1,22 @@
|
||||
<flow xmlns="http://www.springframework.org/schema/webflow"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow.xsd"
|
||||
abstract="true">
|
||||
|
||||
<!-- ADVANCED USE ONLY -->
|
||||
|
||||
<!--
|
||||
You can ignore this file unless you are creating your own custom login subflows that want to
|
||||
report custom events in response to unusual error or warning conditions.
|
||||
-->
|
||||
|
||||
<!-- Custom error events to reflect back from user-supplied login subflows. -->
|
||||
|
||||
<!-- <end-state id="MyCustomEvent" /> -->
|
||||
|
||||
<global-transitions>
|
||||
<!-- <transition on="MyCustomEvent" to="MyCustomEvent" /> -->
|
||||
<transition on="#{!'proceed'.equals(currentEvent.id)}" to="InvalidEvent" />
|
||||
</global-transitions>
|
||||
|
||||
</flow>
|
218
conf/authn/authn.properties
Normal file
218
conf/authn/authn.properties
Normal file
@@ -0,0 +1,218 @@
|
||||
# Properties that control authentication generally and the behavior of
|
||||
# specific methods.
|
||||
|
||||
# Regular expression matching login flows to enable, e.g. IPAddress|Password
|
||||
#idp.authn.flows = Password
|
||||
|
||||
# Default settings for most authentication methods.
|
||||
#idp.authn.defaultLifetime = PT1H
|
||||
#idp.authn.defaultTimeout = PT30M
|
||||
#idp.authn.proxyRestrictionsEnforced = true
|
||||
|
||||
# Whether to populate relying party user interface information for display
|
||||
# during authentication, consent, terms-of-use.
|
||||
#idp.authn.rpui = true
|
||||
|
||||
# Whether to prioritize "active" results when an SP requests more than
|
||||
# one possible matching login method (V2 behavior was to favor them)
|
||||
#idp.authn.favorSSO = false
|
||||
|
||||
# Whether to fail requests when a user identity after authentication
|
||||
# doesn't match the identity in a pre-existing session.
|
||||
#idp.authn.identitySwitchIsError = false
|
||||
|
||||
# If using IdP discovery feature, provides a discovery location to use.
|
||||
#idp.authn.discoveryURL = https://ds.example.org/shibboleth-ds/index.html
|
||||
|
||||
# Properties below override specific method behavior, as an alternative
|
||||
# to defining Spring beans in XML. Refer to the documentation for a complete
|
||||
# list. Many of the properties below are mentioned only because they are
|
||||
# atypical defaults assumed for a given method.
|
||||
|
||||
# Flow selection among multiple equivalent options can be managed with
|
||||
# the order properties, lower will be tried first.
|
||||
|
||||
#### Password ####
|
||||
|
||||
#idp.authn.Password.order = 1000
|
||||
#idp.authn.Password.passiveAuthenticationSupported = true
|
||||
#idp.authn.Password.forcedAuthenticationSupported = true
|
||||
# Override this and removeAfterValidation to require all validators to succeed
|
||||
#idp.authn.Password.requireAll = false
|
||||
# Override to keep the password around
|
||||
#idp.authn.Password.removeAfterValidation = true
|
||||
# Override to store password in Java Subject
|
||||
#idp.authn.Password.retainAsPrivateCredential = false
|
||||
# Simple username transforms before validation
|
||||
#idp.authn.Password.trim = true
|
||||
#idp.authn.Password.lowercase = false
|
||||
#idp.authn.Password.uppercase = false
|
||||
#idp.authn.Password.matchExpression =
|
||||
# Override default form field names
|
||||
#idp.authn.Password.usernameFieldName = j_username
|
||||
#idp.authn.Password.passwordFieldName = j_password
|
||||
#idp.authn.Password.ssoBypassFieldName = donotcache
|
||||
# Unset if using customized Principals per validator
|
||||
#idp.authn.Password.addDefaultPrincipals = true
|
||||
# The Principal collection below is the typical default if not otherwise noted.
|
||||
#idp.authn.Password.supportedPrincipals = \
|
||||
# saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport, \
|
||||
# saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:Password, \
|
||||
# saml1/urn:oasis:names:tc:SAML:1.0:am:password
|
||||
# Validators are controlled in password-authn-config.xml
|
||||
|
||||
#### Password Backends ####
|
||||
|
||||
# See ldap.properties for LDAP authn properties
|
||||
# Kerberos settings
|
||||
#idp.authn.Krb5.refreshConfig = false
|
||||
#idp.authn.Krb5.preserveTicket = false
|
||||
# Set next two for KDC verification
|
||||
#idp.authn.Krb5.servicePrincipal =
|
||||
#idp.authn.Krb5.keytab =
|
||||
# JAAS settings
|
||||
#idp.authn.JAAS.loginConfigNames = ShibUserPassAuth
|
||||
#idp.authn.JAAS.loginConfig = %{idp.home}/conf/authn/jaas.config
|
||||
|
||||
#### External ####
|
||||
|
||||
#idp.authn.External.order = 1000
|
||||
#idp.authn.External.nonBrowserSupported = false
|
||||
#idp.authn.External.matchExpression =
|
||||
# Unset if you plan to return full Java Subject from external source
|
||||
#idp.authn.External.addDefaultPrincipals = true
|
||||
# Servlet context-relative path to wherever your implementation lives
|
||||
idp.authn.External.externalAuthnPath = contextRelative:external.jsp
|
||||
|
||||
#### RemoteUser ####
|
||||
|
||||
#idp.authn.RemoteUser.order = 1000
|
||||
#idp.authn.RemoteUser.nonBrowserSupported = false
|
||||
#idp.authn.RemoteUser.matchExpression =
|
||||
# Unset in most cases only if using the authnMethodHeader or
|
||||
# subjectAttribute settings
|
||||
#idp.authn.RemoteUser.addDefaultPrincipals = true
|
||||
# Most other settings need to be supplied via web.xml to the servlet
|
||||
|
||||
#### RemoteUserInternal ####
|
||||
|
||||
#idp.authn.RemoteUserInternal.order = 1000
|
||||
#idp.authn.RemoteUserInternal.nonBrowserSupported = true
|
||||
# Unset in most cases only if using the authnMethodHeader feature
|
||||
#idp.authn.RemoteUserInternal.addDefaultPrincipals = true
|
||||
#idp.authn.RemoteUserInternal.checkRemoteUser = true
|
||||
# Comma-delimited lists of attributes or headers to pull from
|
||||
#idp.authn.RemoteUserInternal.checkAttributes =
|
||||
#idp.authn.RemoteUserInternal.checkHeaders =
|
||||
# Simple transforms to apply
|
||||
#idp.authn.RemoteUserInternal.trim = true
|
||||
#idp.authn.RemoteUserInternal.lowercase = false
|
||||
#idp.authn.RemoteUserInternal.uppercase = false
|
||||
#idp.authn.RemoteUserInternal.matchExpression =
|
||||
#idp.authn.RemoteUserInternal.allowedUsernames =
|
||||
#idp.authn.RemoteUserInternal.deniedUsernames =
|
||||
|
||||
#### SPNEGO ####
|
||||
|
||||
#idp.authn.SPNEGO.order = 1000
|
||||
#idp.authn.SPNEGO.nonBrowserSupported = false
|
||||
#idp.authn.SPNEGO.enforceRun = false
|
||||
#idp.authn.SPNEGO.refreshKrbConfig = false
|
||||
#idp.authn.SPNEGO.matchExpression =
|
||||
idp.authn.SPNEGO.supportedPrincipals = \
|
||||
saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:Kerberos, \
|
||||
saml1/urn:ietf:rfc:1510
|
||||
|
||||
#### X509 ####
|
||||
|
||||
#idp.authn.X509.order = 1000
|
||||
#idp.authn.X509.nonBrowserSupported = false
|
||||
# Servlet context-relative path to wherever your implementation lives
|
||||
#idp.authn.X509.externalAuthnPath = contextRelative:x509-prompt.jsp
|
||||
idp.authn.X509.supportedPrincipals = \
|
||||
saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:X509, \
|
||||
saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:TLSClient, \
|
||||
saml1/urn:ietf:rfc:2246
|
||||
|
||||
#### X509Internal ####
|
||||
|
||||
#idp.authn.X509Internal.order = 1000
|
||||
#idp.authn.X509Internal.nonBrowserSupported = false
|
||||
#idp.authn.X509Internal.saveCertificateToCredentialSet = true
|
||||
idp.authn.X509Internal.supportedPrincipals = \
|
||||
saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:X509, \
|
||||
saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:TLSClient, \
|
||||
saml1/urn:ietf:rfc:2246
|
||||
|
||||
#### IPAddress ####
|
||||
|
||||
#idp.authn.IPAddress.order = 1000
|
||||
#idp.authn.IPAddress.passiveAuthenticationSupported = true
|
||||
#idp.authn.IPAddress.lifetime = PT60S
|
||||
#idp.authn.IPAddress.inactivityTimeout = PT60S
|
||||
idp.authn.IPAddress.supportedPrincipals = \
|
||||
saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:InternetProtocol
|
||||
|
||||
#### Function ####
|
||||
|
||||
#idp.authn.Function.order = 1000
|
||||
#idp.authn.Function.passiveAuthenticationSupported = true
|
||||
# Unset if you plan to return full Java Subject from function
|
||||
#idp.authn.Function.addDefaultPrincipals = true
|
||||
|
||||
#### Duo ####
|
||||
|
||||
#idp.authn.Duo.order = 1000
|
||||
#idp.authn.Duo.nonBrowserSupported = false
|
||||
#idp.authn.Duo.forcedAuthenticationSupported = true
|
||||
# Unset if you have advanced Duo integrations with individualized Principals
|
||||
#idp.authn.Duo.addDefaultPrincipals = true
|
||||
# The list below should be changed to reflect whatever locally- or
|
||||
# community-defined values are appropriate to represent Duo. It is
|
||||
# strongly advised that the value not be specific to Duo or any
|
||||
# particular technology to avoid lock-in.
|
||||
idp.authn.Duo.supportedPrincipals = \
|
||||
saml2/http://example.org/ac/classes/mfa, \
|
||||
saml1/http://example.org/ac/classes/mfa
|
||||
# Default Duo integration settings are defined separately
|
||||
# in duo.properties due to the sensitivity of the secret key.
|
||||
|
||||
|
||||
#### SAML ####
|
||||
|
||||
#idp.authn.SAML.order = 1000
|
||||
#idp.authn.SAML.nonBrowserSupported = false
|
||||
#idp.authn.SAML.passiveAuthenticationSupported = true
|
||||
#idp.authn.SAML.forcedAuthenticationSupported = true
|
||||
#idp.authn.SAML.proxyScopingEnforced = true
|
||||
# Discovery options:
|
||||
# Define shibboleth.authn.SAML.discoveryFunction bean
|
||||
# Set proxyEntityID property
|
||||
# Fall through to discovery via discoveryRequired property
|
||||
#idp.authn.SAML.proxyEntityID = https://idp.example.org/idp/shibboleth
|
||||
#idp.authn.SAML.discoveryRequired = true
|
||||
# Generally left false with bidirectional mappings in
|
||||
# conf/authn/authn-comparison.xml across the proxy boundary.
|
||||
# Adjust as needed to reflect IdP's capabilities/support.
|
||||
#idp.authn.SAML.addDefaultPrincipals = false
|
||||
#idp.authn.SAML.supportedPrincipals = \
|
||||
# saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport, \
|
||||
# saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:Password, \
|
||||
# saml1/urn:oasis:names:tc:SAML:1.0:am:password
|
||||
|
||||
#### MFA ####
|
||||
|
||||
#idp.authn.MFA.order = 1000
|
||||
#idp.authn.MFA.passiveAuthenticationSupported = true
|
||||
#idp.authn.MFA.forcedAuthenticationSupported = true
|
||||
#idp.authn.MFA.validateLoginTransitions = true
|
||||
# The list below almost certainly requires changes, and should generally be the
|
||||
# union of any of the separate factors you combine in your particular MFA flow
|
||||
# rules. The example corresponds to the example in mfa-authn-config.xml that
|
||||
# combines IPAddress with Password.
|
||||
idp.authn.MFA.supportedPrincipals = \
|
||||
saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:InternetProtocol, \
|
||||
saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport, \
|
||||
saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:Password, \
|
||||
saml1/urn:oasis:names:tc:SAML:1.0:am:password
|
||||
# Most actual setup via mfa-authn-config.xml
|
112
conf/authn/password-authn-config.xml
Normal file
112
conf/authn/password-authn-config.xml
Normal file
@@ -0,0 +1,112 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:context="http://www.springframework.org/schema/context"
|
||||
xmlns:util="http://www.springframework.org/schema/util"
|
||||
xmlns:p="http://www.springframework.org/schema/p"
|
||||
xmlns:c="http://www.springframework.org/schema/c"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
|
||||
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
|
||||
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
|
||||
|
||||
default-init-method="initialize"
|
||||
default-destroy-method="destroy">
|
||||
|
||||
<!--
|
||||
Ordered list of CredentialValidators to apply to a request.
|
||||
|
||||
The four supplied variants are shown below; the HTPasswd option
|
||||
is an OOB default for demo account purposes, and you will
|
||||
want to remove it after initial install and testing.
|
||||
-->
|
||||
<util:list id="shibboleth.authn.Password.Validators">
|
||||
<ref bean="shibboleth.LDAPValidator" />
|
||||
<!-- <ref bean="shibboleth.KerberosValidator" /> -->
|
||||
<!-- <ref bean="shibboleth.JAASValidator" /> -->
|
||||
<!-- <bean parent="shibboleth.HTPasswdValidator" p:resource="%{idp.home}/credentials/demo.htpasswd" /> -->
|
||||
</util:list>
|
||||
|
||||
<!-- Apply any regular expression replacement pairs to username before validation. -->
|
||||
<util:list id="shibboleth.authn.Password.Transforms">
|
||||
<!--
|
||||
<bean parent="shibboleth.Pair" p:first="^(.+)@example\.org$" p:second="$1" />
|
||||
-->
|
||||
</util:list>
|
||||
|
||||
<!-- Uncomment to configure account lockout backed by in-memory storage. -->
|
||||
<!--
|
||||
<bean id="shibboleth.authn.Password.AccountLockoutManager"
|
||||
parent="shibboleth.StorageBackedAccountLockoutManager"
|
||||
p:maxAttempts="5"
|
||||
p:counterInterval="PT5M"
|
||||
p:lockoutDuration="PT5M"
|
||||
p:extendLockoutDuration="false" />
|
||||
-->
|
||||
|
||||
<!--
|
||||
Define entries here to map error messages detected by validation actions and classify them as particular
|
||||
kinds of errors for use in your templates and as events in flows.
|
||||
|
||||
Keys are events to signal, values are error codes.
|
||||
-->
|
||||
<util:map id="shibboleth.authn.Password.ClassifiedMessageMap">
|
||||
<entry key="UnknownUsername">
|
||||
<list>
|
||||
<value>NoCredentials</value>
|
||||
<value>UnknownUsername</value>
|
||||
<value>CLIENT_NOT_FOUND</value>
|
||||
<value>Client not found</value>
|
||||
<value>Cannot get kdc for realm</value>
|
||||
<value>Client not found in Kerberos database</value>
|
||||
<value>DN_RESOLUTION_FAILURE</value>
|
||||
<value>Cannot authenticate dn, invalid dn</value>
|
||||
<value>Cannot authenticate dn, invalid credential</value>
|
||||
<value>AcceptSecurityContext error, data 525</value>
|
||||
</list>
|
||||
</entry>
|
||||
<entry key="InvalidPassword">
|
||||
<list>
|
||||
<value>InvalidCredentials</value>
|
||||
<value>PREAUTH_FAILED</value>
|
||||
<value>INVALID_CREDENTIALS</value>
|
||||
<value>Checksum failed</value>
|
||||
<value>Integrity check on decrypted field failed</value>
|
||||
<value>Pre-authentication information was invalid</value>
|
||||
<value>Key bytes cannot be null</value>
|
||||
<value>AcceptSecurityContext error, data 52e</value>
|
||||
</list>
|
||||
</entry>
|
||||
<entry key="AccountLocked">
|
||||
<list>
|
||||
<value>AccountLocked</value>
|
||||
<value>Clients credentials have been revoked</value>
|
||||
<value>AcceptSecurityContext error, data 775</value>
|
||||
</list>
|
||||
</entry>
|
||||
<entry key="AccountDisabled">
|
||||
<list>
|
||||
<value>AcceptSecurityContext error, data 533</value>
|
||||
</list>
|
||||
</entry>
|
||||
<entry key="ExpiredPassword">
|
||||
<list>
|
||||
<value>PASSWORD_EXPIRED</value>
|
||||
<value>CLIENT KEY EXPIRED</value>
|
||||
<value>AcceptSecurityContext error, data 532</value>
|
||||
<value>AcceptSecurityContext error, data 773</value>
|
||||
<value>AcceptSecurityContext error, data 701</value>
|
||||
</list>
|
||||
</entry>
|
||||
<entry key="ExpiringPassword">
|
||||
<list>
|
||||
<value>ACCOUNT_WARNING</value>
|
||||
</list>
|
||||
</entry>
|
||||
<entry key="RequestUnsupported">
|
||||
<list>
|
||||
<value>RequestUnsupported</value>
|
||||
</list>
|
||||
</entry>
|
||||
</util:map>
|
||||
|
||||
</beans>
|
Reference in New Issue
Block a user