Repository: struts-examples
Updated Branches:
  refs/heads/master 9f8e55972 -> dece3f955


Initial commit


Project: http://git-wip-us.apache.org/repos/asf/struts-examples/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts-examples/commit/876600a3
Tree: http://git-wip-us.apache.org/repos/asf/struts-examples/tree/876600a3
Diff: http://git-wip-us.apache.org/repos/asf/struts-examples/diff/876600a3

Branch: refs/heads/master
Commit: 876600a345cd34f4a52634ebc8b1fe0769585eb3
Parents: d07e954
Author: tkofford <tkoff...@home.ku.edu>
Authored: Thu Jul 6 07:59:44 2017 -0500
Committer: tkofford <tkoff...@home.ku.edu>
Committed: Thu Jul 6 07:59:44 2017 -0500

----------------------------------------------------------------------
 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(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts-examples/blob/876600a3/shiro-basic/pom.xml
----------------------------------------------------------------------
diff --git a/shiro-basic/pom.xml b/shiro-basic/pom.xml
new file mode 100644
index 0000000..3dfe907
--- /dev/null
+++ b/shiro-basic/pom.xml
@@ -0,0 +1,79 @@
+<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>
+    <groupId>struts2shiro</groupId>
+    <artifactId>struts2shiro</artifactId>
+    <version>1.0.0</version>
+    <packaging>war</packaging>
+    
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <shiro.version>1.3.2</shiro.version>
+        <struts.version>2.5.10.1</struts.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.struts</groupId>
+            <artifactId>struts2-core</artifactId>
+            <version>${struts.version}</version>
+        </dependency>
+        
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-core</artifactId>
+            <version>${shiro.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-web</artifactId>
+            <version>${shiro.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-api</artifactId>
+            <version>2.8.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-core</artifactId>
+            <version>2.8.2</version>
+        </dependency>
+        
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>servlet-api</artifactId>
+            <version>2.4</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet.jsp</groupId>
+            <artifactId>jsp-api</artifactId>
+            <version>2.1</version>
+            <scope>provided</scope>
+        </dependency>
+                
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>2.4</version>
+                <configuration>
+                    <failOnMissingWebXml>false</failOnMissingWebXml>
+                </configuration>
+            </plugin>
+        </plugins>
+        <finalName>${project.artifactId}</finalName>
+    </build>
+</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/876600a3/shiro-basic/src/main/java/example/struts2shiro/action/LoginAction.java
----------------------------------------------------------------------
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 0000000..fbfceb3
--- /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;
+    }    
+    
+}

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/876600a3/shiro-basic/src/main/java/example/struts2shiro/action/LogoutAction.java
----------------------------------------------------------------------
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 0000000..731447b
--- /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;
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/876600a3/shiro-basic/src/main/java/example/struts2shiro/action/ShiroBaseAction.java
----------------------------------------------------------------------
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 0000000..49c60ca
--- /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;
+    }
+}

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/876600a3/shiro-basic/src/main/java/example/struts2shiro/action/WelcomeAction.java
----------------------------------------------------------------------
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 0000000..2906c4b
--- /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;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/876600a3/shiro-basic/src/main/java/example/struts2shiro/interceptor/ShiroUserInterceptor.java
----------------------------------------------------------------------
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 0000000..cbfe19b
--- /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
+ * <code>setShiroUser(org.apache.shiro.subject.Subject shiroUser)</code>.
+ *
+ * @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();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/876600a3/shiro-basic/src/main/resources/log4j2.xml
----------------------------------------------------------------------
diff --git a/shiro-basic/src/main/resources/log4j2.xml 
b/shiro-basic/src/main/resources/log4j2.xml
new file mode 100644
index 0000000..26eb0c2
--- /dev/null
+++ b/shiro-basic/src/main/resources/log4j2.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration monitorinterval="30" status="info" strict="true">
+    <Properties>
+        <Property 
name="filename">${sys:catalina.home}/logs/struts2shiro.log</Property>
+    </Properties>
+    <Appenders>
+        <Appender type="Console" name="Console">
+            <Layout type="PatternLayout" pattern="%d %p [%t] %m%n" />
+        </Appender>
+        <Appender type="Console" name="FLOW">
+            <Layout type="PatternLayout" pattern="%C{1}.%M %m %ex%n" />
+        </Appender>
+        <Appender type="File" name="File" fileName="${filename}">
+            <Layout type="PatternLayout" pattern="%d %p %C{1.} [%t] %m%n" />
+        </Appender>
+    </Appenders>
+    <Loggers>
+        <Root level="info">
+            <AppenderRef ref="File" />
+            <AppenderRef ref="Console" />
+            <!-- Use FLOW to trace down exact method sending the msg -->
+            <!-- <AppenderRef ref="FLOW" /> -->
+        </Root>
+    </Loggers>
+</Configuration>

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/876600a3/shiro-basic/src/main/resources/shiro.ini
----------------------------------------------------------------------
diff --git a/shiro-basic/src/main/resources/shiro.ini 
b/shiro-basic/src/main/resources/shiro.ini
new file mode 100644
index 0000000..436c465
--- /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

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/876600a3/shiro-basic/src/main/resources/struts.xml
----------------------------------------------------------------------
diff --git a/shiro-basic/src/main/resources/struts.xml 
b/shiro-basic/src/main/resources/struts.xml
new file mode 100644
index 0000000..c22a7e6
--- /dev/null
+++ b/shiro-basic/src/main/resources/struts.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE struts PUBLIC
+    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
+    "http://struts.apache.org/dtds/struts-2.3.dtd";>
+<struts>
+    <package name="default" namespace="/" extends="struts-default">
+        <interceptors>
+            <interceptor name="shiroUser" 
class="example.struts2shiro.interceptor.ShiroUserInterceptor"/>
+            <interceptor-stack name="shiro-default">
+                <interceptor-ref name="shiroUser"/>
+                <interceptor-ref name="params"/> <!-- Run the params 
interceptor before the default stack. This allows us to access param values in 
our prepare() methods. -->
+                <interceptor-ref name="defaultStack"/>
+            </interceptor-stack>
+        </interceptors>
+        <default-interceptor-ref name="shiro-default"/>
+
+        <action name="login">
+            <result>pages/login.jsp</result>
+        </action>
+        <action name="welcome" 
class="example.struts2shiro.action.WelcomeAction">
+            <result>pages/welcome.jsp</result>
+        </action>
+        <action name="authuser" 
class="example.struts2shiro.action.LoginAction">
+            <result name="success" type="redirectAction">
+                <param name="actionName">welcome</param>
+                <param name="username">${username}</param>
+            </result>
+            <result name="input">pages/login.jsp</result>
+        </action>
+        <action name="logout" class="example.struts2shiro.action.LogoutAction">
+            <result name="success">pages/login.jsp</result>
+        </action>
+
+    </package>
+
+</struts>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/876600a3/shiro-basic/src/main/webapp/WEB-INF/web.xml
----------------------------------------------------------------------
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 0000000..c62e000
--- /dev/null
+++ b/shiro-basic/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xmlns="http://java.sun.com/xml/ns/javaee"; 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"; id="WebApp_ID" version="3.0">
+  <display-name>struts2shiro</display-name>
+  <listener>
+    
<listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
+  </listener>
+  <filter>
+    <filter-name>shiroFilter</filter-name>
+    <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
+  </filter>
+  <filter-mapping>
+    <filter-name>shiroFilter</filter-name>
+    <url-pattern>/*</url-pattern>
+    <dispatcher>REQUEST</dispatcher>
+    <dispatcher>FORWARD</dispatcher>
+    <dispatcher>INCLUDE</dispatcher>
+    <dispatcher>ERROR</dispatcher>
+  </filter-mapping>
+  <filter>
+    <filter-name>struts2</filter-name>
+    
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
+  </filter>
+  <filter-mapping>
+    <filter-name>struts2</filter-name>
+    <url-pattern>/*</url-pattern>
+  </filter-mapping>
+</web-app>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/876600a3/shiro-basic/src/main/webapp/css/main.css
----------------------------------------------------------------------
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 0000000..27b210b
--- /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; }

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/876600a3/shiro-basic/src/main/webapp/index.jsp
----------------------------------------------------------------------
diff --git a/shiro-basic/src/main/webapp/index.jsp 
b/shiro-basic/src/main/webapp/index.jsp
new file mode 100644
index 0000000..ca4c39d
--- /dev/null
+++ b/shiro-basic/src/main/webapp/index.jsp
@@ -0,0 +1 @@
+<% response.sendRedirect("login.action"); %> 

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/876600a3/shiro-basic/src/main/webapp/pages/login.jsp
----------------------------------------------------------------------
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 0000000..8d62758
--- /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"%>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd";>
+<%-- Using Struts2 Tags in JSP --%>
+<%@ taglib uri="/struts-tags" prefix="s"%>
+<html>
+<head>
+       <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+       <title>Login Page</title>
+    <link href="<s:url value='/css/main.css'/>" rel="stylesheet" 
type="text/css"/>
+</head>
+<s:head theme="xhtml" />
+
+<body>
+<h3>Welcome User, please login below</h3>
+<s:form action="authuser" theme="xhtml">
+       <s:textfield name="username" label="User Name"></s:textfield>
+       <s:textfield name="password" label="Password" 
type="password"></s:textfield>
+       <s:submit value="Login"></s:submit>
+       <s:if test="hasActionErrors()">
+          <div class="errors">
+             <s:actionerror/>
+          </div>
+       </s:if>
+</s:form>
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/876600a3/shiro-basic/src/main/webapp/pages/welcome.jsp
----------------------------------------------------------------------
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 0000000..813d3ab
--- /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"; %>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd";>
+<html>
+<head>
+       <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+       <title>Welcome Page</title>
+       <link href="<s:url value='/css/main.css'/>" rel="stylesheet" 
type="text/css"/>
+</head>
+<s:head theme="xhtml" />
+
+<body>
+  <shiro:authenticated>
+    <h3>Welcome <s:property value="username"></s:property></h3>
+    <h4>Roles:</h4>
+    <ul>
+        <shiro:hasRole name="schwartz"><li>May the Schwartz be with 
you!</shiro:hasRole>
+        <shiro:lacksRole name="schwartz"><li>Hello, mere 
mortal.</shiro:lacksRole>
+    </ul>
+    <h4>Permissions:</h4>
+    <ul>
+           <shiro:hasPermission name="lightsaber:weild"><li>You may use a 
lightsaber ring.  Use it wisely.<br></shiro:hasPermission>
+           <shiro:lacksPermission name="lightsaber:weild"><li>Sorry, 
lightsaber rings are for schwartz masters only.</shiro:lacksPermission>
+           <shiro:hasPermission name="winnebago:drive:eagle5"><li>You are 
permitted to 'drive' the winnebago with license plate (id) 'eagle5'.<br>Here 
are the keys - have fun!<br></shiro:hasPermission>
+           <shiro:lacksPermission name="winnebago:drive:eagle5"><li>Sorry, you 
aren't allowed to drive the 'eagle5' winnebago!</shiro:lacksPermission>
+    </ul>
+  </shiro:authenticated>
+  <shiro:notAuthenticated>
+    <h3>Welcome Guest</h3>
+  </shiro:notAuthenticated>
+
+  <br>
+  <s:form action="logout">
+       <s:submit value="Logout"></s:submit>
+  </s:form>
+</body>
+</html>
\ No newline at end of file

Reply via email to