Git Product home page Git Product logo

plugin-com.dotcms.dotsaml's Introduction

plugin-dotcms-openSAML3

(Deprecated - has been incorporated into the dotCMS core as of 5.3.8)

This plugin allows to modify the authentication process in DOTCMS using the Open SAML 3 (Security Assertion Markup Language) protocols for frontend, backend or both.

The plugin will add the user in dotcms if the user doesn't exist and for every user logging from SAML the ROLEs will be reassigned if the roles are sent by the SAML response message. In addition, a system role will be assigned to the user (SAML User role), as well as any other role defined in the configuration (for further information, refer to role.extra usage in the Configuration section)

The SAML Response should always send the user email, firstname and lastname. The roles are optional.

Before installation: Be sure your DB schema was previously initialized (dotCMS' DB tables were created). Having started the application at least once without the plugin is enough.

To use the plugin run the ./bin/deploy-plugins.sh command and restart your dotCMS instance.

For installation and configuration instructions, check the INSTALL document

For more details about properties configuration, please refer to the Configuration section

Important Considerations:

  1. The plugin needs several libraries to run, all of them have been renamed with a prefix called: "opensaml". In case you need to undeploy the plugin you have to manually remove these libraries from /dotserver/tomcat-8.5.32/webapps/ROOT/WEB-INF/lib.

  2. Any request from dotCMS will be redirected to the IdP Login Page, if the user is not already logged in. An exception to this rule can be set with this property access.filter.values.

  3. A fallback host can be defined in order to use its configuration by default. It will only apply for those hosts whose SAML configuration field is empty. This can be set in the DOTCMS_plugin_path/conf/dotmarketing-config-ext.properties file, using the saml.fallback.site property, like this:

    saml.fallback.site=saml.test.dotcms.com
    

In most of the cases you will need to configure just these three properties:

idp.metadata.path

In case you have a idp-metadata.xml you can get it from the classpath or file system. For the classpath, overwrite the property with the right path in your classpath. If you want to get the XML from the file system use the prefix file://.

keystore.path

Classpath or file system path for the keystore.

keystore.password

Password to access the keystore.

In this section we describe all the advance properties that can be set in your SAML configuration:

Important Considerations:

  1. We ship with default values for some of the properties below. You can find, add or remove those default values in the file ROOT/dotserver/tomcat-8.0.18/webapps/ROOT/WEB-INF/classes/dotcms-saml-default.properties.
  2. The default values will be used for each of the Sites (Hosts) SAML Field (if configured).
  3. You can override those values by setting key=value pairs on the SAML Field. (See How to use)

protocol.binding

By default, dotCMS uses org.opensaml.saml.common.xml.SAMLConstants.SAML2_ARTIFACT_BINDING_URI. The binding tells to the Idp how the SP is expecting the response. The default one just wait for SAMLArt parameter with the Artifact Id to resolve the artifact via Artifact Resolver. We also have support for urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST, this one expects a SAMLResponse as part of a post-back with the Assertion response.

identity.provider.destinationsso.url

URL for the login page on the Shibboleth Server. By default, it gets the url from the idp-metadata (the file provided from the Shibboleth server); in case there is not any idp-metadata you can edit this property and include the SSO url. (Note, if you set this property as well as the idp-metadata, the idp-metadata will be get by default).

service.provider.issuer

App Id for the dotCMS Service Provider. In case it is not provided, the default dotCMS site name will be set, using the https protocol. We encourage to use your url.com address, for instance: http://www.dotcms.com

assertion.customer.endpoint.url

URL used by the Idp (the Shibboleth server) to redirect to dotCMS when the login is made. We suggest to go to http://[domain]/dotsaml/login. If this value is unset, a default endpoint will be created using the service.provider.issuer and the keystore.entry.id.

logout.service.endpoint.url

URL used by the Idp (the Shibboleth server) to redirect to dotCMS when the logout is made. If this value is unset, a default endpoint will be created using the service.provider.issuer/dotsaml/logout

role.extra Custom role, set to the logged user during authentication process. This property is optional, however, in case to be included, this role must exist in dotCMS with the proper permissions (at least to Grant Users), otherwise will be ignored.

policy.allowcreate

Allows to create users that do not exist on the IdP.

We advise to not create new users on the Idp, however you can change this behavior, turning on this property.

nameidpolicy.format

SAML Name ID policy. By default we support TRANSIENT and PERSISTANCE formats, however if you want to overwrite it just add the values (comma separated). See org.opensaml.saml.saml2.core.NameIDType for more details about the valid values.

authn.comparisontype

Comparison rule used to evaluate the specified authentication methods. By default we use a MINIMUM Authorization. Possible values are:

MINIMUM

The user could be authenticated by using password or any stronger method, such as smart card for instance.

BETTER

The user must be authenticated with a stronger method than password.

EXACT

The user will be authenticated with a specific method assigned for it, for instance: if it is password, the user will be authenticated only by password.

MAXIMUM

The user will use the strongest possible method.

authn.context.class.ref

Authentication context, which could be Kerberos, Internet protocol, password, etc. See org.opensaml.saml.saml2.core.AuthnContext for more details.

By default we use: org.opensaml.saml.saml2.core.AuthnContext.PASSWORD_AUTHN_CTX

keystore.entry.id

Key entry for the keystore. By default we use SPKey, you can overwrite it if needed.

keystore.entry.password

Key entry password for the keystore. By default we use "password", it can be overwritten as well.

keystore.type

By default, java.security.KeyStore.getDefaultType() implementation is used.

signature.canonicalization.algorithm

Default value org.opensaml.xmlsec.signature.support.SignatureConstants.ALGO_ID_C14N_EXCL_OMIT_COMMENTS.

clock.skew and message.life.time

For message lifetime validation purpose. By default the clock skew is 1000 and life time 2000.

remove.roles.prefix

Depending on your Identity Providers on the IdP, the roles may be returned on the assertion with a prefix, you can change this behavior by turning on remove.roles.prefix.

build.roles

Optional key to configure the roles strategy to sync them from IDP to DOTCMS Valid values (default "all"):

  • "all": Removes all user roles from DOTCMS; adds the roles to DOTCMS from IdP and role.extra (if set)
  • "idp": Removes all user roles and adds the roles to DOTCMS from IdP
  • "staticonly": Removes all user roles, adds roles from role.extra (if set) to DOTCMS. Ignore roles from IdP.
  • "staticadd": Do not alter existing user roles, adds the roles from role.extra (if set) to DOTCMS. Ignore roles from IdP.
  • "none": Do not alter any user roles on DOTCMS

attribute.email.name

By default, "mail" is the field used to fetch the user email from the Idp response.

attribute.email.allownull

Boolean value to allows to build a dummy email based on the NameID from the Idp when the email attribute from the IDP is not present. True will apply the email generation, false will throw 401 error.

attribute.firstname.name

By default "givenName" is the field used to fetch the user name from the Idp response, however if you are using another one you can overwrite it.

attribute.firstname.nullvalue

If the first name attribute is null, this value will be set instead

attribute.lastname.name

By default, "sn" is the field used to fetch the last name from the Idp response.

attribute.lastname.nullvalue

If the first name attribute is null, this value will be set instead

attribute.roles.name

By default, "authorizations" is the field used to fetch the roles/groups from the Idp response, however if you are using another one you can overwrite it.

initializer.classname

By default, dotCMS uses: DefaultInitializer. It inits the Java Crypto, Saml Services and plugin configuration details. It can be overwritten by specifying a fully qualified class name.

configuration.classname

Used to manipulate the SAML plugin configuration Default implementation: com.dotcms.plugin.saml.v3.config.DefaultDotCMSConfiguration.

idp.metadata.protocol

Attribute name used to find the Idp Information on the idp-metadata.xml (the file provided from the Shibboleth server).

Default value: "urn:oasis:names:tc:SAML:2.0:protocol"

idp.metadata.parser.classname

This class parses the idp-metadata and creates the sp-metadata from the runtime information. By default dotCMS uses DefaultMetaDescriptorServiceImpl. However, it can overwritten by adding a fully qualified class name to this property.

access.filter.values

By default, dotCMS does not filter any url, however if you want to avoid to check open saml authentication over any URL please add (comma separated) the list of urls on this property.

service.provider.custom.credential.provider.classname

Used to set custom credentials for the Service Provider. This property expects a fully qualified class name. Please see com.dotcms.plugin.saml.v3.CredentialProvider.

id.provider.custom.credential.provider.classname

Used to set custom credentials for the ID Provider. This property expects a fully qualified class name. Please see com.dotcms.plugin.saml.v3.CredentialProvider.

want.assertions.signed

Default: true. Overwrite this value if you do not want assertions signed.

authn.requests.signed

Default: true. Overwrite this value if you do not want authorization requests signed.

service.provider.custom.metadata.path

By default this is the URL to get the dotCMS Service Provider metadata: */dotsaml/metadata.xml *. However, if you want to use a different path, feel free to overwrite it.

assertion.resolver.handler.classname

By default we use this implementation: com.dotcms.plugin.saml.v3.handler.HttpPostAssertionResolverHandlerImpl.

To overwrite it, provide a fully qualified class name.

include.roles.pattern

Comma separated value, used to validate roles against the patterns provided. Only matching roles will be considered.

For instance:

"include.roles.pattern":"^www_,^xxx_"

The previous example will include only the roles from SAML that start with www_ or xxx_.

include.path.values

Comma separated values with the regex paths to be considered by the SAML plugin.

By default we include:

 ^/dotsaml3sp*$, ^/dotCMS/login.*$, ^/html/portal/login.*$, ^/c/public/login.*$,^/c/portal_public/login.*$,^/c/portal/logout.*$",

Use this property in case you need to filter additional paths. For instance:

"include.path.values":"^/html/portal/login.*$,^/dotCMS/login.*$,^/c/,^/admin"

logout.path.values

Comma separated values with the regex paths to be considered by the SAML plugin.

By default we include:

 ^/dotsaml3sp*$, ^/dotCMS/login.*$, ^/html/portal/login.*$, ^/c/public/login.*$,^/c/portal_public/login.*$,^/c/portal/logout.*$",

Use this property in case you need to add additional logout paths. For instance:

"include.path.values":"^/html/portal/logout.*$,^/dotCMS/logout.*$,^/c/"

identity.provider.destinationslo.url

This is url for the logout page on the SAML Server, by default it gets url from the idp-metadata (the file provided from the SAML server), but if it is not any idp-metadata you can edit this property and include the SLO url. (Note, if you set this property and set the idp-metadata, the idp-metada will be get by default)

verify.assertion.signature, verify.signature.profile and verify.signature.credentials

For signature verification purpose. Default value: true.

plugin-com.dotcms.dotsaml's People

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

plugin-com.dotcms.dotsaml's Issues

Error authenticating against ADFS

While testing this plugin on a dEC environment for a client using ADFS as its IdP, we've been able to get dotCMS to redirect successfully to the IdP's login page; however, we are getting the following error after user and password are submitted:

[04/08/17 11:05:56:454 EDT] ERROR impl.SAMLSignatureProfileValidator: Apache xmlsec IdResolver could not resolve the Element for id reference: _ef29327e-f098-40f2-b016-724d9d06fdad\
[04/08/17 11:05:56:454 EDT] ERROR v3.SamlUtils: Apache xmlsec IdResolver could not resolve the Element for id reference: _ef29327e-f098-40f2-b016-724d9d06fdad\
org.opensaml.xmlsec.signature.support.SignatureException: Apache xmlsec IdResolver could not resolve the Element for id reference: _ef29327e-f098-40f2-b016-724d9d06fdad\
	at org.opensaml.saml.security.impl.SAMLSignatureProfileValidator.validateReferenceURI(SAMLSignatureProfileValidator.java:158) ~[opensaml-saml-impl-3.2.0.jar:?]\
	at org.opensaml.saml.security.impl.SAMLSignatureProfileValidator.validateSignatureImpl(SAMLSignatureProfileValidator.java:89) ~[opensaml-saml-impl-3.2.0.jar:?]\
	at org.opensaml.saml.security.impl.SAMLSignatureProfileValidator.validate(SAMLSignatureProfileValidator.java:63) ~[opensaml-saml-impl-3.2.0.jar:?]\
	at com.dotcms.plugin.saml.v3.SamlUtils.verifyAssertionSignature(SamlUtils.java:578) [SamlUtils.class:?]\
	at com.dotcms.plugin.saml.v3.handler.HttpPostAssertionResolverHandlerImpl.resolveAssertion(HttpPostAssertionResolverHandlerImpl.java:98) [HttpPostAssertionResolverHandlerImpl.class:?]\
	at com.dotcms.plugin.saml.v3.OpenSamlAuthenticationServiceImpl.resolveAssertion(OpenSamlAuthenticationServiceImpl.java:525) [OpenSamlAuthenticationServiceImpl.class:?]\
	at com.dotcms.plugin.saml.v3.OpenSamlAuthenticationServiceImpl.getUser(OpenSamlAuthenticationServiceImpl.java:198) [OpenSamlAuthenticationServiceImpl.class:?]\
	at com.dotcms.plugin.saml.v3.filter.SamlAccessFilter.autoLogin(SamlAccessFilter.java:512) [SamlAccessFilter.class:?]\
	at com.dotcms.plugin.saml.v3.filter.SamlAccessFilter.doFilter(SamlAccessFilter.java:288) [SamlAccessFilter.class:?]\
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.18]\
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.18]\
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) [catalina.jar:8.0.18]\
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) [catalina.jar:8.0.18]\
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) [catalina.jar:8.0.18]\
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) [catalina.jar:8.0.18]\
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [catalina.jar:8.0.18]\
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) [catalina.jar:8.0.18]\
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) [catalina.jar:8.0.18]\
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516) [catalina.jar:8.0.18]\
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1086) [tomcat-coyote.jar:8.0.18]\
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:659) [tomcat-coyote.jar:8.0.18]\
	at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223) [tomcat-coyote.jar:8.0.18]\
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558) [tomcat-coyote.jar:8.0.18]\
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1515) [tomcat-coyote.jar:8.0.18]\
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_131]\
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_131]\
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.0.18]\
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131]} 

