From 866ce1e8368c6f680cacf00e56b3fc3d45882112 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Fri, 19 Dec 2014 17:52:44 +0100 Subject: [PATCH] added extension point for shiro realms --- .../main/resources/META-INF/scm/module.xml | 4 +++ .../java/sonia/scm/ScmContextListener.java | 4 ++- .../java/sonia/scm/ScmSecurityModule.java | 28 +++++++++++++++++-- .../java/sonia/scm/security/DefaultRealm.java | 2 ++ 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/scm-core/src/main/resources/META-INF/scm/module.xml b/scm-core/src/main/resources/META-INF/scm/module.xml index 40f3cefc34..8a65f75712 100644 --- a/scm-core/src/main/resources/META-INF/scm/module.xml +++ b/scm-core/src/main/resources/META-INF/scm/module.xml @@ -40,4 +40,8 @@ http://bitbucket.org/sdorra/scm-manager com.google.inject.Module false + + org.apache.shiro.realm.Realm + false + diff --git a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java index 0d5b4d71d3..1990d3bfb6 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java @@ -256,7 +256,9 @@ public class ScmContextListener extends GuiceServletContextListener moduleList.add(new EagerSingletonModule()); moduleList.add(ShiroWebModule.guiceFilterModule()); moduleList.add(new ScmServletModule(servletCtx, pluginLoader, overrides)); - moduleList.add(new ScmSecurityModule(servletCtx)); + moduleList.add( + new ScmSecurityModule(servletCtx, pluginLoader.getExtensionProcessor()) + ); appendModules(pluginLoader.getExtensionProcessor(), moduleList); moduleList.addAll(overrides.getModules()); diff --git a/scm-webapp/src/main/java/sonia/scm/ScmSecurityModule.java b/scm-webapp/src/main/java/sonia/scm/ScmSecurityModule.java index db7cd4b1a6..0a8a4f7a7a 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmSecurityModule.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmSecurityModule.java @@ -41,8 +41,12 @@ import org.apache.shiro.authc.credential.DefaultPasswordService; import org.apache.shiro.authc.credential.PasswordService; import org.apache.shiro.crypto.hash.DefaultHashService; import org.apache.shiro.guice.web.ShiroWebModule; +import org.apache.shiro.realm.Realm; -import sonia.scm.security.DefaultRealm; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import sonia.scm.plugin.ExtensionProcessor; import static org.apache.shiro.guice.web.ShiroWebModule.ROLES; @@ -60,6 +64,12 @@ public class ScmSecurityModule extends ShiroWebModule /** Field description */ private static final int ITERATIONS = 8192; + /** + * the logger for ScmSecurityModule + */ + private static final Logger logger = + LoggerFactory.getLogger(ScmSecurityModule.class); + //~--- constructors --------------------------------------------------------- /** @@ -67,10 +77,13 @@ public class ScmSecurityModule extends ShiroWebModule * * * @param servletContext + * @param extensionProcessor */ - ScmSecurityModule(ServletContext servletContext) + ScmSecurityModule(ServletContext servletContext, + ExtensionProcessor extensionProcessor) { super(servletContext); + this.extensionProcessor = extensionProcessor; } //~--- methods -------------------------------------------------------------- @@ -89,7 +102,11 @@ public class ScmSecurityModule extends ShiroWebModule expose(PasswordService.class); // bind realm - bindRealm().to(DefaultRealm.class); + for (Class realm : extensionProcessor.byExtensionPoint(Realm.class)) + { + logger.info("bind security realm {}", realm); + bindRealm().to(realm); + } // bind constant bindConstant().annotatedWith(Names.named("shiro.loginUrl")).to( @@ -115,4 +132,9 @@ public class ScmSecurityModule extends ShiroWebModule return passwordService; } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private final ExtensionProcessor extensionProcessor; } diff --git a/scm-webapp/src/main/java/sonia/scm/security/DefaultRealm.java b/scm-webapp/src/main/java/sonia/scm/security/DefaultRealm.java index 141dcc3373..365e5d2b74 100644 --- a/scm-webapp/src/main/java/sonia/scm/security/DefaultRealm.java +++ b/scm-webapp/src/main/java/sonia/scm/security/DefaultRealm.java @@ -58,6 +58,7 @@ import org.slf4j.LoggerFactory; import sonia.scm.group.Group; import sonia.scm.group.GroupDAO; import sonia.scm.group.GroupNames; +import sonia.scm.plugin.Extension; import sonia.scm.user.User; import sonia.scm.user.UserDAO; @@ -74,6 +75,7 @@ import javax.inject.Singleton; * * @since 2.0.0 */ +@Extension @Singleton public class DefaultRealm extends AuthorizingRealm {