Hi,
I’m developing an sso plugin for jira. However, on clicking the configure button it’s redirecting to dead link and throwing following Exception in logs:
/secure/admin/samlsso.configure.jspa [c.a.j.web.dispatcher.JiraWebworkActionDispatcher] Exception thrown from action ‘samlsso.configure’, returning 404
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘com.miniorange.sso.saml.jira.servlet.ConfigurationAction’: Unsatisfied dependency expressed through constructor argument with index 0 of type [com.miniorange.sso.saml.jira.SAMLSettings]: : No qualifying bean of type [com.miniorange.sso.saml.jira.SAMLSettings] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.miniorange.sso.saml.jira.SAMLSettings] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
SAMLSettings.java is the part of the plugin files. Strange part is that the plugin is working just fine on local jira server and most of the servers. Only some people are getting this. I’m including ConfigurationAction, SAMLSettings and atlassian-plugin.xml. Please help
ConfigurationAction.java
package com.miniorange.sso.saml.jira.servlet;
import com.atlassian.crowd.embedded.api.Group;
import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.security.groups.GroupManager;
import com.atlassian.jira.web.action.JiraWebActionSupport;
import com.miniorange.sso.saml.PluginException;
import com.miniorange.sso.saml.jira.PluginHandler;
import com.miniorange.sso.saml.jira.SAMLSettings;
import com.miniorange.sso.saml.utils.SAMLUtils;
import com.atlassian.upm.api.license.PluginLicenseManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ConfigurationAction extends JiraWebActionSupport {
private static final Logger LOGGER = LoggerFactory.getLogger(ConfigurationAction.class);
private PluginLicenseManager pluginLicenseManager;
private SAMLSettings settings;
private PluginHandler pluginHandler;
public ConfigurationAction(SAMLSettings settings, PluginHandler pluginHandler, PluginLicenseManager pluginLicenseManager) {
this.settings = settings;
this.pluginHandler = pluginHandler;
this.pluginLicenseManager=pluginLicenseManager;
}
public SAMLSettings getSettings() {
return this.settings;
}
public void setSettings(SAMLSettings settings) {
this.settings = settings;
}
public void setPluginHandler(PluginHandler pluginHandler) {
this.pluginHandler = pluginHandler;
}
public PluginLicenseManager getPluginLicenseManager() {
return pluginLicenseManager;
}
public void setPluginLicenseManager(PluginLicenseManager pluginLicenseManager) {
this.pluginLicenseManager = pluginLicenseManager;
}
public PluginHandler getPluginHandler() {
return pluginHandler;
}
}
SAMLSettings.java
package com.miniorange.sso.saml.jira;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.config.properties.APKeys;
import com.atlassian.jira.license.LicenseCountService;
import com.atlassian.jira.user.ApplicationUser;
import com.atlassian.jira.user.util.UserManager;
import com.atlassian.sal.api.pluginsettings.PluginSettings;
import com.atlassian.sal.api.pluginsettings.PluginSettingsFactory;
import com.atlassian.upm.api.license.PluginLicenseManager;
import com.atlassian.upm.api.license.entity.Contact;
import com.atlassian.upm.api.license.entity.PluginLicense;
import com.miniorange.sso.saml.jira.servlet.SAMLLoginServlet;
import com.miniorange.sso.saml.utils.SAMLUtils;
import com.miniorange.sso.saml.jira.PluginConstants;
public class SAMLSettings {
private static Log LOGGER = LogFactory.getLog(SAMLLoginServlet.class);
private PluginSettings pluginSettings;
private LicenseCountService licenseCountService;
private PluginLicenseManager pluginLicenseManager;
private UserManager userManager;
public static final String CUSTOMER_TOKEN_KEY = generateRandomAlphaNumericKey(16);
public LicenseCountService getLicenseCountService() {
return licenseCountService;
}
public void setLicenseCountService(LicenseCountService licenseCountService) {
this.licenseCountService = licenseCountService;
}
public PluginLicenseManager getPluginLicenseManager() {
return pluginLicenseManager;
}
public void setPluginLicenseManager(PluginLicenseManager pluginLicenseManager) {
this.pluginLicenseManager = pluginLicenseManager;
}
public void setPluginSettingsFactory(PluginSettingsFactory pluginSettingsFactory) {
this.pluginSettings = pluginSettingsFactory.createGlobalSettings();
}
public void setUserManager(UserManager userManager) {
this.userManager = userManager;
}
}
atlassian-plugin.xml
<?xml version="1.0" encoding="UTF-8"?>
<atlassian-plugin key="${project.groupId}.${project.artifactId}"
name="${project.name}" plugins-version="2">
<plugin-info>
<description>${project.description}</description>
<version>${project.version}</version>
<vendor name="${project.organization.name}" url="${project.organization.url}" />
<param name="atlassian-data-center-compatible">true</param>
<param name="plugin-icon">images/icon.png</param>
<param name="plugin-logo">images/logo.png</param>
<param name="configure.url">/secure/admin/samlsso.configure.jspa</param>
<param name="atlassian-licensing-enabled">true</param>
</plugin-info>
<!-- add our i18n resource -->
<resource type="i18n" name="i18n" location="jira-sso" />
<!-- add our web resources -->
<web-resource key="samlsso.plugin.auth.resources"
i18n-name-key="samlsso.plugin.auth.resources" name="Authentication Resources">
<resource name="jira-sso.js" type="download" location="js/jira-sso.js" />
<context>atl.general</context>
</web-resource>
<web-resource key="samlsso.plugin.admin.resources"
i18n-name-key="samlsso.plugin.admin.resources" name="Admin Resources">
<dependency>com.atlassian.auiplugin:ajs</dependency>
<resource name="jira-sso.js" type="download" location="js/jira-sso.js" />
<resource name="jira-sso.css" type="download" location="css/jira-sso.css" />
<context>atl.admin</context>
</web-resource>
<web-item name="SAML SSO Configuration Menu" i18n-name-key="samlsso.config.menu"
key="samlsso.config.menu" section="top_system_section/security_section"
weight="150" application="jira">
<description key="samlsso.config.menu.desc">This display menu item for configuring
the plugin in System settings
under Security.
</description>
<label key="samlsso.config.menu.lable">SAML SSO Configuration</label>
<link linkId="samlsso.config.menu.link">/secure/admin/samlsso.configure.jspa</link>
</web-item>
<webwork1 i18n-name-key="samlsso.config.action" key="samlsso.config.action"
name="SAML SSO Configuration Action" class="java.lang.Object">
<description key="samlsso.config.action.desc">This helps you configure the SAML SSO
Plugin.</description>
<actions>
<action name="com.miniorange.sso.saml.jira.servlet.ConfigurationAction"
alias="samlsso.configure">
<view name="input">/templates/com/miniorange/sso/saml/jira/configure.vm
</view>
<view name="success">/templates/com/miniorange/sso/saml/jira/configure.vm
</view>
<view name="error">/templates/com/miniorange/sso/saml/jira/configure.vm
</view>
</action>
<action
name="com.miniorange.sso.saml.jira.servlet.DownloadCertificateServlet"
alias="samlsso.downloadcertificate">
<view name="input">/templates/com/miniorange/sso/saml/jira/configure.vm
</view>
</action>
</actions>
</webwork1>
<component i18n-name-key="samlsso.plugin.settings" key="samlsso.plugin.settings"
name="SAML SSO Plugin Settings" class="com.miniorange.sso.saml.jira.SAMLSettings" />
<component i18n-name-key="samlsso.plugin.handler" key="samlsso.plugin.handler"
name="SAML SSO Plugin Handler" class="com.miniorange.sso.saml.jira.PluginHandler" />
<component i18n-name-key="samlsso.saml.message.handler" key="samlsso.saml.message.handler"
name="SAML Message Handler" class="com.miniorange.sso.saml.jira.SAMLManager" />
<component i18n-name-key="samlsso.websudo.session.handler"
key="samlsso.websudo.session.handler" name="WebSudo Session Handler"
class="com.miniorange.sso.saml.jira.JiraSAMLSSOWebSudoSessionManager" />
<component i18n-name-key="samlsso.authenticator" key="samlsso.authenticator"
name="SAML SSO Authenticator" class="com.miniorange.sso.saml.jira.JiraSAMLSSOAuthenticator" />
<component-import i18n-name-key="samlsso.plugin.settings.factory"
key="samlsso.plugin.settings.factory" name="Plugin Settings Factory"
interface="com.atlassian.sal.api.pluginsettings.PluginSettingsFactory"
filter="" />
<component-import i18n-name-key="samlsso.login.uri.provider"
key="samlsso.login.uri.provider" name="Login URI Provider"
interface="com.atlassian.sal.api.auth.LoginUriProvider" filter="" />
<component-import i18n-name-key="samlsso.application.properties"
key="samlsso.application.properties" name="Application Properties"
interface="com.atlassian.sal.api.ApplicationProperties" filter="" />
<component-import i18n-name-key="samlsso.user.manager"
key="user.manager" name="User Manager" interface="com.atlassian.sal.api.user.UserManager"
filter="" />
<component-import i18n-name-key="samlsso.user.util"
key="user.util" name="User Util" interface="com.atlassian.jira.user.util.UserUtil"
filter="" />
<component-import key="PluginLicenseManager" interface="com.atlassian.upm.api.license.PluginLicenseManager"/>
<!-- SAML LOGIN Servlets & Filters -->
<servlet name="Get Configuration Servlet" i18n-name-key="samlsso.config.servlet"
key="samlsso.config.servlet" class="com.miniorange.sso.saml.jira.servlet.GetConfigurationServlet">
<description key="samlsso.config.servlet.desc">This module handles configuration of your
Identity Provider.
</description>
<url-pattern>/saml/getconfig</url-pattern>
</servlet>
<servlet name="Login with IDP" i18n-name-key="samlsso.login"
key="samlsso.login" class="com.miniorange.sso.saml.jira.servlet.SAMLLoginServlet">
<description key="samlsso.login.desc">This module handles login with your
Identity Provider.</description>
<url-pattern>/saml/auth</url-pattern>
</servlet>
<servlet name="SAML Single Logout" i18n-name-key="samlsso.logout"
key="samlsso.logout" class="com.miniorange.sso.saml.jira.servlet.SAMLLogoutServlet">
<description key="samlsso.logout.desc">This module handles Single Logout with
your Identity Provider.</description>
<url-pattern>/saml/logout</url-pattern>
</servlet>
<servlet name="Download Idp Guide" i18n-name-key="samlsso.config.downloadidpguides" key="samlsso.config.downloadidpguides"
class="com.miniorange.sso.saml.jira.servlet.DownloadIdpGuidesServlet">
<description key="samlsso.config.downloadidpguides.desc">This module allows you to download Guides for your Identity Provider.
</description>
<url-pattern>/downloadidpguides</url-pattern>
</servlet>
<servlet name="SP Metadata Generator" i18n-name-key="samlsso.metadata.generator"
key="samlsso.metadata.generator" class="com.miniorange.sso.saml.jira.servlet.MetadataServlet">
<description key="samlsso.login.desc">This module generates SP metadata for
your JIRA Instance.</description>
<url-pattern>/saml/metadata</url-pattern>
</servlet>
<servlet-filter name="SAML SSO Filter" key="saml-login-filter"
location="before-dispatch" class="com.miniorange.sso.saml.jira.servlet.SAMLLoginFilter"
weight="200">
<description>
Force authentication with IdP by redirecting user to IdP's login page
instead of Jira.
</description>
<url-pattern>/secure/Dashboard.jspa</url-pattern>
<url-pattern>/login.jsp</url-pattern>
<url-pattern>/plugins/servlet/mobile</url-pattern>
<url-pattern>/secure/admin/WebSudoAuthenticate!default.jspa
</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</servlet-filter>
</atlassian-plugin>
Please let me know if anymore information needs to be included.