Possible fix:
http://blog.samlsecurity.com/2014/05/exception-apache-xmlsec-idresolver.html

Full log and metadatafiles have been made available here to protect client's private information: https://my.dotcms.com/tickets/detail.dot?id=cf833c4e-0e89-4fea-bd85-390fdac67ddf

dotcms.saml.policy.format not updated in generated sp metadata

dotcms.saml.policy.format=urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress should update the <saml2p:NameIDPolicy AllowCreate="false" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"/> element in the generated sp metadata with the proper urn.

Change property prefixes

Remove dotcms.saml. prefix from the SAML authentication properties.

For example, instead of:

dotcms.saml.idp.metadata.path=
dotcms.saml.keystore.path=
dotcms.saml.keystore.password=
dotcms.saml.keystore.entry.password=
dotcms.saml.remove.roles.prefix=
dotcms.saml.keyentryid=
dotcms.saml.include.roles.pattern=
dotcms.saml.service.provider.issuer=
dotcms.saml.policy.format=

We should have:

idp.metadata.path=
keystore.path=
keystore.password=
keystore.entry.password=
remove.roles.prefix=
keyentryid=
include.roles.pattern=
service.provider.issuer=
policy.format=

Staged validation

Allow 2-stage config process to be able to generate sp metadata prior to SAML filter activation.

