diff --git a/pom.xml b/pom.xml index a035c6db786..ccd04efd40e 100755 --- a/pom.xml +++ b/pom.xml @@ -211,6 +211,11 @@ shiro-web 1.2.3 + + org.apache.shiro + shiro-config-core + 1.2.3 + diff --git a/zeppelin-server/pom.xml b/zeppelin-server/pom.xml index 675a2ce0148..e1c39e37c50 100644 --- a/zeppelin-server/pom.xml +++ b/zeppelin-server/pom.xml @@ -311,6 +311,15 @@ + + org.apache.maven.plugins + maven-surefire-plugin + 2.17 + + alphabetical + + + maven-failsafe-plugin 2.16 diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java b/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java index 7412611532b..0ff0dc6ac63 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java @@ -32,6 +32,7 @@ import org.apache.zeppelin.search.SearchService; import org.apache.zeppelin.socket.NotebookServer; import org.apache.zeppelin.user.Credentials; +import org.apache.zeppelin.utils.SecurityUtils; import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.server.*; import org.eclipse.jetty.server.handler.ContextHandlerCollection; @@ -238,6 +239,7 @@ private static void setupRestApiContextHandler(WebAppContext webapp, webapp.setInitParameter("shiroConfigLocations", new File(conf.getShiroPath()).toURI().toString()); + SecurityUtils.initSecurityManager(conf.getShiroPath()); webapp.addFilter(org.apache.shiro.web.servlet.ShiroFilter.class, "/api/*", EnumSet.allOf(DispatcherType.class)); diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/utils/SecurityUtils.java b/zeppelin-server/src/main/java/org/apache/zeppelin/utils/SecurityUtils.java index 4de45731a76..f9e5929a882 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/utils/SecurityUtils.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/utils/SecurityUtils.java @@ -21,6 +21,8 @@ import org.apache.shiro.subject.Subject; import org.apache.shiro.util.ThreadContext; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.apache.shiro.mgt.SecurityManager; +import org.apache.shiro.config.IniSecurityManagerFactory; import org.apache.zeppelin.conf.ZeppelinConfiguration; import java.net.InetAddress; @@ -34,6 +36,12 @@ */ public class SecurityUtils { + public static void initSecurityManager(String shiroPath) { + IniSecurityManagerFactory factory = new IniSecurityManagerFactory("file:" + shiroPath); + SecurityManager securityManager = factory.getInstance(); + org.apache.shiro.SecurityUtils.setSecurityManager(securityManager); + } + public static Boolean isValidOrigin(String sourceHost, ZeppelinConfiguration conf) throws UnknownHostException, URISyntaxException { if (sourceHost == null || sourceHost.isEmpty()) { diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/integration/ParagraphActionsIT.java b/zeppelin-server/src/test/java/org/apache/zeppelin/integration/ParagraphActionsIT.java index a76706b9ff3..e07cdba0c8c 100644 --- a/zeppelin-server/src/test/java/org/apache/zeppelin/integration/ParagraphActionsIT.java +++ b/zeppelin-server/src/test/java/org/apache/zeppelin/integration/ParagraphActionsIT.java @@ -92,21 +92,28 @@ public void testCreateNewButton() throws Exception { ZeppelinITUtils.sleep(1000, false); waitForParagraph(1, "READY"); + String oldIntpTag = driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'editor')]")).getText(); + collector.checkThat("Paragraph is created above", driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'editor')]")).getText(), - CoreMatchers.equalTo(StringUtils.EMPTY)); + CoreMatchers.not(StringUtils.EMPTY)); setTextOfParagraph(1, " this is above "); + newPara = driver.findElement(By.xpath(getParagraphXPath(2) + "//div[contains(@class,'new-paragraph')][2]")); action.moveToElement(newPara).click().build().perform(); waitForParagraph(3, "READY"); + String lastIntpTag = driver.findElement(By.xpath(getParagraphXPath(3) + "//div[contains(@class, 'editor')]")).getText(); + collector.checkThat("Paragraph is created below", driver.findElement(By.xpath(getParagraphXPath(3) + "//div[contains(@class, 'editor')]")).getText(), - CoreMatchers.equalTo(StringUtils.EMPTY)); + CoreMatchers.not(StringUtils.EMPTY)); setTextOfParagraph(3, " this is below "); + collector.checkThat("Compare interpreter name tag", oldIntpTag, CoreMatchers.equalTo(lastIntpTag)); + collector.checkThat("The output field of paragraph1 contains", driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'editor')]")).getText(), CoreMatchers.equalTo(" this is above ")); diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/integration/AuthenticationIT.java b/zeppelin-server/src/test/java/org/apache/zeppelin/integration/ZeppelinShiroAuthenticationIT.java similarity index 95% rename from zeppelin-server/src/test/java/org/apache/zeppelin/integration/AuthenticationIT.java rename to zeppelin-server/src/test/java/org/apache/zeppelin/integration/ZeppelinShiroAuthenticationIT.java index 3b1088e8b23..555fff3e67b 100644 --- a/zeppelin-server/src/test/java/org/apache/zeppelin/integration/AuthenticationIT.java +++ b/zeppelin-server/src/test/java/org/apache/zeppelin/integration/ZeppelinShiroAuthenticationIT.java @@ -42,8 +42,8 @@ /** * Created for org.apache.zeppelin.integration on 13/06/16. */ -public class AuthenticationIT extends AbstractZeppelinIT { - private static final Logger LOG = LoggerFactory.getLogger(AuthenticationIT.class); +public class ZeppelinShiroAuthenticationIT extends AbstractZeppelinIT { + private static final Logger LOG = LoggerFactory.getLogger(ZeppelinShiroAuthenticationIT.class); @Rule public ErrorCollector collector = new ErrorCollector(); @@ -133,7 +133,7 @@ public void testSimpleAuthentication() throws Exception { return; } try { - AuthenticationIT authenticationIT = new AuthenticationIT(); + ZeppelinShiroAuthenticationIT authenticationIT = new ZeppelinShiroAuthenticationIT(); authenticationIT.authenticationUser("admin", "password1"); collector.checkThat("Check is user logged in", true, @@ -152,7 +152,7 @@ public void testGroupPermission() throws Exception { return; } try { - AuthenticationIT authenticationIT = new AuthenticationIT(); + ZeppelinShiroAuthenticationIT authenticationIT = new ZeppelinShiroAuthenticationIT(); authenticationIT.authenticationUser("finance1", "finance1"); createNewNote();