SHIRO-493 - Adding new methods and deprecating old to ShiroWebModule to support Guice 4
Project: http://git-wip-us.apache.org/repos/asf/shiro/repo Commit: http://git-wip-us.apache.org/repos/asf/shiro/commit/f2dfa7ff Tree: http://git-wip-us.apache.org/repos/asf/shiro/tree/f2dfa7ff Diff: http://git-wip-us.apache.org/repos/asf/shiro/diff/f2dfa7ff Branch: refs/heads/master Commit: f2dfa7ff39c9870e7b9856ceca8690c5398080fa Parents: f5acaa0 Author: Brian Demers <bdem...@apache.org> Authored: Thu Jul 14 09:51:45 2016 -0400 Committer: Brian Demers <bdem...@apache.org> Committed: Tue Oct 18 13:54:50 2016 -0400 ---------------------------------------------------------------------- integration-tests/guice3/pom.xml | 117 ++++++++++ .../guice/SampleShiroGuiceBootstrap.java | 43 ++++ .../samples/guice/SampleShiroServletModule.java | 92 ++++++++ .../guice3/src/main/resources/log4j.properties | 47 ++++ .../guice3/src/main/webapp/WEB-INF/shiro.ini | 53 +++++ .../guice3/src/main/webapp/WEB-INF/web.xml | 43 ++++ .../guice3/src/main/webapp/account/index.jsp | 36 +++ .../guice3/src/main/webapp/home.jsp | 69 ++++++ .../guice3/src/main/webapp/include.jsp | 22 ++ .../guice3/src/main/webapp/index.jsp | 21 ++ .../guice3/src/main/webapp/login.jsp | 110 +++++++++ .../guice3/src/main/webapp/style.css | 47 ++++ .../samples/guice/AbstractContainerIT.java | 142 ++++++++++++ .../samples/guice/ContainerIntegrationIT.java | 79 +++++++ integration-tests/guice4/pom.xml | 131 +++++++++++ .../guice/SampleShiroGuiceBootstrap.java | 43 ++++ .../samples/guice/SampleShiroServletModule.java | 92 ++++++++ .../guice4/src/main/resources/log4j.properties | 47 ++++ .../guice4/src/main/webapp/WEB-INF/shiro.ini | 53 +++++ .../guice4/src/main/webapp/WEB-INF/web.xml | 43 ++++ .../guice4/src/main/webapp/account/index.jsp | 36 +++ .../guice4/src/main/webapp/home.jsp | 69 ++++++ .../guice4/src/main/webapp/include.jsp | 22 ++ .../guice4/src/main/webapp/index.jsp | 21 ++ .../guice4/src/main/webapp/login.jsp | 110 +++++++++ .../guice4/src/main/webapp/style.css | 47 ++++ .../samples/guice/AbstractContainerIT.java | 142 ++++++++++++ .../samples/guice/ContainerIntegrationIT.java | 79 +++++++ integration-tests/pom.xml | 52 +++++ pom.xml | 70 ++++-- samples/guice/pom.xml | 21 -- .../samples/guice/SampleShiroServletModule.java | 4 +- samples/jaxrs/pom.xml | 6 - samples/servlet-plugin/pom.xml | 6 - samples/web/pom.xml | 6 - support/guice/pom.xml | 27 ++- .../org/apache/shiro/guice/ShiroModule.java | 61 +++++ .../apache/shiro/guice/web/ShiroWebModule.java | 229 ++++++++++++++++--- .../shiro/guice/web/SimpleFilterChain.java | 9 + .../org/apache/shiro/guice/ShiroModuleTest.java | 109 ++++++++- .../shiro/guice/web/FilterConfigTest.java | 3 +- .../shiro/guice/web/ShiroWebModuleTest.java | 192 +++++++++++++++- .../guice/src/test/resources/log4j.properties | 34 +++ 43 files changed, 2589 insertions(+), 96 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice3/pom.xml ---------------------------------------------------------------------- diff --git a/integration-tests/guice3/pom.xml b/integration-tests/guice3/pom.xml new file mode 100644 index 0000000..1f4b674 --- /dev/null +++ b/integration-tests/guice3/pom.xml @@ -0,0 +1,117 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ with the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. + --> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.apache.shiro.integrationtests</groupId> + <artifactId>shiro-integration-tests</artifactId> + <version>1.4.0-SNAPSHOT</version> + </parent> + + <artifactId>shiro-its-guice3</artifactId> + <name>Apache Shiro :: ITs :: Guice 3</name> + <packaging>war</packaging> + + <build> + <plugins> + <plugin> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-maven-plugin</artifactId> + </plugin> + </plugins> + </build> + + <dependencies> + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>jstl</artifactId> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>javax.servlet-api</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-log4j12</artifactId> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>log4j</groupId> + <artifactId>log4j</artifactId> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>org.apache.shiro</groupId> + <artifactId>shiro-core</artifactId> + </dependency> + <dependency> + <groupId>org.apache.shiro</groupId> + <artifactId>shiro-web</artifactId> + </dependency> + <dependency> + <groupId>org.apache.shiro</groupId> + <artifactId>shiro-guice</artifactId> + </dependency> + <dependency> + <groupId>com.google.inject.extensions</groupId> + <artifactId>guice-servlet</artifactId> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>jcl-over-slf4j</artifactId> + <scope>runtime</scope> + </dependency> + + <dependency> + <groupId>org.apache.shiro</groupId> + <artifactId>shiro-guice</artifactId> + <version>${project.version}</version> + <classifier>tests</classifier> + </dependency> + <dependency> + <groupId>net.sourceforge.htmlunit</groupId> + <artifactId>htmlunit</artifactId> + <version>2.6</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>apache-jsp</artifactId> + <version>${jetty.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>apache-jstl</artifactId> + <version>${jetty.version}</version> + <type>pom</type> + <scope>test</scope> + </dependency> + <dependency> + <groupId>com.github.mjeanroy</groupId> + <artifactId>junit-servers-jetty</artifactId> + <scope>test</scope> + </dependency> + </dependencies> + +</project> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice3/src/main/java/org/apache/shiro/samples/guice/SampleShiroGuiceBootstrap.java ---------------------------------------------------------------------- diff --git a/integration-tests/guice3/src/main/java/org/apache/shiro/samples/guice/SampleShiroGuiceBootstrap.java b/integration-tests/guice3/src/main/java/org/apache/shiro/samples/guice/SampleShiroGuiceBootstrap.java new file mode 100644 index 0000000..ea9926f --- /dev/null +++ b/integration-tests/guice3/src/main/java/org/apache/shiro/samples/guice/SampleShiroGuiceBootstrap.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.shiro.samples.guice; + +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.servlet.GuiceServletContextListener; +import org.apache.shiro.guice.web.ShiroWebModule; + +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; + +public class SampleShiroGuiceBootstrap extends GuiceServletContextListener { + + private ServletContext servletContext; + + @Override + public void contextInitialized(final ServletContextEvent servletContextEvent) { + this.servletContext = servletContextEvent.getServletContext(); + super.contextInitialized(servletContextEvent); + } + + @Override + protected Injector getInjector() { + return Guice.createInjector(new SampleShiroServletModule(servletContext), ShiroWebModule.guiceFilterModule()); + } +} http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice3/src/main/java/org/apache/shiro/samples/guice/SampleShiroServletModule.java ---------------------------------------------------------------------- diff --git a/integration-tests/guice3/src/main/java/org/apache/shiro/samples/guice/SampleShiroServletModule.java b/integration-tests/guice3/src/main/java/org/apache/shiro/samples/guice/SampleShiroServletModule.java new file mode 100644 index 0000000..8b23855 --- /dev/null +++ b/integration-tests/guice3/src/main/java/org/apache/shiro/samples/guice/SampleShiroServletModule.java @@ -0,0 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.shiro.samples.guice; + +import com.google.inject.Provides; +import com.google.inject.binder.AnnotatedBindingBuilder; +import com.google.inject.name.Names; +import org.apache.shiro.codec.Base64; +import org.apache.shiro.config.ConfigurationException; +import org.apache.shiro.config.Ini; +import org.apache.shiro.guice.web.ShiroWebModule; +import org.apache.shiro.realm.text.IniRealm; +import org.apache.shiro.web.mgt.CookieRememberMeManager; +import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.apache.shiro.web.mgt.WebSecurityManager; + +import javax.inject.Singleton; +import javax.servlet.ServletContext; +import java.net.MalformedURLException; +import java.net.URL; + +public class SampleShiroServletModule extends ShiroWebModule { + private final ServletContext servletContext; + + public SampleShiroServletModule(ServletContext servletContext) { + super(servletContext); + + this.servletContext = servletContext; + } + + @Override + protected void configureShiroWeb() { + bindConstant().annotatedWith(Names.named("shiro.loginUrl")).to("/login.jsp"); + try { + this.bindRealm().toConstructor(IniRealm.class.getConstructor(Ini.class)); + } catch (NoSuchMethodException e) { + addError("Could not locate proper constructor for IniRealm.", e); + } + + this.addFilterChain("/login.jsp", AUTHC); + this.addFilterChain("/logout", LOGOUT); + this.addFilterChain("/account/**", AUTHC); + + this.addFilterChain("/remoting/**", AUTHC, config(ROLES, "b2bClient"), config(PERMS, "remote:invoke:lan,wan")); + } + + @Provides + @Singleton + Ini loadShiroIni() throws MalformedURLException { + URL iniUrl = servletContext.getResource("/WEB-INF/shiro.ini"); + return Ini.fromResourcePath("url:" + iniUrl.toExternalForm()); + } + + @Override + protected void bindWebSecurityManager(AnnotatedBindingBuilder<? super WebSecurityManager> bind) + { + try + { + String cipherKey = loadShiroIni().getSectionProperty( "main", "securityManager.rememberMeManager.cipherKey" ); + + DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); + CookieRememberMeManager rememberMeManager = new CookieRememberMeManager(); + rememberMeManager.setCipherKey( Base64.decode( cipherKey ) ); + securityManager.setRememberMeManager(rememberMeManager); + bind.toInstance(securityManager); + } + catch ( MalformedURLException e ) + { + // for now just throw, you could just call + // super.bindWebSecurityManager(bind) if you do not need rememberMe functionality + throw new ConfigurationException( "securityManager.rememberMeManager.cipherKey must be set in shiro.ini." ); + } + + + } +} http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice3/src/main/resources/log4j.properties ---------------------------------------------------------------------- diff --git a/integration-tests/guice3/src/main/resources/log4j.properties b/integration-tests/guice3/src/main/resources/log4j.properties new file mode 100644 index 0000000..b10506b --- /dev/null +++ b/integration-tests/guice3/src/main/resources/log4j.properties @@ -0,0 +1,47 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +log4j.rootLogger=TRACE, stdout + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d %-5p [%c]: %m%n + +# ============================================================================= +# 3rd Party Libraries +# OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL +# ============================================================================= +# ehcache caching manager: +log4j.logger.net.sf.ehcache=WARN + +# Most all Apache libs: +log4j.logger.org.apache=WARN + +# Quartz Enterprise Scheular (java 'cron' utility) +log4j.logger.org.quartz=WARN + +# ============================================================================= +# Apache Shiro +# ============================================================================= +# Shiro security framework +log4j.logger.org.apache.shiro=TRACE +#log4j.logger.org.apache.shiro.realm.text.PropertiesRealm=INFO +#log4j.logger.org.apache.shiro.cache.ehcache.EhCache=INFO +#log4j.logger.org.apache.shiro.io=INFO +#log4j.logger.org.apache.shiro.web.servlet=INFO +log4j.logger.org.apache.shiro.util.ThreadContext=INFO http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice3/src/main/webapp/WEB-INF/shiro.ini ---------------------------------------------------------------------- diff --git a/integration-tests/guice3/src/main/webapp/WEB-INF/shiro.ini b/integration-tests/guice3/src/main/webapp/WEB-INF/shiro.ini new file mode 100644 index 0000000..db453e7 --- /dev/null +++ b/integration-tests/guice3/src/main/webapp/WEB-INF/shiro.ini @@ -0,0 +1,53 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# INI configuration is very powerful and flexible, while still remaining succinct. +# Please http://shiro.apache.org/configuration.html and +# http://shiro.apache.org/web.html for more. + +[main] +shiro.loginUrl = /login.jsp + +# We need to set the cipherKey, if you want the rememberMe cookie to work after restarting or on multiple nodes. +# YOU MUST SET THIS TO A UNIQUE STRING +securityManager.rememberMeManager.cipherKey = kPH+bIxk5D2deZiIxcaaaA== + +[users] +# format: username = password, role1, role2, ..., roleN +root = secret,admin +guest = guest,guest +presidentskroob = 12345,president +darkhelmet = ludicrousspeed,darklord,schwartz +lonestarr = vespa,goodguy,schwartz + +[roles] +# format: roleName = permission1, permission2, ..., permissionN +admin = * +schwartz = lightsaber:* +goodguy = winnebago:drive:eagle5 + +[urls] +# The /login.jsp is not restricted to authenticated users (otherwise no one could log in!), but +# the 'authc' filter must still be specified for it so it can process that url's +# login submissions. It is 'smart' enough to allow those requests through as specified by the +# shiro.loginUrl above. +/login.jsp = authc +/logout = logout +/account/** = authc +/remoting/** = authc, roles[b2bClient], perms["remote:invoke:lan,wan"] \ No newline at end of file http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice3/src/main/webapp/WEB-INF/web.xml ---------------------------------------------------------------------- diff --git a/integration-tests/guice3/src/main/webapp/WEB-INF/web.xml b/integration-tests/guice3/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..46567d4 --- /dev/null +++ b/integration-tests/guice3/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ with the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. + --> +<web-app version="2.4" + xmlns="http://java.sun.com/xml/ns/j2ee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> + + <listener> + <listener-class>org.apache.shiro.samples.guice.SampleShiroGuiceBootstrap</listener-class> + </listener> + + <filter> + <filter-name>GuiceFilter</filter-name> + <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> + </filter> + + <filter-mapping> + <filter-name>GuiceFilter</filter-name> + <url-pattern>/*</url-pattern> + </filter-mapping> + + <welcome-file-list> + <welcome-file>index.jsp</welcome-file> + </welcome-file-list> + +</web-app> http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice3/src/main/webapp/account/index.jsp ---------------------------------------------------------------------- diff --git a/integration-tests/guice3/src/main/webapp/account/index.jsp b/integration-tests/guice3/src/main/webapp/account/index.jsp new file mode 100644 index 0000000..4f6c9d8 --- /dev/null +++ b/integration-tests/guice3/src/main/webapp/account/index.jsp @@ -0,0 +1,36 @@ +<%-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ with the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. + --%> +<%@ include file="../include.jsp" %> + +<html> +<head> + <link type="text/css" rel="stylesheet" href="<c:url value="/style.css"/>"/> +</head> +<body> + +<h2>Users only</h2> + +<p>You are currently logged in.</p> + +<p><a href="<c:url value="/home.jsp"/>">Return to the home page.</a></p> + +<p><a href="<c:url value="/logout"/>">Log out.</a></p> + +</body> +</html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice3/src/main/webapp/home.jsp ---------------------------------------------------------------------- diff --git a/integration-tests/guice3/src/main/webapp/home.jsp b/integration-tests/guice3/src/main/webapp/home.jsp new file mode 100644 index 0000000..61dee25 --- /dev/null +++ b/integration-tests/guice3/src/main/webapp/home.jsp @@ -0,0 +1,69 @@ +<%-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ with the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. + --%> +<%@ include file="include.jsp" %> + +<html> +<head> + <link type="text/css" rel="stylesheet" href="<c:url value="/style.css"/>"/> + <title>Apache Shiro Quickstart</title> +</head> +<body> + +<h1>Apache Shiro Quickstart</h1> + +<p>Hi <shiro:guest>Guest</shiro:guest><shiro:user><shiro:principal/></shiro:user>! + ( <shiro:user><a href="<c:url value="/logout"/>">Log out</a></shiro:user> + <shiro:guest><a href="<c:url value="/login.jsp"/>">Log in</a> (sample accounts provided)</shiro:guest> ) +</p> + +<p>Welcome to the Apache Shiro Quickstart sample application. + This page represents the home page of any web application.</p> + +<shiro:user><p>Visit your <a href="<c:url value="/account"/>">account page</a>.</p></shiro:user> +<shiro:guest><p>If you want to access the user-only <a href="<c:url value="/account"/>">account page</a>, + you will need to log-in first.</p></shiro:guest> + +<h2>Roles</h2> + +<p>To show some taglibs, here are the roles you have and don't have. Log out and log back in under different user + accounts to see different roles.</p> + +<h3>Roles you have</h3> + +<p> + <shiro:hasRole name="admin">admin<br/></shiro:hasRole> + <shiro:hasRole name="president">president<br/></shiro:hasRole> + <shiro:hasRole name="darklord">darklord<br/></shiro:hasRole> + <shiro:hasRole name="goodguy">goodguy<br/></shiro:hasRole> + <shiro:hasRole name="schwartz">schwartz<br/></shiro:hasRole> +</p> + +<h3>Roles you DON'T have</h3> + +<p> + <shiro:lacksRole name="admin">admin<br/></shiro:lacksRole> + <shiro:lacksRole name="president">president<br/></shiro:lacksRole> + <shiro:lacksRole name="darklord">darklord<br/></shiro:lacksRole> + <shiro:lacksRole name="goodguy">goodguy<br/></shiro:lacksRole> + <shiro:lacksRole name="schwartz">schwartz<br/></shiro:lacksRole> +</p> + + +</body> +</html> http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice3/src/main/webapp/include.jsp ---------------------------------------------------------------------- diff --git a/integration-tests/guice3/src/main/webapp/include.jsp b/integration-tests/guice3/src/main/webapp/include.jsp new file mode 100644 index 0000000..fddd239 --- /dev/null +++ b/integration-tests/guice3/src/main/webapp/include.jsp @@ -0,0 +1,22 @@ +<%-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ with the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. + --%> +<%@ page import="org.apache.shiro.SecurityUtils" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice3/src/main/webapp/index.jsp ---------------------------------------------------------------------- diff --git a/integration-tests/guice3/src/main/webapp/index.jsp b/integration-tests/guice3/src/main/webapp/index.jsp new file mode 100644 index 0000000..9dedd19 --- /dev/null +++ b/integration-tests/guice3/src/main/webapp/index.jsp @@ -0,0 +1,21 @@ +<%-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ with the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. + --%> + +<%-- Forward the user to the home page --%> +<jsp:forward page="home.jsp"/> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice3/src/main/webapp/login.jsp ---------------------------------------------------------------------- diff --git a/integration-tests/guice3/src/main/webapp/login.jsp b/integration-tests/guice3/src/main/webapp/login.jsp new file mode 100644 index 0000000..c80ee54 --- /dev/null +++ b/integration-tests/guice3/src/main/webapp/login.jsp @@ -0,0 +1,110 @@ +<%-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ with the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. + --%> +<%@ include file="include.jsp" %> + +<html> +<head> + <link type="text/css" rel="stylesheet" href="<c:url value="/style.css"/>"/> +</head> +<body> + +<h2>Please Log in</h2> + +<shiro:guest> + <p>Here are a few sample accounts to play with in the default text-based Realm (used for this + demo and test installs only). Do you remember the movie these names came from? ;)</p> + + + <style type="text/css"> + table.sample { + border-width: 1px; + border-style: outset; + border-color: blue; + border-collapse: separate; + background-color: rgb(255, 255, 240); + } + + table.sample th { + border-width: 1px; + padding: 1px; + border-style: none; + border-color: blue; + background-color: rgb(255, 255, 240); + } + + table.sample td { + border-width: 1px; + padding: 1px; + border-style: none; + border-color: blue; + background-color: rgb(255, 255, 240); + } + </style> + + + <table class="sample"> + <thead> + <tr> + <th>Username</th> + <th>Password</th> + </tr> + </thead> + <tbody> + <tr> + <td>root</td> + <td>secret</td> + </tr> + <tr> + <td>presidentskroob</td> + <td>12345</td> + </tr> + <tr> + <td>darkhelmet</td> + <td>ludicrousspeed</td> + </tr> + <tr> + <td>lonestarr</td> + <td>vespa</td> + </tr> + </tbody> + </table> + <br/><br/> +</shiro:guest> + +<form name="loginform" action="" method="post"> + <table align="left" border="0" cellspacing="0" cellpadding="3"> + <tr> + <td>Username:</td> + <td><input type="text" name="username" maxlength="30"></td> + </tr> + <tr> + <td>Password:</td> + <td><input type="password" name="password" maxlength="30"></td> + </tr> + <tr> + <td colspan="2" align="left"><input type="checkbox" name="rememberMe"><font size="2">Remember Me</font></td> + </tr> + <tr> + <td colspan="2" align="right"><input type="submit" name="submit" value="Login"></td> + </tr> + </table> +</form> + +</body> +</html> http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice3/src/main/webapp/style.css ---------------------------------------------------------------------- diff --git a/integration-tests/guice3/src/main/webapp/style.css b/integration-tests/guice3/src/main/webapp/style.css new file mode 100644 index 0000000..1308e3f --- /dev/null +++ b/integration-tests/guice3/src/main/webapp/style.css @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +body { + margin: 15px 0 0 15px; + padding: 1px; /*background: #2370cf;*/ + font: 12px 'Lucida Grande', Geneva, Verdana, Arial, sans-serif; + color: #000; +} + +table, td { + font: 12px 'Lucida Grande', Geneva, Verdana, Arial, sans-serif; + color: #000; +} + +h1 { + font: 24px; +} + +img { + border: thin black solid; +} + +#contentBox { + text-align: center; + width: 50%; + margin: auto; + margin-top: 50px; + color: black; + background: #eee; + border: thick black solid; +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice3/src/test/java/org/apache/shiro/samples/guice/AbstractContainerIT.java ---------------------------------------------------------------------- diff --git a/integration-tests/guice3/src/test/java/org/apache/shiro/samples/guice/AbstractContainerIT.java b/integration-tests/guice3/src/test/java/org/apache/shiro/samples/guice/AbstractContainerIT.java new file mode 100644 index 0000000..dcd47e1 --- /dev/null +++ b/integration-tests/guice3/src/test/java/org/apache/shiro/samples/guice/AbstractContainerIT.java @@ -0,0 +1,142 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.shiro.samples.guice; + +import com.gargoylesoftware.htmlunit.WebClient; +import com.github.mjeanroy.junit.servers.jetty.EmbeddedJetty; +import com.github.mjeanroy.junit.servers.jetty.EmbeddedJettyConfiguration; +import org.eclipse.jetty.annotations.AnnotationConfiguration; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.util.resource.FileResource; +import org.eclipse.jetty.webapp.Configuration; +import org.eclipse.jetty.webapp.FragmentConfiguration; +import org.eclipse.jetty.webapp.JettyWebXmlConfiguration; +import org.eclipse.jetty.webapp.MetaInfConfiguration; +import org.eclipse.jetty.webapp.WebAppContext; +import org.eclipse.jetty.webapp.WebInfConfiguration; +import org.eclipse.jetty.webapp.WebXmlConfiguration; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; + +import java.io.File; +import java.io.FilenameFilter; + +import static com.github.mjeanroy.junit.servers.commons.Strings.isNotBlank; +import static org.eclipse.jetty.util.resource.Resource.newResource; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public abstract class AbstractContainerIT { + + protected static EmbeddedJetty jetty; + + protected final WebClient webClient = new WebClient(); + + @BeforeClass + public static void startContainer() throws Exception { + + EmbeddedJettyConfiguration config = EmbeddedJettyConfiguration.builder() + .withWebapp(getWarDir()) + .build(); + + jetty = new EmbeddedJetty(config) { + + /** + * Overriding with contents of this pull request, to make fragment scanning work. + * https://github.com/mjeanroy/junit-servers/pull/3 + */ + protected WebAppContext createdWebAppContext() throws Exception { + final String path = configuration.getPath(); + final String webapp = configuration.getWebapp(); + final String classpath = configuration.getClasspath(); + + WebAppContext ctx = new WebAppContext(); + ctx.setClassLoader(Thread.currentThread().getContextClassLoader()); + ctx.setContextPath(path); + + // Useful for WebXmlConfiguration + ctx.setBaseResource(newResource(webapp)); + + ctx.setConfigurations(new Configuration[]{ + new WebInfConfiguration(), + new WebXmlConfiguration(), + new AnnotationConfiguration(), + new JettyWebXmlConfiguration(), + new MetaInfConfiguration(), + new FragmentConfiguration(), + }); + + if (isNotBlank(classpath)) { + // Fix to scan Spring WebApplicationInitializer + // This will add compiled classes to jetty classpath + // See: http://stackoverflow.com/questions/13222071/spring-3-1-webapplicationinitializer-embedded-jetty-8-annotationconfiguration + // And more precisely: http://stackoverflow.com/a/18449506/1215828 + File classes = new File(classpath); + FileResource containerResources = new FileResource(classes.toURI()); + ctx.getMetaData().addContainerResource(containerResources); + } + + Server server = getDelegate(); + + ctx.setParentLoaderPriority(true); + ctx.setWar(webapp); + ctx.setServer(server); + + // Add server context + server.setHandler(ctx); + + return ctx; + } + }; + + jetty.start(); + + assertTrue(jetty.isStarted()); + } + + protected static String getBaseUri() { + return "http://localhost:" + jetty.getPort() + "/"; + } + + protected static String getWarDir() { + File[] warFiles = new File("target").listFiles(new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return name.endsWith(".war"); + } + }); + + assertEquals("Expected only one war file in target directory, run 'mvn clean' and try again", 1, warFiles.length); + + return warFiles[0].getAbsolutePath().replaceFirst("\\.war$", ""); + } + + @Before + public void beforeTest() { + webClient.setThrowExceptionOnFailingStatusCode(true); + } + + @AfterClass + public static void stopContainer() { + if (jetty != null) { + jetty.stop(); + } + } +} http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice3/src/test/java/org/apache/shiro/samples/guice/ContainerIntegrationIT.java ---------------------------------------------------------------------- diff --git a/integration-tests/guice3/src/test/java/org/apache/shiro/samples/guice/ContainerIntegrationIT.java b/integration-tests/guice3/src/test/java/org/apache/shiro/samples/guice/ContainerIntegrationIT.java new file mode 100644 index 0000000..4ebc6c7 --- /dev/null +++ b/integration-tests/guice3/src/test/java/org/apache/shiro/samples/guice/ContainerIntegrationIT.java @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.shiro.samples.guice; + +import com.gargoylesoftware.htmlunit.ElementNotFoundException; +import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; +import com.gargoylesoftware.htmlunit.WebAssert; +import com.gargoylesoftware.htmlunit.html.HtmlCheckBoxInput; +import com.gargoylesoftware.htmlunit.html.HtmlForm; +import com.gargoylesoftware.htmlunit.html.HtmlInput; +import com.gargoylesoftware.htmlunit.html.HtmlPage; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.net.MalformedURLException; + +public class ContainerIntegrationIT extends AbstractContainerIT { + + @Before + public void logOut() throws IOException { + // Make sure we are logged out + final HtmlPage homePage = webClient.getPage(getBaseUri()); + try { + homePage.getAnchorByHref("/logout").click(); + } + catch (ElementNotFoundException e) { + //Ignore + } + } + + @Test + public void logIn() throws FailingHttpStatusCodeException, MalformedURLException, IOException, InterruptedException { + + HtmlPage page = webClient.getPage(getBaseUri() + "login.jsp"); + HtmlForm form = page.getFormByName("loginform"); + form.<HtmlInput>getInputByName("username").setValueAttribute("root"); + form.<HtmlInput>getInputByName("password").setValueAttribute("secret"); + page = form.<HtmlInput>getInputByName("submit").click(); + // This'll throw an expection if not logged in + page.getAnchorByHref("/logout"); + } + + @Test + public void logInAndRememberMe() throws Exception { + HtmlPage page = webClient.getPage(getBaseUri() + "login.jsp"); + HtmlForm form = page.getFormByName("loginform"); + form.<HtmlInput>getInputByName("username").setValueAttribute("root"); + form.<HtmlInput>getInputByName("password").setValueAttribute("secret"); + HtmlCheckBoxInput checkbox = form.getInputByName("rememberMe"); + checkbox.setChecked(true); + page = form.<HtmlInput>getInputByName("submit").click(); + jetty.stop(); + jetty.start(); + page = webClient.getPage(getBaseUri()); + // page.getAnchorByHref("/logout"); + WebAssert.assertLinkPresentWithText(page, "Log out"); + page = page.getAnchorByHref("/account").click(); + // login page should be shown again - user remembered but not authenticated + WebAssert.assertFormPresent(page, "loginform"); + } + +} http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice4/pom.xml ---------------------------------------------------------------------- diff --git a/integration-tests/guice4/pom.xml b/integration-tests/guice4/pom.xml new file mode 100644 index 0000000..da761ce --- /dev/null +++ b/integration-tests/guice4/pom.xml @@ -0,0 +1,131 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ with the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. + --> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.apache.shiro.integrationtests</groupId> + <artifactId>shiro-integration-tests</artifactId> + <version>1.4.0-SNAPSHOT</version> + <relativePath>../pom.xml</relativePath> + </parent> + + <artifactId>shiro-its-guice4</artifactId> + <name>Apache Shiro :: ITs :: Guice 4</name> + <packaging>war</packaging> + + <properties> + <guice.version>4.1.0</guice.version> + </properties> + + <build> + <plugins> + <plugin> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-maven-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <configuration> + <dependenciesToScan> + <dependency>org.apache.shiro:shiro-guice</dependency> + </dependenciesToScan> + </configuration> + </plugin> + </plugins> + </build> + + <dependencies> + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>jstl</artifactId> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>javax.servlet-api</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-log4j12</artifactId> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>log4j</groupId> + <artifactId>log4j</artifactId> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>org.apache.shiro</groupId> + <artifactId>shiro-core</artifactId> + </dependency> + <dependency> + <groupId>org.apache.shiro</groupId> + <artifactId>shiro-web</artifactId> + </dependency> + <dependency> + <groupId>org.apache.shiro</groupId> + <artifactId>shiro-guice</artifactId> + </dependency> + <dependency> + <groupId>com.google.inject.extensions</groupId> + <artifactId>guice-servlet</artifactId> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>jcl-over-slf4j</artifactId> + <scope>runtime</scope> + </dependency> + + <dependency> + <groupId>org.apache.shiro</groupId> + <artifactId>shiro-guice</artifactId> + <version>${project.version}</version> + <classifier>tests</classifier> + </dependency> + <dependency> + <groupId>net.sourceforge.htmlunit</groupId> + <artifactId>htmlunit</artifactId> + <version>2.6</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>apache-jsp</artifactId> + <version>${jetty.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>apache-jstl</artifactId> + <version>${jetty.version}</version> + <type>pom</type> + <scope>test</scope> + </dependency> + <dependency> + <groupId>com.github.mjeanroy</groupId> + <artifactId>junit-servers-jetty</artifactId> + <scope>test</scope> + </dependency> + </dependencies> + +</project> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice4/src/main/java/org/apache/shiro/samples/guice/SampleShiroGuiceBootstrap.java ---------------------------------------------------------------------- diff --git a/integration-tests/guice4/src/main/java/org/apache/shiro/samples/guice/SampleShiroGuiceBootstrap.java b/integration-tests/guice4/src/main/java/org/apache/shiro/samples/guice/SampleShiroGuiceBootstrap.java new file mode 100644 index 0000000..ea9926f --- /dev/null +++ b/integration-tests/guice4/src/main/java/org/apache/shiro/samples/guice/SampleShiroGuiceBootstrap.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.shiro.samples.guice; + +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.servlet.GuiceServletContextListener; +import org.apache.shiro.guice.web.ShiroWebModule; + +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; + +public class SampleShiroGuiceBootstrap extends GuiceServletContextListener { + + private ServletContext servletContext; + + @Override + public void contextInitialized(final ServletContextEvent servletContextEvent) { + this.servletContext = servletContextEvent.getServletContext(); + super.contextInitialized(servletContextEvent); + } + + @Override + protected Injector getInjector() { + return Guice.createInjector(new SampleShiroServletModule(servletContext), ShiroWebModule.guiceFilterModule()); + } +} http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice4/src/main/java/org/apache/shiro/samples/guice/SampleShiroServletModule.java ---------------------------------------------------------------------- diff --git a/integration-tests/guice4/src/main/java/org/apache/shiro/samples/guice/SampleShiroServletModule.java b/integration-tests/guice4/src/main/java/org/apache/shiro/samples/guice/SampleShiroServletModule.java new file mode 100644 index 0000000..ca6c2a3 --- /dev/null +++ b/integration-tests/guice4/src/main/java/org/apache/shiro/samples/guice/SampleShiroServletModule.java @@ -0,0 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.shiro.samples.guice; + +import com.google.inject.Provides; +import com.google.inject.binder.AnnotatedBindingBuilder; +import com.google.inject.name.Names; +import org.apache.shiro.codec.Base64; +import org.apache.shiro.config.ConfigurationException; +import org.apache.shiro.config.Ini; +import org.apache.shiro.guice.web.ShiroWebModule; +import org.apache.shiro.realm.text.IniRealm; +import org.apache.shiro.web.mgt.CookieRememberMeManager; +import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.apache.shiro.web.mgt.WebSecurityManager; + +import javax.inject.Singleton; +import javax.servlet.ServletContext; +import java.net.MalformedURLException; +import java.net.URL; + +public class SampleShiroServletModule extends ShiroWebModule { + private final ServletContext servletContext; + + public SampleShiroServletModule(ServletContext servletContext) { + super(servletContext); + + this.servletContext = servletContext; + } + + @Override + protected void configureShiroWeb() { + bindConstant().annotatedWith(Names.named("shiro.loginUrl")).to("/login.jsp"); + try { + this.bindRealm().toConstructor(IniRealm.class.getConstructor(Ini.class)); + } catch (NoSuchMethodException e) { + addError("Could not locate proper constructor for IniRealm.", e); + } + + this.addFilterChain("/login.jsp", AUTHC); + this.addFilterChain("/logout", LOGOUT); + this.addFilterChain("/account/**", AUTHC); + + this.addFilterChain("/remoting/**", filterConfig(AUTHC), filterConfig(ROLES, "b2bClient"), filterConfig(PERMS, "remote:invoke:lan,wan")); + } + + @Provides + @Singleton + Ini loadShiroIni() throws MalformedURLException { + URL iniUrl = servletContext.getResource("/WEB-INF/shiro.ini"); + return Ini.fromResourcePath("url:" + iniUrl.toExternalForm()); + } + + @Override + protected void bindWebSecurityManager(AnnotatedBindingBuilder<? super WebSecurityManager> bind) + { + try + { + String cipherKey = loadShiroIni().getSectionProperty( "main", "securityManager.rememberMeManager.cipherKey" ); + + DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); + CookieRememberMeManager rememberMeManager = new CookieRememberMeManager(); + rememberMeManager.setCipherKey( Base64.decode( cipherKey ) ); + securityManager.setRememberMeManager(rememberMeManager); + bind.toInstance(securityManager); + } + catch ( MalformedURLException e ) + { + // for now just throw, you could just call + // super.bindWebSecurityManager(bind) if you do not need rememberMe functionality + throw new ConfigurationException( "securityManager.rememberMeManager.cipherKey must be set in shiro.ini." ); + } + + + } +} http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice4/src/main/resources/log4j.properties ---------------------------------------------------------------------- diff --git a/integration-tests/guice4/src/main/resources/log4j.properties b/integration-tests/guice4/src/main/resources/log4j.properties new file mode 100644 index 0000000..b10506b --- /dev/null +++ b/integration-tests/guice4/src/main/resources/log4j.properties @@ -0,0 +1,47 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +log4j.rootLogger=TRACE, stdout + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d %-5p [%c]: %m%n + +# ============================================================================= +# 3rd Party Libraries +# OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL +# ============================================================================= +# ehcache caching manager: +log4j.logger.net.sf.ehcache=WARN + +# Most all Apache libs: +log4j.logger.org.apache=WARN + +# Quartz Enterprise Scheular (java 'cron' utility) +log4j.logger.org.quartz=WARN + +# ============================================================================= +# Apache Shiro +# ============================================================================= +# Shiro security framework +log4j.logger.org.apache.shiro=TRACE +#log4j.logger.org.apache.shiro.realm.text.PropertiesRealm=INFO +#log4j.logger.org.apache.shiro.cache.ehcache.EhCache=INFO +#log4j.logger.org.apache.shiro.io=INFO +#log4j.logger.org.apache.shiro.web.servlet=INFO +log4j.logger.org.apache.shiro.util.ThreadContext=INFO http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice4/src/main/webapp/WEB-INF/shiro.ini ---------------------------------------------------------------------- diff --git a/integration-tests/guice4/src/main/webapp/WEB-INF/shiro.ini b/integration-tests/guice4/src/main/webapp/WEB-INF/shiro.ini new file mode 100644 index 0000000..db453e7 --- /dev/null +++ b/integration-tests/guice4/src/main/webapp/WEB-INF/shiro.ini @@ -0,0 +1,53 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# INI configuration is very powerful and flexible, while still remaining succinct. +# Please http://shiro.apache.org/configuration.html and +# http://shiro.apache.org/web.html for more. + +[main] +shiro.loginUrl = /login.jsp + +# We need to set the cipherKey, if you want the rememberMe cookie to work after restarting or on multiple nodes. +# YOU MUST SET THIS TO A UNIQUE STRING +securityManager.rememberMeManager.cipherKey = kPH+bIxk5D2deZiIxcaaaA== + +[users] +# format: username = password, role1, role2, ..., roleN +root = secret,admin +guest = guest,guest +presidentskroob = 12345,president +darkhelmet = ludicrousspeed,darklord,schwartz +lonestarr = vespa,goodguy,schwartz + +[roles] +# format: roleName = permission1, permission2, ..., permissionN +admin = * +schwartz = lightsaber:* +goodguy = winnebago:drive:eagle5 + +[urls] +# The /login.jsp is not restricted to authenticated users (otherwise no one could log in!), but +# the 'authc' filter must still be specified for it so it can process that url's +# login submissions. It is 'smart' enough to allow those requests through as specified by the +# shiro.loginUrl above. +/login.jsp = authc +/logout = logout +/account/** = authc +/remoting/** = authc, roles[b2bClient], perms["remote:invoke:lan,wan"] \ No newline at end of file http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice4/src/main/webapp/WEB-INF/web.xml ---------------------------------------------------------------------- diff --git a/integration-tests/guice4/src/main/webapp/WEB-INF/web.xml b/integration-tests/guice4/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..46567d4 --- /dev/null +++ b/integration-tests/guice4/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ with the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. + --> +<web-app version="2.4" + xmlns="http://java.sun.com/xml/ns/j2ee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> + + <listener> + <listener-class>org.apache.shiro.samples.guice.SampleShiroGuiceBootstrap</listener-class> + </listener> + + <filter> + <filter-name>GuiceFilter</filter-name> + <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> + </filter> + + <filter-mapping> + <filter-name>GuiceFilter</filter-name> + <url-pattern>/*</url-pattern> + </filter-mapping> + + <welcome-file-list> + <welcome-file>index.jsp</welcome-file> + </welcome-file-list> + +</web-app> http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice4/src/main/webapp/account/index.jsp ---------------------------------------------------------------------- diff --git a/integration-tests/guice4/src/main/webapp/account/index.jsp b/integration-tests/guice4/src/main/webapp/account/index.jsp new file mode 100644 index 0000000..4f6c9d8 --- /dev/null +++ b/integration-tests/guice4/src/main/webapp/account/index.jsp @@ -0,0 +1,36 @@ +<%-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ with the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. + --%> +<%@ include file="../include.jsp" %> + +<html> +<head> + <link type="text/css" rel="stylesheet" href="<c:url value="/style.css"/>"/> +</head> +<body> + +<h2>Users only</h2> + +<p>You are currently logged in.</p> + +<p><a href="<c:url value="/home.jsp"/>">Return to the home page.</a></p> + +<p><a href="<c:url value="/logout"/>">Log out.</a></p> + +</body> +</html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice4/src/main/webapp/home.jsp ---------------------------------------------------------------------- diff --git a/integration-tests/guice4/src/main/webapp/home.jsp b/integration-tests/guice4/src/main/webapp/home.jsp new file mode 100644 index 0000000..61dee25 --- /dev/null +++ b/integration-tests/guice4/src/main/webapp/home.jsp @@ -0,0 +1,69 @@ +<%-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ with the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. + --%> +<%@ include file="include.jsp" %> + +<html> +<head> + <link type="text/css" rel="stylesheet" href="<c:url value="/style.css"/>"/> + <title>Apache Shiro Quickstart</title> +</head> +<body> + +<h1>Apache Shiro Quickstart</h1> + +<p>Hi <shiro:guest>Guest</shiro:guest><shiro:user><shiro:principal/></shiro:user>! + ( <shiro:user><a href="<c:url value="/logout"/>">Log out</a></shiro:user> + <shiro:guest><a href="<c:url value="/login.jsp"/>">Log in</a> (sample accounts provided)</shiro:guest> ) +</p> + +<p>Welcome to the Apache Shiro Quickstart sample application. + This page represents the home page of any web application.</p> + +<shiro:user><p>Visit your <a href="<c:url value="/account"/>">account page</a>.</p></shiro:user> +<shiro:guest><p>If you want to access the user-only <a href="<c:url value="/account"/>">account page</a>, + you will need to log-in first.</p></shiro:guest> + +<h2>Roles</h2> + +<p>To show some taglibs, here are the roles you have and don't have. Log out and log back in under different user + accounts to see different roles.</p> + +<h3>Roles you have</h3> + +<p> + <shiro:hasRole name="admin">admin<br/></shiro:hasRole> + <shiro:hasRole name="president">president<br/></shiro:hasRole> + <shiro:hasRole name="darklord">darklord<br/></shiro:hasRole> + <shiro:hasRole name="goodguy">goodguy<br/></shiro:hasRole> + <shiro:hasRole name="schwartz">schwartz<br/></shiro:hasRole> +</p> + +<h3>Roles you DON'T have</h3> + +<p> + <shiro:lacksRole name="admin">admin<br/></shiro:lacksRole> + <shiro:lacksRole name="president">president<br/></shiro:lacksRole> + <shiro:lacksRole name="darklord">darklord<br/></shiro:lacksRole> + <shiro:lacksRole name="goodguy">goodguy<br/></shiro:lacksRole> + <shiro:lacksRole name="schwartz">schwartz<br/></shiro:lacksRole> +</p> + + +</body> +</html> http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice4/src/main/webapp/include.jsp ---------------------------------------------------------------------- diff --git a/integration-tests/guice4/src/main/webapp/include.jsp b/integration-tests/guice4/src/main/webapp/include.jsp new file mode 100644 index 0000000..fddd239 --- /dev/null +++ b/integration-tests/guice4/src/main/webapp/include.jsp @@ -0,0 +1,22 @@ +<%-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ with the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. + --%> +<%@ page import="org.apache.shiro.SecurityUtils" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice4/src/main/webapp/index.jsp ---------------------------------------------------------------------- diff --git a/integration-tests/guice4/src/main/webapp/index.jsp b/integration-tests/guice4/src/main/webapp/index.jsp new file mode 100644 index 0000000..9dedd19 --- /dev/null +++ b/integration-tests/guice4/src/main/webapp/index.jsp @@ -0,0 +1,21 @@ +<%-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ with the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. + --%> + +<%-- Forward the user to the home page --%> +<jsp:forward page="home.jsp"/> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice4/src/main/webapp/login.jsp ---------------------------------------------------------------------- diff --git a/integration-tests/guice4/src/main/webapp/login.jsp b/integration-tests/guice4/src/main/webapp/login.jsp new file mode 100644 index 0000000..c80ee54 --- /dev/null +++ b/integration-tests/guice4/src/main/webapp/login.jsp @@ -0,0 +1,110 @@ +<%-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ with the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. + --%> +<%@ include file="include.jsp" %> + +<html> +<head> + <link type="text/css" rel="stylesheet" href="<c:url value="/style.css"/>"/> +</head> +<body> + +<h2>Please Log in</h2> + +<shiro:guest> + <p>Here are a few sample accounts to play with in the default text-based Realm (used for this + demo and test installs only). Do you remember the movie these names came from? ;)</p> + + + <style type="text/css"> + table.sample { + border-width: 1px; + border-style: outset; + border-color: blue; + border-collapse: separate; + background-color: rgb(255, 255, 240); + } + + table.sample th { + border-width: 1px; + padding: 1px; + border-style: none; + border-color: blue; + background-color: rgb(255, 255, 240); + } + + table.sample td { + border-width: 1px; + padding: 1px; + border-style: none; + border-color: blue; + background-color: rgb(255, 255, 240); + } + </style> + + + <table class="sample"> + <thead> + <tr> + <th>Username</th> + <th>Password</th> + </tr> + </thead> + <tbody> + <tr> + <td>root</td> + <td>secret</td> + </tr> + <tr> + <td>presidentskroob</td> + <td>12345</td> + </tr> + <tr> + <td>darkhelmet</td> + <td>ludicrousspeed</td> + </tr> + <tr> + <td>lonestarr</td> + <td>vespa</td> + </tr> + </tbody> + </table> + <br/><br/> +</shiro:guest> + +<form name="loginform" action="" method="post"> + <table align="left" border="0" cellspacing="0" cellpadding="3"> + <tr> + <td>Username:</td> + <td><input type="text" name="username" maxlength="30"></td> + </tr> + <tr> + <td>Password:</td> + <td><input type="password" name="password" maxlength="30"></td> + </tr> + <tr> + <td colspan="2" align="left"><input type="checkbox" name="rememberMe"><font size="2">Remember Me</font></td> + </tr> + <tr> + <td colspan="2" align="right"><input type="submit" name="submit" value="Login"></td> + </tr> + </table> +</form> + +</body> +</html> http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice4/src/main/webapp/style.css ---------------------------------------------------------------------- diff --git a/integration-tests/guice4/src/main/webapp/style.css b/integration-tests/guice4/src/main/webapp/style.css new file mode 100644 index 0000000..1308e3f --- /dev/null +++ b/integration-tests/guice4/src/main/webapp/style.css @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +body { + margin: 15px 0 0 15px; + padding: 1px; /*background: #2370cf;*/ + font: 12px 'Lucida Grande', Geneva, Verdana, Arial, sans-serif; + color: #000; +} + +table, td { + font: 12px 'Lucida Grande', Geneva, Verdana, Arial, sans-serif; + color: #000; +} + +h1 { + font: 24px; +} + +img { + border: thin black solid; +} + +#contentBox { + text-align: center; + width: 50%; + margin: auto; + margin-top: 50px; + color: black; + background: #eee; + border: thick black solid; +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice4/src/test/java/org/apache/shiro/samples/guice/AbstractContainerIT.java ---------------------------------------------------------------------- diff --git a/integration-tests/guice4/src/test/java/org/apache/shiro/samples/guice/AbstractContainerIT.java b/integration-tests/guice4/src/test/java/org/apache/shiro/samples/guice/AbstractContainerIT.java new file mode 100644 index 0000000..dcd47e1 --- /dev/null +++ b/integration-tests/guice4/src/test/java/org/apache/shiro/samples/guice/AbstractContainerIT.java @@ -0,0 +1,142 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.shiro.samples.guice; + +import com.gargoylesoftware.htmlunit.WebClient; +import com.github.mjeanroy.junit.servers.jetty.EmbeddedJetty; +import com.github.mjeanroy.junit.servers.jetty.EmbeddedJettyConfiguration; +import org.eclipse.jetty.annotations.AnnotationConfiguration; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.util.resource.FileResource; +import org.eclipse.jetty.webapp.Configuration; +import org.eclipse.jetty.webapp.FragmentConfiguration; +import org.eclipse.jetty.webapp.JettyWebXmlConfiguration; +import org.eclipse.jetty.webapp.MetaInfConfiguration; +import org.eclipse.jetty.webapp.WebAppContext; +import org.eclipse.jetty.webapp.WebInfConfiguration; +import org.eclipse.jetty.webapp.WebXmlConfiguration; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; + +import java.io.File; +import java.io.FilenameFilter; + +import static com.github.mjeanroy.junit.servers.commons.Strings.isNotBlank; +import static org.eclipse.jetty.util.resource.Resource.newResource; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public abstract class AbstractContainerIT { + + protected static EmbeddedJetty jetty; + + protected final WebClient webClient = new WebClient(); + + @BeforeClass + public static void startContainer() throws Exception { + + EmbeddedJettyConfiguration config = EmbeddedJettyConfiguration.builder() + .withWebapp(getWarDir()) + .build(); + + jetty = new EmbeddedJetty(config) { + + /** + * Overriding with contents of this pull request, to make fragment scanning work. + * https://github.com/mjeanroy/junit-servers/pull/3 + */ + protected WebAppContext createdWebAppContext() throws Exception { + final String path = configuration.getPath(); + final String webapp = configuration.getWebapp(); + final String classpath = configuration.getClasspath(); + + WebAppContext ctx = new WebAppContext(); + ctx.setClassLoader(Thread.currentThread().getContextClassLoader()); + ctx.setContextPath(path); + + // Useful for WebXmlConfiguration + ctx.setBaseResource(newResource(webapp)); + + ctx.setConfigurations(new Configuration[]{ + new WebInfConfiguration(), + new WebXmlConfiguration(), + new AnnotationConfiguration(), + new JettyWebXmlConfiguration(), + new MetaInfConfiguration(), + new FragmentConfiguration(), + }); + + if (isNotBlank(classpath)) { + // Fix to scan Spring WebApplicationInitializer + // This will add compiled classes to jetty classpath + // See: http://stackoverflow.com/questions/13222071/spring-3-1-webapplicationinitializer-embedded-jetty-8-annotationconfiguration + // And more precisely: http://stackoverflow.com/a/18449506/1215828 + File classes = new File(classpath); + FileResource containerResources = new FileResource(classes.toURI()); + ctx.getMetaData().addContainerResource(containerResources); + } + + Server server = getDelegate(); + + ctx.setParentLoaderPriority(true); + ctx.setWar(webapp); + ctx.setServer(server); + + // Add server context + server.setHandler(ctx); + + return ctx; + } + }; + + jetty.start(); + + assertTrue(jetty.isStarted()); + } + + protected static String getBaseUri() { + return "http://localhost:" + jetty.getPort() + "/"; + } + + protected static String getWarDir() { + File[] warFiles = new File("target").listFiles(new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return name.endsWith(".war"); + } + }); + + assertEquals("Expected only one war file in target directory, run 'mvn clean' and try again", 1, warFiles.length); + + return warFiles[0].getAbsolutePath().replaceFirst("\\.war$", ""); + } + + @Before + public void beforeTest() { + webClient.setThrowExceptionOnFailingStatusCode(true); + } + + @AfterClass + public static void stopContainer() { + if (jetty != null) { + jetty.stop(); + } + } +} http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/guice4/src/test/java/org/apache/shiro/samples/guice/ContainerIntegrationIT.java ---------------------------------------------------------------------- diff --git a/integration-tests/guice4/src/test/java/org/apache/shiro/samples/guice/ContainerIntegrationIT.java b/integration-tests/guice4/src/test/java/org/apache/shiro/samples/guice/ContainerIntegrationIT.java new file mode 100644 index 0000000..4ebc6c7 --- /dev/null +++ b/integration-tests/guice4/src/test/java/org/apache/shiro/samples/guice/ContainerIntegrationIT.java @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.shiro.samples.guice; + +import com.gargoylesoftware.htmlunit.ElementNotFoundException; +import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; +import com.gargoylesoftware.htmlunit.WebAssert; +import com.gargoylesoftware.htmlunit.html.HtmlCheckBoxInput; +import com.gargoylesoftware.htmlunit.html.HtmlForm; +import com.gargoylesoftware.htmlunit.html.HtmlInput; +import com.gargoylesoftware.htmlunit.html.HtmlPage; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.net.MalformedURLException; + +public class ContainerIntegrationIT extends AbstractContainerIT { + + @Before + public void logOut() throws IOException { + // Make sure we are logged out + final HtmlPage homePage = webClient.getPage(getBaseUri()); + try { + homePage.getAnchorByHref("/logout").click(); + } + catch (ElementNotFoundException e) { + //Ignore + } + } + + @Test + public void logIn() throws FailingHttpStatusCodeException, MalformedURLException, IOException, InterruptedException { + + HtmlPage page = webClient.getPage(getBaseUri() + "login.jsp"); + HtmlForm form = page.getFormByName("loginform"); + form.<HtmlInput>getInputByName("username").setValueAttribute("root"); + form.<HtmlInput>getInputByName("password").setValueAttribute("secret"); + page = form.<HtmlInput>getInputByName("submit").click(); + // This'll throw an expection if not logged in + page.getAnchorByHref("/logout"); + } + + @Test + public void logInAndRememberMe() throws Exception { + HtmlPage page = webClient.getPage(getBaseUri() + "login.jsp"); + HtmlForm form = page.getFormByName("loginform"); + form.<HtmlInput>getInputByName("username").setValueAttribute("root"); + form.<HtmlInput>getInputByName("password").setValueAttribute("secret"); + HtmlCheckBoxInput checkbox = form.getInputByName("rememberMe"); + checkbox.setChecked(true); + page = form.<HtmlInput>getInputByName("submit").click(); + jetty.stop(); + jetty.start(); + page = webClient.getPage(getBaseUri()); + // page.getAnchorByHref("/logout"); + WebAssert.assertLinkPresentWithText(page, "Log out"); + page = page.getAnchorByHref("/account").click(); + // login page should be shown again - user remembered but not authenticated + WebAssert.assertFormPresent(page, "loginform"); + } + +} http://git-wip-us.apache.org/repos/asf/shiro/blob/f2dfa7ff/integration-tests/pom.xml ---------------------------------------------------------------------- diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml new file mode 100644 index 0000000..1b8dd19 --- /dev/null +++ b/integration-tests/pom.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ with the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. + --> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.apache.shiro</groupId> + <artifactId>shiro-root</artifactId> + <version>1.4.0-SNAPSHOT</version> + </parent> + + <groupId>org.apache.shiro.integrationtests</groupId> + <artifactId>shiro-integration-tests</artifactId> + + <name>Apache Shiro :: Integration Tests</name> + <description>Test for alternate major versions of dependencies</description> + <packaging>pom</packaging> + + <modules> + <module>guice3</module> + <module>guice4</module> + </modules> + + <reporting> + <plugins> + <plugin> + <artifactId>maven-javadoc-plugin</artifactId> + <configuration> + <skip>true</skip> + </configuration> + </plugin> + </plugins> + </reporting> +</project> +