On Site publish hook:

if samlEnabled == false && ( isSet(samlConfig.keystore.path) && isSet(samlConfig.keystore.password) ) then we do a soft validation of the params needed to generate the sp metadata:

  • keystore.path
  • keystore.password
  • keystore.entry.password (default to value of keystore.password if not set)
  • keystore.entry.id (default to dotsamlsp)
  • service.provider.issuer (default to Site hostname with "https://" prefix
  • assertion.customer.endpoint.url (default to service.provider.issuer/dotsaml3sp)
  • logout.service.endpoint.url (default to service.provider.issuer/dotsaml3sp-logout)
  • nameidpolicy.format (default unchanged)
  • want.assertions.signed (default true)
  • authn.requests.signed (default true)

if samlEnabled == true, then we do full validation of all props

SAML Metadata should be able to be generated even on Disabled

Even if the host with a partial configuration is disabled, the metadata for it should be able to be rendered.

So, in case the plugin does not hold any configuration for the host metadata request, it will retrieve the dotCMS host saml configuration, see if it is valid (even if it is disabled); if it is valid, the metadata will be generated with that information.

Simplify handling of empty mandatory attributes from IdP

Alternative way to implement ToleranceOpenSamlAuthenticationServiceImpl to handle empty first-name, last-name, and email address.

When default, dummy values for these fields are not set, we need to be able to report back to the user why their accounts could not be created/authenticated (better error handling when mandatory fields are absent).

SAML Configuration Search

As a CMS Administrator, I need the ability to search SAML configurations so that the text I entered can be used to filter results by: config name, SP Issuer URL, SP Endpoint Hostname, sites related to the IdP, or any override parameter.

Fix group/role filtering from IDP

Needs to allow all, enable/disable sync (re: LDAP auth.impl.build.groups=true). Also needs to accommodate static assignment.

Config prop build.roles (string, not mandatory, silent default "all"):

  • "all": Remove user from all roles, add to roles from IdP & saml_user_role (if set)
  • "idp": Remove user from all roles, add to roles from IdP
  • "staticonly": Remove user from all roles, add to roles from saml_user_role (if set). Ignore roles from IdP.
  • "staticadd": Do not alter existing user roles, add to roles from saml_user_role (if set). Ignore roles from IdP.
  • "none": Do not alter user roles in any way

Make sure that include.roles.pattern & remove.roles.prefix work as intended, including when unset or empty (should match all and remove no prefix). Defaults for those options should be empty string.

NPE while retrieving user attributes

The assertion seems to be including all the info needed, though.

npe

[22/08/17 16:16:35:710 EDT] ERROR v3.ToleranceOpenSamlAuthenticationServiceImpl: Unknown exception
java.lang.NullPointerException
	at com.dotcms.plugin.saml.v3.OpenSamlAuthenticationServiceImpl.lambda$null$0(OpenSamlAuthenticationServiceImpl.java:293) ~[OpenSamlAuthenticationServiceImpl.class:?]
	at java.lang.Iterable.forEach(Iterable.java:75) ~[?:1.8.0_131]
	at com.dotcms.plugin.saml.v3.OpenSamlAuthenticationServiceImpl.lambda$resolveAttributes$1(OpenSamlAuthenticationServiceImpl.java:289) ~[OpenSamlAuthenticationServiceImpl.class:?]
	at java.lang.Iterable.forEach(Iterable.java:75) ~[?:1.8.0_131]
	at com.dotcms.plugin.saml.v3.OpenSamlAuthenticationServiceImpl.resolveAttributes(OpenSamlAuthenticationServiceImpl.java:285) ~[OpenSamlAuthenticationServiceImpl.class:?]
	at com.dotcms.plugin.saml.v3.OpenSamlAuthenticationServiceImpl.resolveUser(OpenSamlAuthenticationServiceImpl.java:344) [OpenSamlAuthenticationServiceImpl.class:?]
	at com.dotcms.plugin.saml.v3.OpenSamlAuthenticationServiceImpl.getUser(OpenSamlAuthenticationServiceImpl.java:202) [OpenSamlAuthenticationServiceImpl.class:?]
	at com.dotcms.plugin.saml.v3.filter.SamlAccessFilter.autoLogin(SamlAccessFilter.java:515) [SamlAccessFilter.class:?]
	at com.dotcms.plugin.saml.v3.filter.SamlAccessFilter.doFilter(SamlAccessFilter.java:289) [SamlAccessFilter.class:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.18]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) [catalina.jar:8.0.18]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) [catalina.jar:8.0.18]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) [catalina.jar:8.0.18]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) [catalina.jar:8.0.18]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [catalina.jar:8.0.18]
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) [catalina.jar:8.0.18]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) [catalina.jar:8.0.18]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516) [catalina.jar:8.0.18]
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1086) [tomcat-coyote.jar:8.0.18]
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:659) [tomcat-coyote.jar:8.0.18]
	at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223) [tomcat-coyote.jar:8.0.18]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558) [tomcat-coyote.jar:8.0.18]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1515) [tomcat-coyote.jar:8.0.18]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_131]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_131]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.0.18]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131]

