From 876600a345cd34f4a52634ebc8b1fe0769585eb3 Mon Sep 17 00:00:00 2001 From: tkofford Date: Thu, 6 Jul 2017 07:59:44 -0500 Subject: [PATCH 1/6] Initial commit --- shiro-basic/pom.xml | 79 ++++++++++++ .../struts2shiro/action/LoginAction.java | 113 ++++++++++++++++++ .../struts2shiro/action/LogoutAction.java | 18 +++ .../struts2shiro/action/ShiroBaseAction.java | 34 ++++++ .../struts2shiro/action/WelcomeAction.java | 101 ++++++++++++++++ .../interceptor/ShiroUserInterceptor.java | 64 ++++++++++ shiro-basic/src/main/resources/log4j2.xml | 25 ++++ shiro-basic/src/main/resources/shiro.ini | 25 ++++ shiro-basic/src/main/resources/struts.xml | 37 ++++++ shiro-basic/src/main/webapp/WEB-INF/web.xml | 27 +++++ shiro-basic/src/main/webapp/css/main.css | 56 +++++++++ shiro-basic/src/main/webapp/index.jsp | 1 + shiro-basic/src/main/webapp/pages/login.jsp | 27 +++++ shiro-basic/src/main/webapp/pages/welcome.jsp | 39 ++++++ 14 files changed, 646 insertions(+) create mode 100644 shiro-basic/pom.xml create mode 100644 shiro-basic/src/main/java/example/struts2shiro/action/LoginAction.java create mode 100644 shiro-basic/src/main/java/example/struts2shiro/action/LogoutAction.java create mode 100644 shiro-basic/src/main/java/example/struts2shiro/action/ShiroBaseAction.java create mode 100644 shiro-basic/src/main/java/example/struts2shiro/action/WelcomeAction.java create mode 100644 shiro-basic/src/main/java/example/struts2shiro/interceptor/ShiroUserInterceptor.java create mode 100644 shiro-basic/src/main/resources/log4j2.xml create mode 100644 shiro-basic/src/main/resources/shiro.ini create mode 100644 shiro-basic/src/main/resources/struts.xml create mode 100644 shiro-basic/src/main/webapp/WEB-INF/web.xml create mode 100644 shiro-basic/src/main/webapp/css/main.css create mode 100644 shiro-basic/src/main/webapp/index.jsp create mode 100644 shiro-basic/src/main/webapp/pages/login.jsp create mode 100644 shiro-basic/src/main/webapp/pages/welcome.jsp diff --git a/shiro-basic/pom.xml b/shiro-basic/pom.xml new file mode 100644 index 00000000..3dfe907f --- /dev/null +++ b/shiro-basic/pom.xml @@ -0,0 +1,79 @@ + + 4.0.0 + struts2shiro + struts2shiro + 1.0.0 + war + + + UTF-8 + 1.3.2 + 2.5.10.1 + + + + + org.apache.struts + struts2-core + ${struts.version} + + + + org.apache.shiro + shiro-core + ${shiro.version} + + + org.apache.shiro + shiro-web + ${shiro.version} + + + + org.apache.logging.log4j + log4j-api + 2.8.2 + + + org.apache.logging.log4j + log4j-core + 2.8.2 + + + + javax.servlet + servlet-api + 2.4 + provided + + + javax.servlet.jsp + jsp-api + 2.1 + provided + + + + + + + + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + + + + maven-war-plugin + 2.4 + + false + + + + ${project.artifactId} + + \ No newline at end of file diff --git a/shiro-basic/src/main/java/example/struts2shiro/action/LoginAction.java b/shiro-basic/src/main/java/example/struts2shiro/action/LoginAction.java new file mode 100644 index 00000000..fbfceb3f --- /dev/null +++ b/shiro-basic/src/main/java/example/struts2shiro/action/LoginAction.java @@ -0,0 +1,113 @@ +package example.struts2shiro.action; + +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.IncorrectCredentialsException; +import org.apache.shiro.authc.LockedAccountException; +import org.apache.shiro.authc.UnknownAccountException; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.session.Session; +import org.apache.shiro.subject.Subject; +import com.opensymphony.xwork2.ActionSupport; +import com.opensymphony.xwork2.Preparable; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class LoginAction extends ActionSupport implements Preparable +{ + + private static final long serialVersionUID = 1L; + private static final transient Logger log = LogManager.getLogger(LoginAction.class); + + private String username; + private String password; + private Subject shiroUser; + + @Override + public void prepare() throws Exception + { + shiroUser = SecurityUtils.getSubject(); + } + + @Override + public String execute() + { + String result = INPUT; + + // Do some stuff with a Session + Session session = shiroUser.getSession(); + session.setAttribute("MyUsername", username); + log.info("Saving 'username' value to session [" + username + "]"); + + // let's login the current user so we can check against roles and permissions: + if (shiroUser != null && ! shiroUser.isAuthenticated()) + { + UsernamePasswordToken token = new UsernamePasswordToken(username, password); + token.setRememberMe(true); + try + { + shiroUser.login(token); + result = SUCCESS; + } + catch (UnknownAccountException uae) + { + addActionError("There is no user with username of '" + token.getPrincipal() + "'"); + log.error(uae.getMessage()); + } + catch (IncorrectCredentialsException ice) + { + addActionError("Password for account '" + token.getPrincipal() + "' was incorrect!"); + log.error(ice.getMessage()); + } + catch (LockedAccountException lae) + { + addActionError("The account for username '" + token.getPrincipal() + "' is locked. " + + "Please contact your administrator to unlock it."); + log.error(lae.getMessage()); + } + // ... catch more exceptions here (maybe custom ones specific to your application? + catch (AuthenticationException ae) + { + addActionError("An authentication exception has occurred trying to login user: " + token.getPrincipal()); + log.error(ae.getMessage()); + } + } + else if (shiroUser.isAuthenticated()) + { + result = SUCCESS; + } + + return result; + } + + public Subject getShiroUser() + { + return shiroUser; + } + + public void setShiroUser(Subject shiroUser) + { + this.shiroUser = shiroUser; + } + + public String getUsername() + { + return username; + } + + public void setUsername(String username) + { + this.username = username; + } + + public String getPassword() + { + return password; + } + + public void setPassword(String password) + { + this.password = password; + } + +} diff --git a/shiro-basic/src/main/java/example/struts2shiro/action/LogoutAction.java b/shiro-basic/src/main/java/example/struts2shiro/action/LogoutAction.java new file mode 100644 index 00000000..731447b5 --- /dev/null +++ b/shiro-basic/src/main/java/example/struts2shiro/action/LogoutAction.java @@ -0,0 +1,18 @@ +package example.struts2shiro.action; + +public class LogoutAction extends ShiroBaseAction +{ + private static final long serialVersionUID = 1L; + + @Override + public String execute() + { + if (isAuthenticated()) + { + getShiroUser().logout(); // isAuthenticated = true -> getShiroUser() != null + } + + return SUCCESS; + } + +} diff --git a/shiro-basic/src/main/java/example/struts2shiro/action/ShiroBaseAction.java b/shiro-basic/src/main/java/example/struts2shiro/action/ShiroBaseAction.java new file mode 100644 index 00000000..49c60ca9 --- /dev/null +++ b/shiro-basic/src/main/java/example/struts2shiro/action/ShiroBaseAction.java @@ -0,0 +1,34 @@ +/** + * + */ +package example.struts2shiro.action; + +import org.apache.shiro.subject.Subject; + +import com.opensymphony.xwork2.ActionSupport; + +/** + * @author tkofford + * + */ +public class ShiroBaseAction extends ActionSupport +{ + private static final long serialVersionUID = 1L; + + private Subject shiroUser; + + public boolean isAuthenticated() + { + return shiroUser != null && shiroUser.isAuthenticated(); + } + + public Subject getShiroUser() + { + return shiroUser; + } + + public void setShiroUser(Subject shiroUser) + { + this.shiroUser = shiroUser; + } +} diff --git a/shiro-basic/src/main/java/example/struts2shiro/action/WelcomeAction.java b/shiro-basic/src/main/java/example/struts2shiro/action/WelcomeAction.java new file mode 100644 index 00000000..2906c4b6 --- /dev/null +++ b/shiro-basic/src/main/java/example/struts2shiro/action/WelcomeAction.java @@ -0,0 +1,101 @@ +package example.struts2shiro.action; + +import org.apache.shiro.session.Session; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class WelcomeAction extends ShiroBaseAction +{ + private static final long serialVersionUID = 1L; + private static final Logger log = LogManager.getLogger(WelcomeAction.class); + + private String username; + + @Override + public String execute() + { + String result = ERROR; + + if (isAuthenticated()) + { + // Retrieve value from session + Session session = getShiroUser().getSession(); + String value = (String) session.getAttribute("MyUsername"); + if (value.equals(username)) { + log.info("Retrieved the correct 'username' value [" + value + "] from session"); + } + + printRoles(); + printPermissions(); + result = SUCCESS; + } + + return result; + } + + public void printRoles() + { + if (getShiroUser().hasRole("admin")) + { + log.info("User '" + username + "' has role of 'admin'"); + } + else + { + log.info("User '" + username + "' is missing role 'admin'"); + } + if (getShiroUser().hasRole("schwartz")) + { + log.info("User '" + username + "' has role of 'schwartz'"); + } + else + { + log.info("User '" + username + "' is missing role 'schwartz'"); + } + if (getShiroUser().hasRole("goodguy")) + { + log.info("User '" + username + "' has role of 'goodguy'"); + } + else + { + log.info("User '" + username + "' is missing role 'goodguy'"); + } + } + + public void printPermissions() + { + if (getShiroUser().isPermitted("lightsaber")) + { + log.info("User '" + username + "' has 'lightsaber' permission"); + } + else + { + log.info("User '" + username + "' is missing permission 'lightsaber'"); + } + if (getShiroUser().isPermitted("winnebago")) + { + log.info("User '" + username + "' has 'winnebago' permission"); + } + else + { + log.info("User '" + username + "' is missing permission 'winnebago'"); + } + if (getShiroUser().isPermitted("winnebago:drive:eagle5")) + { + log.info("User '" + username + "' has 'winnebago:drive:eagle5' permission"); + } + else + { + log.info("User '" + username + "' is missing permission 'winnebago:drive:eagle5'"); + } + } + public String getUsername() + { + return username; + } + + public void setUsername(String username) + { + this.username = username; + } + +} diff --git a/shiro-basic/src/main/java/example/struts2shiro/interceptor/ShiroUserInterceptor.java b/shiro-basic/src/main/java/example/struts2shiro/interceptor/ShiroUserInterceptor.java new file mode 100644 index 00000000..cbfe19b0 --- /dev/null +++ b/shiro-basic/src/main/java/example/struts2shiro/interceptor/ShiroUserInterceptor.java @@ -0,0 +1,64 @@ +/** + * + */ +package example.struts2shiro.interceptor; + +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.subject.Subject; + +import com.opensymphony.xwork2.ActionInvocation; +import com.opensymphony.xwork2.interceptor.Interceptor; + +/** + * @author tkofford + * + */ + +/** + * Inserts the current Shiro user into the value stack so that it can be + * injected into Struts 2 actions should they have a JavaBeans setter + * setShiroUser(org.apache.shiro.subject.Subject shiroUser). + * + * @version $Revision: $ $Date: $ + */ +public class ShiroUserInterceptor implements Interceptor { + + /** + * + */ + private static final long serialVersionUID = 1L; + + /* (non-Javadoc) + * @see com.opensymphony.xwork2.interceptor.Interceptor#destroy() + */ + @Override + public void destroy() + { + //release resources here + } + + /* (non-Javadoc) + * @see com.opensymphony.xwork2.interceptor.Interceptor#init() + */ + @Override + public void init() + { + // create resources here + } + + /* (non-Javadoc) + * @see com.opensymphony.xwork2.interceptor.Interceptor#intercept(com.opensymphony.xwork2.ActionInvocation) + */ + @Override + public String intercept(ActionInvocation actionInvocation) throws Exception + { + if (actionInvocation.getAction() instanceof example.struts2shiro.action.ShiroBaseAction) + { + Subject shiroUser = SecurityUtils.getSubject(); + actionInvocation.getStack().setValue("shiroUser", shiroUser); + } + + return actionInvocation.invoke(); + } + +} diff --git a/shiro-basic/src/main/resources/log4j2.xml b/shiro-basic/src/main/resources/log4j2.xml new file mode 100644 index 00000000..26eb0c2d --- /dev/null +++ b/shiro-basic/src/main/resources/log4j2.xml @@ -0,0 +1,25 @@ + + + + ${sys:catalina.home}/logs/struts2shiro.log + + + + + + + + + + + + + + + + + + + + + diff --git a/shiro-basic/src/main/resources/shiro.ini b/shiro-basic/src/main/resources/shiro.ini new file mode 100644 index 00000000..436c4658 --- /dev/null +++ b/shiro-basic/src/main/resources/shiro.ini @@ -0,0 +1,25 @@ +# ============================================================================= +# Tutorial INI configuration +# +# Usernames/passwords are based on the classic Mel Brooks' film "Spaceballs" :) +# ============================================================================= + +# ----------------------------------------------------------------------------- +# Users and their (optional) assigned roles +# username = password, role1, role2, ..., roleN +# ----------------------------------------------------------------------------- +[users] +root = secret, admin +guest = guest, guest +presidentskroob = 12345, president +darkhelmet = ludicrousspeed, darklord, schwartz +lonestarr = vespa, goodguy, schwartz + +# ----------------------------------------------------------------------------- +# Roles with assigned permissions +# roleName = perm1, perm2, ..., permN +# ----------------------------------------------------------------------------- +[roles] +admin = * +schwartz = lightsaber:* +goodguy = winnebago:drive:eagle5 \ No newline at end of file diff --git a/shiro-basic/src/main/resources/struts.xml b/shiro-basic/src/main/resources/struts.xml new file mode 100644 index 00000000..c22a7e6f --- /dev/null +++ b/shiro-basic/src/main/resources/struts.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + pages/login.jsp + + + pages/welcome.jsp + + + + welcome + ${username} + + pages/login.jsp + + + pages/login.jsp + + + + + \ No newline at end of file diff --git a/shiro-basic/src/main/webapp/WEB-INF/web.xml b/shiro-basic/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000..c62e0003 --- /dev/null +++ b/shiro-basic/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,27 @@ + + + struts2shiro + + org.apache.shiro.web.env.EnvironmentLoaderListener + + + shiroFilter + org.apache.shiro.web.servlet.ShiroFilter + + + shiroFilter + /* + REQUEST + FORWARD + INCLUDE + ERROR + + + struts2 + org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter + + + struts2 + /* + + \ No newline at end of file diff --git a/shiro-basic/src/main/webapp/css/main.css b/shiro-basic/src/main/webapp/css/main.css new file mode 100644 index 00000000..27b210b3 --- /dev/null +++ b/shiro-basic/src/main/webapp/css/main.css @@ -0,0 +1,56 @@ +html, body { + margin-left: 10px; + margin-right: 10px; + margin-bottom: 5px; + color: black; + background-color: white; + font-family: Verdana, Arial, sans-serif; + font-size:12px; +} +.titleDiv { + background-color: #EFFBEF; + font-weight:bold; + font-size:18px; + text-align:left; + padding-left:10px; + padding-top:10px; + padding-bottom:10px; + border:2px solid #8F99EF; +} +h1 { font-weight:bold; color: brown; font-size:15px; text-align:left;} + +td { font-size:12px; padding-right:10px; } +th { text-align:left; font-weight:bold; font-size:13px; padding-right:10px; } +.tdLabel { font-weight: bold; white-space:nowrap; vertical-align:top;} + +A { color:#4A825A; text-decoration:none;} +A:link { text-decoration:none;} +A:visited { text-decoration:none;} +A:hover { text-decoration:none; color: red;} + +.borderAll { + border: 2px solid #8F99EF; +} + +.butStnd { + font-family:arial,sans-serif; + font-size:11px; + width:105px; + background-color:#DCDFFA ;color:#4A825A;font-weight:bold; +} + +.error { + color: red; + font-weight: bold; +} +.errorSection { + padding-left:18px; + padding-top:2px; + padding-bottom:10px; + padding-right:5px; +} + +.even { background-color: #EFFBEF; } +.odd { background-color: white; } + +.nowrap { white-space:nowrap; } diff --git a/shiro-basic/src/main/webapp/index.jsp b/shiro-basic/src/main/webapp/index.jsp new file mode 100644 index 00000000..ca4c39df --- /dev/null +++ b/shiro-basic/src/main/webapp/index.jsp @@ -0,0 +1 @@ +<% response.sendRedirect("login.action"); %> diff --git a/shiro-basic/src/main/webapp/pages/login.jsp b/shiro-basic/src/main/webapp/pages/login.jsp new file mode 100644 index 00000000..8d62758d --- /dev/null +++ b/shiro-basic/src/main/webapp/pages/login.jsp @@ -0,0 +1,27 @@ +<%@ page language="java" contentType="text/html; charset=US-ASCII" + pageEncoding="US-ASCII"%> + +<%-- Using Struts2 Tags in JSP --%> +<%@ taglib uri="/struts-tags" prefix="s"%> + + + + Login Page + + + + + +

Welcome User, please login below

+ + + + + +
+ +
+
+
+ + \ No newline at end of file diff --git a/shiro-basic/src/main/webapp/pages/welcome.jsp b/shiro-basic/src/main/webapp/pages/welcome.jsp new file mode 100644 index 00000000..813d3ab7 --- /dev/null +++ b/shiro-basic/src/main/webapp/pages/welcome.jsp @@ -0,0 +1,39 @@ +<%@ page language="java" contentType="text/html; charset=US-ASCII" pageEncoding="US-ASCII"%> +<%@ taglib uri="/struts-tags" prefix="s"%> +<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> + + + + + + Welcome Page + + + + + + +

Welcome

+

Roles:

+
    +
  • May the Schwartz be with you! +
  • Hello, mere mortal. +
+

Permissions:

+
    +
  • You may use a lightsaber ring. Use it wisely.
    +
  • Sorry, lightsaber rings are for schwartz masters only. +
  • You are permitted to 'drive' the winnebago with license plate (id) 'eagle5'.
    Here are the keys - have fun!
    +
  • Sorry, you aren't allowed to drive the 'eagle5' winnebago! +
+
+ +

Welcome Guest

+
+ +
+ + + + + \ No newline at end of file From 35a4fef0e4eff60bb2b5c2ccde231fe52ad79610 Mon Sep 17 00:00:00 2001 From: tkofford Date: Thu, 6 Jul 2017 08:03:22 -0500 Subject: [PATCH 2/6] Cleaning up CR/LF and tabs --- shiro-basic/src/main/webapp/pages/login.jsp | 20 +++++++++---------- shiro-basic/src/main/webapp/pages/welcome.jsp | 16 +++++++-------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/shiro-basic/src/main/webapp/pages/login.jsp b/shiro-basic/src/main/webapp/pages/login.jsp index 8d62758d..a8941a12 100644 --- a/shiro-basic/src/main/webapp/pages/login.jsp +++ b/shiro-basic/src/main/webapp/pages/login.jsp @@ -5,8 +5,8 @@ <%@ taglib uri="/struts-tags" prefix="s"%> - - Login Page + + Login Page @@ -14,14 +14,14 @@

Welcome User, please login below

- - - - -
- -
-
+ + + + +
+ +
+
\ No newline at end of file diff --git a/shiro-basic/src/main/webapp/pages/welcome.jsp b/shiro-basic/src/main/webapp/pages/welcome.jsp index 813d3ab7..600971d3 100644 --- a/shiro-basic/src/main/webapp/pages/welcome.jsp +++ b/shiro-basic/src/main/webapp/pages/welcome.jsp @@ -5,9 +5,9 @@ - - Welcome Page - + + Welcome Page + @@ -21,10 +21,10 @@

Permissions:

    -
  • You may use a lightsaber ring. Use it wisely.
    -
  • Sorry, lightsaber rings are for schwartz masters only. -
  • You are permitted to 'drive' the winnebago with license plate (id) 'eagle5'.
    Here are the keys - have fun!
    -
  • Sorry, you aren't allowed to drive the 'eagle5' winnebago! +
  • You may use a lightsaber ring. Use it wisely.
    +
  • Sorry, lightsaber rings are for schwartz masters only. +
  • You are permitted to 'drive' the winnebago with license plate (id) 'eagle5'.
    Here are the keys - have fun!
    +
  • Sorry, you aren't allowed to drive the 'eagle5' winnebago!
@@ -33,7 +33,7 @@
- + \ No newline at end of file From ade34f2877316df689321db452deaae4e4320ccc Mon Sep 17 00:00:00 2001 From: tkofford Date: Thu, 6 Jul 2017 08:21:37 -0500 Subject: [PATCH 3/6] Adding project 'shiro-basic' --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 16778d5b..0a43b585 100644 --- a/pom.xml +++ b/pom.xml @@ -71,6 +71,7 @@ preparable-interface restful2actionmapper rest-angular + shiro-basic spring-struts text-provider tiles From d5420bb2e729d6fa33a119dbbb7cd19d1c7b8e1b Mon Sep 17 00:00:00 2001 From: tkofford Date: Thu, 6 Jul 2017 08:36:58 -0500 Subject: [PATCH 4/6] Modifications for integrating with 'struts-examples' parent pom.xml file --- shiro-basic/pom.xml | 40 ++++++++++++++-------------------------- 1 file changed, 14 insertions(+), 26 deletions(-) diff --git a/shiro-basic/pom.xml b/shiro-basic/pom.xml index 3dfe907f..3b716d1e 100644 --- a/shiro-basic/pom.xml +++ b/shiro-basic/pom.xml @@ -1,22 +1,27 @@ 4.0.0 - struts2shiro - struts2shiro - 1.0.0 - war + + org.apache.struts + struts-examples + 1.0.0 + + + shiro-basic + + Struts2 with Basic Shiro Security Integration + war + - UTF-8 1.3.2 - 2.5.10.1 org.apache.struts struts2-core - ${struts.version} + ${struts2.version} @@ -33,12 +38,12 @@ org.apache.logging.log4j log4j-api - 2.8.2 + ${log4j2.version} org.apache.logging.log4j log4j-core - 2.8.2 + ${log4j2.version} @@ -57,23 +62,6 @@ - - - maven-compiler-plugin - 3.1 - - 1.8 - 1.8 - - - - maven-war-plugin - 2.4 - - false - - - ${project.artifactId} \ No newline at end of file From a6ad31df3956cc4b30eb8635b76cee9a54725fab Mon Sep 17 00:00:00 2001 From: tkofford Date: Thu, 6 Jul 2017 08:58:26 -0500 Subject: [PATCH 5/6] Modifying package name to be consistent with other projects in the 'struts-examples' parent project --- .../example/struts2shiro/action/LoginAction.java | 2 +- .../example/struts2shiro/action/LogoutAction.java | 2 +- .../example/struts2shiro/action/ShiroBaseAction.java | 10 ++-------- .../example/struts2shiro/action/WelcomeAction.java | 2 +- .../interceptor/ShiroUserInterceptor.java | 11 ++--------- shiro-basic/src/main/resources/struts.xml | 8 ++++---- 6 files changed, 11 insertions(+), 24 deletions(-) rename shiro-basic/src/main/java/{ => org/apache/struts2/shiro}/example/struts2shiro/action/LoginAction.java (98%) rename shiro-basic/src/main/java/{ => org/apache/struts2/shiro}/example/struts2shiro/action/LogoutAction.java (87%) rename shiro-basic/src/main/java/{ => org/apache/struts2/shiro}/example/struts2shiro/action/ShiroBaseAction.java (86%) rename shiro-basic/src/main/java/{ => org/apache/struts2/shiro}/example/struts2shiro/action/WelcomeAction.java (98%) rename shiro-basic/src/main/java/{ => org/apache/struts2/shiro}/example/struts2shiro/interceptor/ShiroUserInterceptor.java (86%) diff --git a/shiro-basic/src/main/java/example/struts2shiro/action/LoginAction.java b/shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/action/LoginAction.java similarity index 98% rename from shiro-basic/src/main/java/example/struts2shiro/action/LoginAction.java rename to shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/action/LoginAction.java index fbfceb3f..ebaf866a 100644 --- a/shiro-basic/src/main/java/example/struts2shiro/action/LoginAction.java +++ b/shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/action/LoginAction.java @@ -1,4 +1,4 @@ -package example.struts2shiro.action; +package org.apache.struts2.shiro.example.action; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; diff --git a/shiro-basic/src/main/java/example/struts2shiro/action/LogoutAction.java b/shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/action/LogoutAction.java similarity index 87% rename from shiro-basic/src/main/java/example/struts2shiro/action/LogoutAction.java rename to shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/action/LogoutAction.java index 731447b5..defab7de 100644 --- a/shiro-basic/src/main/java/example/struts2shiro/action/LogoutAction.java +++ b/shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/action/LogoutAction.java @@ -1,4 +1,4 @@ -package example.struts2shiro.action; +package org.apache.struts2.shiro.example.action; public class LogoutAction extends ShiroBaseAction { diff --git a/shiro-basic/src/main/java/example/struts2shiro/action/ShiroBaseAction.java b/shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/action/ShiroBaseAction.java similarity index 86% rename from shiro-basic/src/main/java/example/struts2shiro/action/ShiroBaseAction.java rename to shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/action/ShiroBaseAction.java index 49c60ca9..b5702fae 100644 --- a/shiro-basic/src/main/java/example/struts2shiro/action/ShiroBaseAction.java +++ b/shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/action/ShiroBaseAction.java @@ -1,16 +1,10 @@ -/** - * - */ -package example.struts2shiro.action; +package org.apache.struts2.shiro.example.action; import org.apache.shiro.subject.Subject; import com.opensymphony.xwork2.ActionSupport; -/** - * @author tkofford - * - */ + public class ShiroBaseAction extends ActionSupport { private static final long serialVersionUID = 1L; diff --git a/shiro-basic/src/main/java/example/struts2shiro/action/WelcomeAction.java b/shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/action/WelcomeAction.java similarity index 98% rename from shiro-basic/src/main/java/example/struts2shiro/action/WelcomeAction.java rename to shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/action/WelcomeAction.java index 2906c4b6..797df1dc 100644 --- a/shiro-basic/src/main/java/example/struts2shiro/action/WelcomeAction.java +++ b/shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/action/WelcomeAction.java @@ -1,4 +1,4 @@ -package example.struts2shiro.action; +package org.apache.struts2.shiro.example.action; import org.apache.shiro.session.Session; import org.apache.logging.log4j.LogManager; diff --git a/shiro-basic/src/main/java/example/struts2shiro/interceptor/ShiroUserInterceptor.java b/shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/interceptor/ShiroUserInterceptor.java similarity index 86% rename from shiro-basic/src/main/java/example/struts2shiro/interceptor/ShiroUserInterceptor.java rename to shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/interceptor/ShiroUserInterceptor.java index cbfe19b0..794422ca 100644 --- a/shiro-basic/src/main/java/example/struts2shiro/interceptor/ShiroUserInterceptor.java +++ b/shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/interceptor/ShiroUserInterceptor.java @@ -1,7 +1,7 @@ /** * */ -package example.struts2shiro.interceptor; +package org.apache.struts2.shiro.example.interceptor; import org.apache.shiro.SecurityUtils; import org.apache.shiro.subject.Subject; @@ -9,17 +9,10 @@ import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; -/** - * @author tkofford - * - */ - /** * Inserts the current Shiro user into the value stack so that it can be * injected into Struts 2 actions should they have a JavaBeans setter * setShiroUser(org.apache.shiro.subject.Subject shiroUser). - * - * @version $Revision: $ $Date: $ */ public class ShiroUserInterceptor implements Interceptor { @@ -52,7 +45,7 @@ public void init() @Override public String intercept(ActionInvocation actionInvocation) throws Exception { - if (actionInvocation.getAction() instanceof example.struts2shiro.action.ShiroBaseAction) + if (actionInvocation.getAction() instanceof org.apache.struts2.shiro.example.action.ShiroBaseAction) { Subject shiroUser = SecurityUtils.getSubject(); actionInvocation.getStack().setValue("shiroUser", shiroUser); diff --git a/shiro-basic/src/main/resources/struts.xml b/shiro-basic/src/main/resources/struts.xml index c22a7e6f..0fe7a9f6 100644 --- a/shiro-basic/src/main/resources/struts.xml +++ b/shiro-basic/src/main/resources/struts.xml @@ -6,7 +6,7 @@ - + @@ -18,17 +18,17 @@ pages/login.jsp - + pages/welcome.jsp - + welcome ${username} pages/login.jsp - + pages/login.jsp From ee5a3e3abe8f6cb56714789958573a882e83aa7b Mon Sep 17 00:00:00 2001 From: tkofford Date: Thu, 6 Jul 2017 10:31:57 -0500 Subject: [PATCH 6/6] Reorganizing package directories --- .../shiro/example/action/LoginAction.java | 116 ++++++++++++++++++ .../action/LogoutAction.java | 0 .../action/ShiroBaseAction.java | 2 +- .../action/WelcomeAction.java | 8 +- .../interceptor/ShiroUserInterceptor.java | 0 .../struts2shiro/action/LoginAction.java | 113 ----------------- 6 files changed, 124 insertions(+), 115 deletions(-) create mode 100644 shiro-basic/src/main/java/org/apache/struts2/shiro/example/action/LoginAction.java rename shiro-basic/src/main/java/org/apache/struts2/shiro/example/{struts2shiro => }/action/LogoutAction.java (100%) rename shiro-basic/src/main/java/org/apache/struts2/shiro/example/{struts2shiro => }/action/ShiroBaseAction.java (92%) rename shiro-basic/src/main/java/org/apache/struts2/shiro/example/{struts2shiro => }/action/WelcomeAction.java (96%) rename shiro-basic/src/main/java/org/apache/struts2/shiro/example/{struts2shiro => }/interceptor/ShiroUserInterceptor.java (100%) delete mode 100644 shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/action/LoginAction.java diff --git a/shiro-basic/src/main/java/org/apache/struts2/shiro/example/action/LoginAction.java b/shiro-basic/src/main/java/org/apache/struts2/shiro/example/action/LoginAction.java new file mode 100644 index 00000000..88f7ba5d --- /dev/null +++ b/shiro-basic/src/main/java/org/apache/struts2/shiro/example/action/LoginAction.java @@ -0,0 +1,116 @@ +package org.apache.struts2.shiro.example.action; + +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.IncorrectCredentialsException; +import org.apache.shiro.authc.LockedAccountException; +import org.apache.shiro.authc.UnknownAccountException; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.session.Session; +import org.apache.shiro.subject.Subject; +import com.opensymphony.xwork2.ActionSupport; +import com.opensymphony.xwork2.Preparable; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class LoginAction extends ActionSupport implements Preparable +{ + + private static final long serialVersionUID = 1L; + private static final transient Logger log = LogManager.getLogger(LoginAction.class); + + private String username; + private String password; + private transient Subject shiroUser; + + @Override + public void prepare() throws Exception + { + shiroUser = SecurityUtils.getSubject(); + } + + @Override + public String execute() + { + String result = INPUT; + + if (shiroUser != null) + { + // Do some stuff with a Session + Session session = shiroUser.getSession(); + session.setAttribute("MyUsername", username); + log.info("Saving 'username' value to session [" + username + "]"); + + // let's login the current user so we can check against roles and permissions: + if (! shiroUser.isAuthenticated()) + { + UsernamePasswordToken token = new UsernamePasswordToken(username, password); + token.setRememberMe(true); + try + { + shiroUser.login(token); + result = SUCCESS; + } + catch (UnknownAccountException uae) + { + addActionError("There is no user with username of '" + token.getPrincipal() + "'"); + log.error(uae.getMessage()); + } + catch (IncorrectCredentialsException ice) + { + addActionError("Password for account '" + token.getPrincipal() + "' was incorrect!"); + log.error(ice.getMessage()); + } + catch (LockedAccountException lae) + { + addActionError("The account for username '" + token.getPrincipal() + "' is locked. " + + "Please contact your administrator to unlock it."); + log.error(lae.getMessage()); + } + // ... catch more exceptions here (maybe custom ones specific to your application? + catch (AuthenticationException ae) + { + addActionError("An authentication exception has occurred trying to login user: " + token.getPrincipal()); + log.error(ae.getMessage()); + } + } + else if (shiroUser.isAuthenticated()) + { + result = SUCCESS; + } + } + + return result; + } + + public Subject getShiroUser() + { + return shiroUser; + } + + public void setShiroUser(Subject shiroUser) + { + this.shiroUser = shiroUser; + } + + public String getUsername() + { + return username; + } + + public void setUsername(String username) + { + this.username = username; + } + + public String getPassword() + { + return password; + } + + public void setPassword(String password) + { + this.password = password; + } + +} diff --git a/shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/action/LogoutAction.java b/shiro-basic/src/main/java/org/apache/struts2/shiro/example/action/LogoutAction.java similarity index 100% rename from shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/action/LogoutAction.java rename to shiro-basic/src/main/java/org/apache/struts2/shiro/example/action/LogoutAction.java diff --git a/shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/action/ShiroBaseAction.java b/shiro-basic/src/main/java/org/apache/struts2/shiro/example/action/ShiroBaseAction.java similarity index 92% rename from shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/action/ShiroBaseAction.java rename to shiro-basic/src/main/java/org/apache/struts2/shiro/example/action/ShiroBaseAction.java index b5702fae..e93c1457 100644 --- a/shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/action/ShiroBaseAction.java +++ b/shiro-basic/src/main/java/org/apache/struts2/shiro/example/action/ShiroBaseAction.java @@ -9,7 +9,7 @@ public class ShiroBaseAction extends ActionSupport { private static final long serialVersionUID = 1L; - private Subject shiroUser; + private transient Subject shiroUser; public boolean isAuthenticated() { diff --git a/shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/action/WelcomeAction.java b/shiro-basic/src/main/java/org/apache/struts2/shiro/example/action/WelcomeAction.java similarity index 96% rename from shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/action/WelcomeAction.java rename to shiro-basic/src/main/java/org/apache/struts2/shiro/example/action/WelcomeAction.java index 797df1dc..b76bcfc4 100644 --- a/shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/action/WelcomeAction.java +++ b/shiro-basic/src/main/java/org/apache/struts2/shiro/example/action/WelcomeAction.java @@ -21,7 +21,8 @@ public String execute() // Retrieve value from session Session session = getShiroUser().getSession(); String value = (String) session.getAttribute("MyUsername"); - if (value.equals(username)) { + if (value.equals(username)) + { log.info("Retrieved the correct 'username' value [" + value + "] from session"); } @@ -43,6 +44,7 @@ public void printRoles() { log.info("User '" + username + "' is missing role 'admin'"); } + if (getShiroUser().hasRole("schwartz")) { log.info("User '" + username + "' has role of 'schwartz'"); @@ -51,6 +53,7 @@ public void printRoles() { log.info("User '" + username + "' is missing role 'schwartz'"); } + if (getShiroUser().hasRole("goodguy")) { log.info("User '" + username + "' has role of 'goodguy'"); @@ -71,6 +74,7 @@ public void printPermissions() { log.info("User '" + username + "' is missing permission 'lightsaber'"); } + if (getShiroUser().isPermitted("winnebago")) { log.info("User '" + username + "' has 'winnebago' permission"); @@ -79,6 +83,7 @@ public void printPermissions() { log.info("User '" + username + "' is missing permission 'winnebago'"); } + if (getShiroUser().isPermitted("winnebago:drive:eagle5")) { log.info("User '" + username + "' has 'winnebago:drive:eagle5' permission"); @@ -88,6 +93,7 @@ public void printPermissions() log.info("User '" + username + "' is missing permission 'winnebago:drive:eagle5'"); } } + public String getUsername() { return username; diff --git a/shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/interceptor/ShiroUserInterceptor.java b/shiro-basic/src/main/java/org/apache/struts2/shiro/example/interceptor/ShiroUserInterceptor.java similarity index 100% rename from shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/interceptor/ShiroUserInterceptor.java rename to shiro-basic/src/main/java/org/apache/struts2/shiro/example/interceptor/ShiroUserInterceptor.java diff --git a/shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/action/LoginAction.java b/shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/action/LoginAction.java deleted file mode 100644 index ebaf866a..00000000 --- a/shiro-basic/src/main/java/org/apache/struts2/shiro/example/struts2shiro/action/LoginAction.java +++ /dev/null @@ -1,113 +0,0 @@ -package org.apache.struts2.shiro.example.action; - -import org.apache.shiro.SecurityUtils; -import org.apache.shiro.authc.AuthenticationException; -import org.apache.shiro.authc.IncorrectCredentialsException; -import org.apache.shiro.authc.LockedAccountException; -import org.apache.shiro.authc.UnknownAccountException; -import org.apache.shiro.authc.UsernamePasswordToken; -import org.apache.shiro.session.Session; -import org.apache.shiro.subject.Subject; -import com.opensymphony.xwork2.ActionSupport; -import com.opensymphony.xwork2.Preparable; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -public class LoginAction extends ActionSupport implements Preparable -{ - - private static final long serialVersionUID = 1L; - private static final transient Logger log = LogManager.getLogger(LoginAction.class); - - private String username; - private String password; - private Subject shiroUser; - - @Override - public void prepare() throws Exception - { - shiroUser = SecurityUtils.getSubject(); - } - - @Override - public String execute() - { - String result = INPUT; - - // Do some stuff with a Session - Session session = shiroUser.getSession(); - session.setAttribute("MyUsername", username); - log.info("Saving 'username' value to session [" + username + "]"); - - // let's login the current user so we can check against roles and permissions: - if (shiroUser != null && ! shiroUser.isAuthenticated()) - { - UsernamePasswordToken token = new UsernamePasswordToken(username, password); - token.setRememberMe(true); - try - { - shiroUser.login(token); - result = SUCCESS; - } - catch (UnknownAccountException uae) - { - addActionError("There is no user with username of '" + token.getPrincipal() + "'"); - log.error(uae.getMessage()); - } - catch (IncorrectCredentialsException ice) - { - addActionError("Password for account '" + token.getPrincipal() + "' was incorrect!"); - log.error(ice.getMessage()); - } - catch (LockedAccountException lae) - { - addActionError("The account for username '" + token.getPrincipal() + "' is locked. " + - "Please contact your administrator to unlock it."); - log.error(lae.getMessage()); - } - // ... catch more exceptions here (maybe custom ones specific to your application? - catch (AuthenticationException ae) - { - addActionError("An authentication exception has occurred trying to login user: " + token.getPrincipal()); - log.error(ae.getMessage()); - } - } - else if (shiroUser.isAuthenticated()) - { - result = SUCCESS; - } - - return result; - } - - public Subject getShiroUser() - { - return shiroUser; - } - - public void setShiroUser(Subject shiroUser) - { - this.shiroUser = shiroUser; - } - - public String getUsername() - { - return username; - } - - public void setUsername(String username) - { - this.username = username; - } - - public String getPassword() - { - return password; - } - - public void setPassword(String password) - { - this.password = password; - } - -}