Special Characters and windows environment

The special characters on these lines - namely the double quotes cause an issue when compiling in a windows environment.

//“$TIMEDATE: SAML login success for $host (frontend|backend)from $REQUEST_ADDR for user $username”

// “The transient identifier is a random identifier that does not have any connection to the user. A transient identifier will be different for every time the user signs in.”

The java compiler also complains about the encoding of the file SAMLAccessFilter in a Windows environment.
Please remove the special characters and encoding in future versions of the plugin.
Thank you,
Roy

REQ#1 - Make signature validation optional

We need to allow the following options:

  • Validate signature for both response and assertion
  • Validate signature only for response
  • Validate signature only for assertion

Default behavior will be to validate both signature and assertion. CMS Administrators should be able to edit the SAML Configuration to change that behavior to response only or assertion only (drop down on add/edit SAML Configuration Dialog).

Check default configuration for DOTCMS_SAML_IS_ASSERTION_ENCRYPTED

Doc on com.dotcms.plugin.saml.v3.DotSamlConstants indicates default value is "true" :

    /**
     * Key for host field configuration (see {@link com.dotcms.plugin.saml.v3.DotSamlConstants}.DOTCMS_SAML_FIELD_NAME)
     * By default true, you can override as a false if your assertions are returned non-encrypted.
     */
    public static final String DOTCMS_SAML_IS_ASSERTION_ENCRYPTED = "dotcms.saml.isassertion.encrypted";

Default value on ROOT/dotserver/tomcat-8.0.18/webapps/ROOT/WEB-INF/classes/dotcms-saml-default.properties is set to false:

dotcms.saml.isassertion.encrypted=false

Change property name from saml_user_role to role.extra

Our saml_user_role property should be renamed as role.extra .

This is the property that allows the client to set a fixed role to be added to the users at each login attempt. It has noting to do with the role "SAML User" that we have to identify the users who have logged in via SAML.

public static final String DOTCMS_SAML_OPTIONAL_USER_ROLE = "saml_user_role";

Site configuration changes are not being applied properly

2 symptoms:

  1. For one of our clients, I configured their sites to be able to generate metadata files, and then removed the configuration so that each site went back to regular login process while they imported those metadata files on their side. A restart was necessary in order to disable SAML authentication even when the SAML properties on each one of the sites were blank.

  2. For another client, I configured the wrong value for the property on one host dotcms.saml.keystore.path (the file existed, but it didn't match the host). Once I changed the property to the proper value, every login attempt kept returning the same error. Once I restarted dotCMS, the proper keystore was applied to the site, and authentication worked.

Better SAML filter init for cluster

  • Create SAML configuration background thread started at init, lives forever.
  • SAML config thread polls Site contentlets via contentapi.search() to get live, current Site contentlets, samlEnabled & samlConfig fields (field types must be indexed/searchable).
  • SAML config thread calls saml code in try/catch Throwable to ensure it does not die on any error
  • SAML config thread sleeps for a configurable time period (dotmarketing-config.props, default 10s)
  • Remove current Publish Hook config process

Simplify/fix config prop validation/defaults

UI should default to only 3 props (all mandatory, but see #38 for idp.metadata.path specifics)

  • keystore.path
  • keystore.password
  • idp.metadata.path

Additional common props (alter default values, make non-mandatory):

  • service.provider.issuer (default to Site hostname with "https://" prefix, this might already be done)
  • keystore.entry.password should default to value of keystore.password if not set
  • keyentryid should default to “dotsamlsp” if not set (rename to keystore.entry.id)
  • remove.roles.prefix and include.roles.pattern should default to empty

Make role filtering and prefix removal optional

Properties DOT_SAML_REMOVE_ROLES_PREFIX and DOTCMS_SAML_INCLUDE_ROLES_PATTER are validated as mandatory per host.

We should allow those properties to be absent from configuration so that all roles returned by the IdP can be synchronized with dotCMS roles with or without stripping any prefix.

REQ#1 - ERROR - 500 error when trying to log into the backend

This is the error shown in dotcms-saml.log:

[27/04/18 09:58:41:400 EDT] ERROR meta.DefaultMetaDescriptorServiceImpl: null
java.lang.NullPointerException
	at com.dotcms.plugin.saml.v3.meta.DefaultMetaDescriptorServiceImpl.unmarshall(DefaultMetaDescriptorServiceImpl.java:448) [DefaultMetaDescriptorServiceImpl.class:?]
	at com.dotcms.plugin.saml.v3.meta.DefaultMetaDescriptorServiceImpl.parse(DefaultMetaDescriptorServiceImpl.java:87) [DefaultMetaDescriptorServiceImpl.class:?]
	at com.dotcms.plugin.saml.v3.config.MetaDataHelper.getMetaData(MetaDataHelper.java:39) [MetaDataHelper.class:?]
	at com.dotcms.plugin.saml.v3.config.MetaDataHelper.getIdentityProviderDestinationSSOURL(MetaDataHelper.java:81) [MetaDataHelper.class:?]
	at com.dotcms.plugin.saml.v3.util.SamlUtils.getIPDSSODestination(SamlUtils.java:266) [SamlUtils.class:?]
	at com.dotcms.plugin.saml.v3.util.SamlUtils.buildAuthnRequest(SamlUtils.java:224) [SamlUtils.class:?]
	at com.dotcms.plugin.saml.v3.service.OpenSamlAuthenticationServiceImpl.authentication(OpenSamlAuthenticationServiceImpl.java:222) [OpenSamlAuthenticationServiceImpl.class:?]
	at com.dotcms.plugin.saml.v3.filter.SamlAccessFilter.doFilter(SamlAccessFilter.java:137) [SamlAccessFilter.class:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.18]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) [catalina.jar:8.0.18]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) [catalina.jar:8.0.18]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) [catalina.jar:8.0.18]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) [catalina.jar:8.0.18]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [catalina.jar:8.0.18]
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) [catalina.jar:8.0.18]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) [catalina.jar:8.0.18]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516) [catalina.jar:8.0.18]
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1086) [tomcat-coyote.jar:8.0.18]
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:659) [tomcat-coyote.jar:8.0.18]
	at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223) [tomcat-coyote.jar:8.0.18]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558) [tomcat-coyote.jar:8.0.18]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1515) [tomcat-coyote.jar:8.0.18]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_162]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_162]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.0.18]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_162]
[27/04/18 09:58:41:400 EDT] ERROR config.MetaDataHelper: null
com.dotcms.plugin.saml.v3.exception.DotSamlException
	at com.dotcms.plugin.saml.v3.meta.DefaultMetaDescriptorServiceImpl.unmarshall(DefaultMetaDescriptorServiceImpl.java:453) ~[DefaultMetaDescriptorServiceImpl.class:?]
	at com.dotcms.plugin.saml.v3.meta.DefaultMetaDescriptorServiceImpl.parse(DefaultMetaDescriptorServiceImpl.java:87) ~[DefaultMetaDescriptorServiceImpl.class:?]
	at com.dotcms.plugin.saml.v3.config.MetaDataHelper.getMetaData(MetaDataHelper.java:39) [MetaDataHelper.class:?]
	at com.dotcms.plugin.saml.v3.config.MetaDataHelper.getIdentityProviderDestinationSSOURL(MetaDataHelper.java:81) [MetaDataHelper.class:?]
	at com.dotcms.plugin.saml.v3.util.SamlUtils.getIPDSSODestination(SamlUtils.java:266) [SamlUtils.class:?]
	at com.dotcms.plugin.saml.v3.util.SamlUtils.buildAuthnRequest(SamlUtils.java:224) [SamlUtils.class:?]
	at com.dotcms.plugin.saml.v3.service.OpenSamlAuthenticationServiceImpl.authentication(OpenSamlAuthenticationServiceImpl.java:222) [OpenSamlAuthenticationServiceImpl.class:?]
	at com.dotcms.plugin.saml.v3.filter.SamlAccessFilter.doFilter(SamlAccessFilter.java:137) [SamlAccessFilter.class:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.18]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) [catalina.jar:8.0.18]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) [catalina.jar:8.0.18]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) [catalina.jar:8.0.18]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) [catalina.jar:8.0.18]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [catalina.jar:8.0.18]
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) [catalina.jar:8.0.18]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) [catalina.jar:8.0.18]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516) [catalina.jar:8.0.18]
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1086) [tomcat-coyote.jar:8.0.18]
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:659) [tomcat-coyote.jar:8.0.18]
	at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223) [tomcat-coyote.jar:8.0.18]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558) [tomcat-coyote.jar:8.0.18]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1515) [tomcat-coyote.jar:8.0.18]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_162]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_162]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.0.18]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_162]
Caused by: java.lang.NullPointerException
	at com.dotcms.plugin.saml.v3.meta.DefaultMetaDescriptorServiceImpl.unmarshall(DefaultMetaDescriptorServiceImpl.java:448) ~[DefaultMetaDescriptorServiceImpl.class:?]
	... 26 more

This is the configuration I have set:

screen shot 2018-04-27 at 10 05 37 am
screen shot 2018-04-27 at 10 06 26 am
screen shot 2018-04-27 at 10 06 58 am

I'm trying to log into the backend via:

test1.dotsaml.com:8080/c

Keep query string parameters after authentication is done

Current behavior

Once the redirect to the IdP's login page is done, the original query parameters from the request that triggered the authentication are gone.

Expected behavior

As a front-end developer, I expect that the query string parameters included in the request that originated the authentication against the IdP be passed to the page to be loaded once the user has successfully logged in.

More details can be found here: https://my.dotcms.com/tickets/detail.dot?id=1a36e976-ce69-47ff-95cc-3e65856aef36

Allow group/role synchronization to be optional

Current Status
dotcms.saml.remove.roles.prefix and dotcms.saml.include.roles.pattern are mandatory properties to set per host. Synchronization of roles is also a mandatory process.

Desired Status
As system administrator, I need to be able to configure whether or not a host will synchronize (wipe out and re-assign) roles every time a user logs in (for both front-end and backend access).

Remove dotcms.saml prefix from configuration properties

Remove the dotcms.saml from the configuration in order to make easy the configuration on the small textarea.

Instead of:

dotcms.saml.idp.metadata.path=file:///opt/dotcms/wwwroot/current/plugins/plugin-dotcms-openSAML3/conf/adfs.dotcms.com-idp-metadata.xml
dotcms.saml.keystore.path=file:///opt/dotcms/wwwroot/current/plugins/plugin-dotcms-openSAML3/conf/STAGING-saml-sp.jks
dotcms.saml.keystore.password=XXXX
dotcms.saml.keystore.entry.password=XXXX
dotcms.saml.remove.roles.prefix=dotCMS_
dotcms.saml.keyentryid=dotsaml3sp
dotcms.saml.include.roles.pattern=^dotCMS_
dotcms.saml.service.provider.issuer=https://XXXX
dotcms.saml.policy.format=urn:oasis:names:tc:SAML:2.0:nameid-format:persistent

we will have:

idp.metadata.path=file:///opt/dotcms/wwwroot/current/plugins/plugin-dotcms-openSAML3/conf/adfs.dotcms.com-idp-metadata.xml
keystore.path=file:///opt/dotcms/wwwroot/current/plugins/plugin-dotcms-openSAML3/conf/STAGING-saml-sp.jks
keystore.password=XXXX
keystore.entry.password=XXXX
remove.roles.prefix=dotCMS_
keyentryid=dotsaml3sp
include.roles.pattern=^dotCMS_
service.provider.issuer=https://XXXX
nameidpolicy.format=urn:oasis:names:tc:SAML:2.0:nameid-format:persistent

REQ#1 - REST Endpoint: SP metadata generation

The following end point must return the metadata file for the SP matching the given site (host):

$SPEndpointHostname/dotsaml/metadata/$SAML_Config_UUID

Main view of the SAML Configuration Portlet needs to be updated so that this endpoint is used to make the "Download SP Metadata" action work.

Allow SAML authentication to be enabled/disabled

This should be process:

  • If samlEnabled is false and samlConfig is empty, we do nothing
  • If samlEnabled is false and samlConfig is not empty, we validate samlConfig (but allow empty idp.metadata.path) and make sp metadata generated and available (without init’ing any other saml filter functionality)
  • If samlEnabled is true and samlConfig is empty, we fail validation
  • If samlEnabled is true and samlConfig is not empty, we fully-validate samlConfig (including idp.metadata.path) and make sp metadata generated and available, and we init the saml filter for that Site

samlEnabled is a host field (boolean, checkbox)
Current saml host field is changed to samlConfig. Label changed to "SAML Configuration"
"samlConfig is empty" means there is nothing in the SAML config textarea at all

REQ#1 - Switch to new configuration

Version 3.0 of the plugin reads SAML configuration properties from two fields associated to the "Host" (site) content type.

Version 4.0 of the plugin moves all configuration properties to files stored in the asset folder.

The filter that controls the authentication process and any other elements associated to the SAML request processig need to be adapted so that all configuration parameters are taken from the JSON, private key, public certificate, and IdP Metada files managed through the new SAML Configuration portlet. Configuration info stored in files must be cached.

Requests to $Site/[login urls] (for example: https://demo.dotcms.com/dotAdmin/#/public/login) must be properly looked up from cache/JSON for Site->SAML Config mapping and redirected to proper SAML Config’s IdP respectively.

org.opensaml.xml.signature.impl.CryptoBinaryBuilder cannot be cast to org.opensaml.core.xml.XMLObjectBuilder

SAML fails to init on startup, causes SAML filter to throw 500 for all requests.

This looks like a conflict between opensaml-core-3.2.0.jar and opensaml-xmltooling-1.4.6.jar that varies based on classpath resolution.

See https://github.com/pac4j/pac4j/issues/353, likely fallout from the openSAML2 -> opemSAML3 upgrade.

[26/10/17 09:51:56:342 CDT] ERROR filter.SamlAccessFilter: SAML ERROR: org.opensaml.xml.signature.impl.CryptoBinaryBuilder cannot be cast to org.opensaml.core.xml.XMLObjectBuilder
java.lang.ClassCastException: org.opensaml.xml.signature.impl.CryptoBinaryBuilder cannot be cast to org.opensaml.core.xml.XMLObjectBuilder
	at org.opensaml.core.xml.config.XMLConfigurator.initializeObjectProviders(XMLConfigurator.java:238) ~[opensaml-core-3.2.0.jar:?]
	at org.opensaml.core.xml.config.XMLConfigurator.load(XMLConfigurator.java:203) ~[opensaml-core-3.2.0.jar:?]
	at org.opensaml.core.xml.config.XMLConfigurator.load(XMLConfigurator.java:188) ~[opensaml-core-3.2.0.jar:?]
	at org.opensaml.core.xml.config.XMLConfigurator.load(XMLConfigurator.java:162) ~[opensaml-core-3.2.0.jar:?]
	at org.opensaml.core.xml.config.AbstractXMLObjectProviderInitializer.init(AbstractXMLObjectProviderInitializer.java:52) ~[opensaml-core-3.2.0.jar:?]
	at org.opensaml.core.config.InitializationService.initialize(InitializationService.java:56) ~[opensaml-core-3.2.0.jar:?]
	at com.dotcms.plugin.saml.v3.init.DefaultInitializer.initService(DefaultInitializer.java:167) ~[DefaultInitializer.class:?]
	at com.dotcms.plugin.saml.v3.init.DefaultInitializer.init(DefaultInitializer.java:72) ~[DefaultInitializer.class:?]
	at com.dotcms.plugin.saml.v3.filter.SamlAccessFilter.init(SamlAccessFilter.java:140) [SamlAccessFilter.class:?]
	at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:279) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:260) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:105) [catalina.jar:8.0.18]
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4565) [catalina.jar:8.0.18]
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5180) [catalina.jar:8.0.18]
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) [catalina.jar:8.0.18]
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:714) [catalina.jar:8.0.18]
	at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1069) [catalina.jar:8.0.18]
	at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1719) [catalina.jar:8.0.18]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_141]
	at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_141]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_141]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_141]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_141]

Log messages need to be improved

All messages recorded by the plugin are set to INFO.

We need to make sure we are logging all the information we need using INFO, ERROR, WARNING, and DEBUG levels.

REQ#1 - REST Endpoint: Login

The following end point must be available to create an authentication request:

$SPEndpointHostname/dotsaml/login/$SAML_Config_UUID

REQ#1 - QA - Portlet error when the name of the plugin folder gets changed

The following error pops up in dotcms.log whenver the folder of the plugin is not exactly plugin-com.dotcms.dotsaml .

Most of the times we change that folder to be com.dotcms.dotsaml-Vxx

[26/04/18 16:18:27:031 EDT] ERROR portlet.PortletRequestDispatcherImpl: File [/html/plugins/plugin-com.dotcms.dotsaml/saml/view_saml_configuration.jsp] not found
javax.servlet.ServletException: File [/html/plugins/plugin-com.dotcms.dotsaml/saml/view_saml_configuration.jsp] not found
	at org.apache.jasper.servlet.JspServlet.handleMissingResource(JspServlet.java:418) ~[jasper.jar:8.0.18]
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385) ~[jasper.jar:8.0.18]
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340) ~[jasper.jar:8.0.18]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) ~[servlet-api.jar:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) ~[catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) ~[catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:721) ~[catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:584) ~[catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:523) ~[catalina.jar:8.0.18]
	at com.liferay.portlet.PortletRequestDispatcherImpl.include(PortletRequestDispatcherImpl.java:209) [dotcms_4.3.3_999999.jar:?]
	at com.liferay.portlet.PortletRequestDispatcherImpl.include(PortletRequestDispatcherImpl.java:76) [dotcms_4.3.3_999999.jar:?]
	at com.liferay.portlet.JSPPortlet.include(JSPPortlet.java:124) [dotcms_4.3.3_999999.jar:?]
	at com.liferay.portlet.JSPPortlet.doView(JSPPortlet.java:96) [dotcms_4.3.3_999999.jar:?]
	at com.dotcms.repackage.javax.portlet.GenericPortlet.doDispatch(GenericPortlet.java:235) [dot.portlet-1.0_2.jar:?]
	at com.liferay.portlet.JSPPortlet.doDispatch(JSPPortlet.java:72) [dotcms_4.3.3_999999.jar:?]
	at com.dotcms.repackage.javax.portlet.GenericPortlet.render(GenericPortlet.java:163) [dot.portlet-1.0_2.jar:?]
	at com.liferay.portlet.CachePortlet.render(CachePortlet.java:159) [dotcms_4.3.3_999999.jar:?]
	at org.apache.jsp.html.portal.layout_jsp._jspService(layout_jsp.java:618) [ROOT/:?]
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) [jasper.jar:8.0.18]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) [servlet-api.jar:?]
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:431) [jasper.jar:8.0.18]
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396) [jasper.jar:8.0.18]
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340) [jasper.jar:8.0.18]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) [servlet-api.jar:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:721) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:584) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:523) [catalina.jar:8.0.18]
	at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:934) [jasper.jar:8.0.18]
	at org.apache.jsp.html.portal.layout_005fportal_jsp._jspService(layout_005fportal_jsp.java:1353) [ROOT/:?]
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) [jasper.jar:8.0.18]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) [servlet-api.jar:?]
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:431) [jasper.jar:8.0.18]
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396) [jasper.jar:8.0.18]
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340) [jasper.jar:8.0.18]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) [servlet-api.jar:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.18]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-websocket.jar:8.0.18]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:721) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:466) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:391) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:318) [catalina.jar:8.0.18]
	at com.liferay.portal.struts.StrutsUtil.forward(StrutsUtil.java:72) [dotcms_4.3.3_999999.jar:?]
	at com.liferay.portal.struts.PortalRequestProcessor.doForward(PortalRequestProcessor.java:142) [dotcms_4.3.3_999999.jar:?]
	at com.dotmarketing.struts.PortalRequestProcessor.doForward(PortalRequestProcessor.java:48) [dotcms_4.3.3_999999.jar:?]
	at com.dotcms.repackage.org.apache.struts.tiles.TilesRequestProcessor.processTilesDefinition(TilesRequestProcessor.java:237) [dot.struts-1.2.4_2.jar:1.2.4]
	at com.dotcms.repackage.org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:300) [dot.struts-1.2.4_2.jar:1.2.4]
	at com.dotcms.repackage.com.oroad.stxx.plugin.StxxTilesRequestProcessor.processForwardConfig(StxxTilesRequestProcessor.java:134) [dot.stxx-1.3_2.jar:?]
	at com.dotcms.repackage.org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:231) [dot.struts-1.2.4_2.jar:1.2.4]
	at com.liferay.portal.struts.PortalRequestProcessor.process(PortalRequestProcessor.java:128) [dotcms_4.3.3_999999.jar:?]
	at com.dotcms.repackage.org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164) [dot.struts-1.2.4_2.jar:1.2.4]
	at com.dotcms.repackage.org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397) [dot.struts-1.2.4_2.jar:1.2.4]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:618) [servlet-api.jar:?]
	at com.liferay.portal.servlet.MainServlet.callParentService(MainServlet.java:251) [dotcms_4.3.3_999999.jar:?]
	at com.liferay.portal.servlet.MainServlet.service(MainServlet.java:440) [dotcms_4.3.3_999999.jar:?]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) [servlet-api.jar:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.18]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-websocket.jar:8.0.18]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.18]
	at com.dotcms.repackage.com.liferay.filters.secure.SecureFilter.doFilter(SecureFilter.java:135) [dot.secure-filter-ukv_2.jar:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.18]
	at com.dotmarketing.filters.CMSFilter.doFilter(CMSFilter.java:203) [dotcms_4.3.3_999999.jar:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.18]
	at com.dotcms.filters.interceptor.AbstractWebInterceptorSupportFilter.doFilter(AbstractWebInterceptorSupportFilter.java:73) [dotcms_4.3.3_999999.jar:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.18]
	at com.dotcms.filters.interceptor.AbstractWebInterceptorSupportFilter.doFilter(AbstractWebInterceptorSupportFilter.java:73) [dotcms_4.3.3_999999.jar:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.18]
	at com.dotmarketing.cms.urlmap.filters.URLMapFilter.doFilter(URLMapFilter.java:325) [dotcms_4.3.3_999999.jar:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.18]
	at com.dotmarketing.filters.VanityURLFilter.doFilter(VanityURLFilter.java:110) [dotcms_4.3.3_999999.jar:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.18]
	at com.dotcms.repackage.org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:404) [dot.urlrewritefilter-4.0.3_2.jar:4.0.3]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.18]
	at com.dotmarketing.filters.TimeMachineFilter.doFilter(TimeMachineFilter.java:132) [dotcms_4.3.3_999999.jar:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.18]
	at com.dotmarketing.filters.ThreadNameFilter.doFilter(ThreadNameFilter.java:90) [dotcms_4.3.3_999999.jar:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.18]
	at com.dotmarketing.filters.CookiesFilter.doFilter(CookiesFilter.java:38) [dotcms_4.3.3_999999.jar:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.18]
	at com.dotmarketing.filters.CharsetEncodingFilter.doFilter(CharsetEncodingFilter.java:108) [dotcms_4.3.3_999999.jar:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.18]
	at com.dotcms.plugin.saml.v3.filter.SamlAccessFilter.doFilter(SamlAccessFilter.java:187) [SamlAccessFilter.class:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.18]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.18]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) [catalina.jar:8.0.18]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) [catalina.jar:8.0.18]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) [catalina.jar:8.0.18]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) [catalina.jar:8.0.18]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [catalina.jar:8.0.18]
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) [catalina.jar:8.0.18]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) [catalina.jar:8.0.18]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516) [catalina.jar:8.0.18]
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1086) [tomcat-coyote.jar:8.0.18]
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:659) [tomcat-coyote.jar:8.0.18]
	at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223) [tomcat-coyote.jar:8.0.18]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558) [tomcat-coyote.jar:8.0.18]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1515) [tomcat-coyote.jar:8.0.18]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_162]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_162]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.0.18]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_162]

Exception when installing the plugin on the second node of the cluster

[15/11/17 20:42:42:447 EST] ERROR util.InstancePool: com.dotcms.plugin.saml.v3.config.SiteConfigurationService
java.lang.InstantiationException: com.dotcms.plugin.saml.v3.config.SiteConfigurationService
at java.lang.Class.newInstance(Class.java:427) ~[?:1.8.0_121]
at com.liferay.util.InstancePool._get(InstancePool.java:69) [dotcms_3.7.1_8d1e90a.jar:?]
at com.liferay.util.InstancePool.get(InstancePool.java:39) [dotcms_3.7.1_8d1e90a.jar:?]
at com.dotcms.plugin.saml.v3.SiteConfigurationResolver.resolveConfiguration(SiteConfigurationResolver.java:39) [SiteConfigurationResolver.class:?]
at com.dotcms.plugin.saml.v3.SiteConfigurationResolver.resolveConfiguration(SiteConfigurationResolver.java:26) [SiteConfigurationResolver.class:?]
at com.dotcms.plugin.saml.v3.filter.SamlAccessFilter.doFilter(SamlAccessFilter.java:296) [SamlAccessFilter.class:?]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.18]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.18]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) [catalina.jar:8.0.18]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) [catalina.jar:8.0.18]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) [catalina.jar:8.0.18]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) [catalina.jar:8.0.18]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [catalina.jar:8.0.18]
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) [catalina.jar:8.0.18]
at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:673) [catalina.jar:8.0.18]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) [catalina.jar:8.0.18]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516) [catalina.jar:8.0.18]
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1086) [tomcat-coyote.jar:8.0.18]
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:659) [tomcat-coyote.jar:8.0.18]
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223) [tomcat-coyote.jar:8.0.18]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558) [tomcat-coyote.jar:8.0.18]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1515) [tomcat-coyote.jar:8.0.18]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_121]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_121]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.0.18]
at java.lang.Thread.run(Thread.java:745) [?:1.8.0_121]
Caused by: java.lang.NoSuchMethodException: com.dotcms.plugin.saml.v3.config.SiteConfigurationService.()
at java.lang.Class.getConstructor0(Class.java:3082) ~[?:1.8.0_121]
at java.lang.Class.newInstance(Class.java:412) ~[?:1.8.0_121]
... 25 more

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.