This is awesome, thanks!
On Fri, Feb 19, 2010 at 2:25 AM, <[email protected]> wrote: > Author: kaosko > Date: Fri Feb 19 07:25:50 2010 > New Revision: 911722 > > URL: http://svn.apache.org/viewvc?rev=911722&view=rev > Log: > SHIRO-89: Sample Spring Application - WebStart won't launch > - Refactor Spring sample client from Spring sample into its own module to > make packaging & dependency management easier and simpler. Work in progress > > Added: > incubator/shiro/trunk/samples/spring-client/ > incubator/shiro/trunk/samples/spring-client/pom.xml > incubator/shiro/trunk/samples/spring-client/src/ > incubator/shiro/trunk/samples/spring-client/src/main/ > incubator/shiro/trunk/samples/spring-client/src/main/java/ > incubator/shiro/trunk/samples/spring-client/src/main/java/org/ > incubator/shiro/trunk/samples/spring-client/src/main/java/org/apache/ > incubator/shiro/trunk/samples/spring-client/src/main/java/org/apache/shiro/ > > incubator/shiro/trunk/samples/spring-client/src/main/java/org/apache/shiro/samples/ > > incubator/shiro/trunk/samples/spring-client/src/main/java/org/apache/shiro/samples/spring/ > > incubator/shiro/trunk/samples/spring-client/src/main/java/org/apache/shiro/samples/spring/DefaultSampleManager.java > > incubator/shiro/trunk/samples/spring-client/src/main/java/org/apache/shiro/samples/spring/SampleManager.java > > incubator/shiro/trunk/samples/spring-client/src/main/java/org/apache/shiro/samples/spring/ui/ > > incubator/shiro/trunk/samples/spring-client/src/main/java/org/apache/shiro/samples/spring/ui/WebStartDriver.java > > incubator/shiro/trunk/samples/spring-client/src/main/java/org/apache/shiro/samples/spring/ui/WebStartView.java > incubator/shiro/trunk/samples/spring-client/src/main/resources/ > incubator/shiro/trunk/samples/spring-client/src/main/resources/logo.png > (with props) > > incubator/shiro/trunk/samples/spring-client/src/main/resources/webstart.spring.xml > > Added: incubator/shiro/trunk/samples/spring-client/pom.xml > URL: > http://svn.apache.org/viewvc/incubator/shiro/trunk/samples/spring-client/pom.xml?rev=911722&view=auto > ============================================================================== > --- incubator/shiro/trunk/samples/spring-client/pom.xml (added) > +++ incubator/shiro/trunk/samples/spring-client/pom.xml Fri Feb 19 07:25:50 > 2010 > @@ -0,0 +1,55 @@ > +<?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. > + --> > +<!--suppress osmorcNonOsgiMavenDependency --> > +<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"> > + > + <parent> > + <groupId>org.apache.shiro.samples</groupId> > + <artifactId>shiro-samples</artifactId> > + <version>1.0-incubating-SNAPSHOT</version> > + </parent> > + > + <modelVersion>4.0.0</modelVersion> > + <artifactId>samples-spring-client</artifactId> > + <name>Apache Shiro :: Samples :: Spring Client</name> > + <description>Spring Client used by Spring Sample > webapplication</description> > + <packaging>jar</packaging> > + > + <dependencies> > + <dependency> > + <groupId>org.apache.shiro</groupId> > + <artifactId>shiro-core</artifactId> > + </dependency> > + <dependency> > + <groupId>org.apache.shiro</groupId> > + <artifactId>shiro-spring</artifactId> > + </dependency> > + <dependency> > + <groupId>org.apache.shiro</groupId> > + <artifactId>shiro-web</artifactId> > + </dependency> > + <dependency> > + <groupId>org.springframework</groupId> > + <artifactId>spring</artifactId> > + </dependency> > + </dependencies> > + > +</project> > > Added: > incubator/shiro/trunk/samples/spring-client/src/main/java/org/apache/shiro/samples/spring/DefaultSampleManager.java > URL: > http://svn.apache.org/viewvc/incubator/shiro/trunk/samples/spring-client/src/main/java/org/apache/shiro/samples/spring/DefaultSampleManager.java?rev=911722&view=auto > ============================================================================== > --- > incubator/shiro/trunk/samples/spring-client/src/main/java/org/apache/shiro/samples/spring/DefaultSampleManager.java > (added) > +++ > incubator/shiro/trunk/samples/spring-client/src/main/java/org/apache/shiro/samples/spring/DefaultSampleManager.java > Fri Feb 19 07:25:50 2010 > @@ -0,0 +1,106 @@ > +/* > + * 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.spring; > + > +import org.slf4j.Logger; > +import org.slf4j.LoggerFactory; > + > +import org.apache.shiro.SecurityUtils; > +import org.apache.shiro.session.Session; > +import org.apache.shiro.subject.Subject; > + > + > +/** > + * Default implementation of the {...@link SampleManager} interface that > stores > + * and retrieves a value from the user's session. > + * > + * @author Jeremy Haile > + * @since 0.1 > + */ > +public class DefaultSampleManager implements SampleManager { > + > + /*-------------------------------------------- > + | C O N S T A N T S | > + ============================================*/ > + /** > + * Key used to store the value in the user's session. > + */ > + private static final String VALUE_KEY = "sample_value"; > + > + /*-------------------------------------------- > + | I N S T A N C E V A R I A B L E S | > + ============================================*/ > + private static final Logger log = > LoggerFactory.getLogger(DefaultSampleManager.class); > + > + /*-------------------------------------------- > + | C O N S T R U C T O R S | > + ============================================*/ > + > + /*-------------------------------------------- > + | A C C E S S O R S / M O D I F I E R S | > + ============================================*/ > + > + /*-------------------------------------------- > + | M E T H O D S | > + ============================================*/ > + > + public String getValue() { > + String value = null; > + > + Subject subject = SecurityUtils.getSubject(); > + Session session = subject.getSession(false); > + if (session != null) { > + value = (String) session.getAttribute(VALUE_KEY); > + if (log.isDebugEnabled()) { > + log.debug("retrieving session key [" + VALUE_KEY + "] with > value [" + value + "] on session with id [" + session.getId() + "]"); > + } > + } > + > + return value; > + } > + > + public void setValue(String newValue) { > + Subject subject = SecurityUtils.getSubject(); > + Session session = subject.getSession(); > + > + if (log.isDebugEnabled()) { > + log.debug("saving session key [" + VALUE_KEY + "] with value [" > + newValue + "] on session with id [" + session.getId() + "]"); > + } > + > + session.setAttribute(VALUE_KEY, newValue); > + } > + > + public void secureMethod1() { > + if (log.isInfoEnabled()) { > + log.info("Secure method 1 called..."); > + } > + } > + > + public void secureMethod2() { > + if (log.isInfoEnabled()) { > + log.info("Secure method 2 called..."); > + } > + } > + > + public void secureMethod3() { > + if (log.isInfoEnabled()) { > + log.info("Secure method 3 called..."); > + } > + } > +} > > Added: > incubator/shiro/trunk/samples/spring-client/src/main/java/org/apache/shiro/samples/spring/SampleManager.java > URL: > http://svn.apache.org/viewvc/incubator/shiro/trunk/samples/spring-client/src/main/java/org/apache/shiro/samples/spring/SampleManager.java?rev=911722&view=auto > ============================================================================== > --- > incubator/shiro/trunk/samples/spring-client/src/main/java/org/apache/shiro/samples/spring/SampleManager.java > (added) > +++ > incubator/shiro/trunk/samples/spring-client/src/main/java/org/apache/shiro/samples/spring/SampleManager.java > Fri Feb 19 07:25:50 2010 > @@ -0,0 +1,65 @@ > +/* > + * 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.spring; > + > +import org.apache.shiro.authz.annotation.RequiresPermissions; > +import org.apache.shiro.authz.annotation.RequiresRoles; > + > + > +/** > + * Business manager interface used for sample application. > + * > + * @author Jeremy Haile > + * @since 0.1 > + */ > +public interface SampleManager { > + > + /** > + * Returns the value stored in the user's session. > + * > + * @return the value. > + */ > + String getValue(); > + > + > + /** > + * Sets a value to be stored in the user's session. > + * > + * @param newValue the new value to store in the user's session. > + */ > + void setValue(String newValue); > + > + /** > + * Method that requires <tt>role1</tt> in order to be invoked. > + */ > + �...@requiresroles("role1") > + void secureMethod1(); > + > + /** > + * Method that requires <tt>role2</tt> in order to be invoked. > + */ > + �...@requiresroles("role2") > + void secureMethod2(); > + > + /** > + * Method that requires <tt>permission1</tt> in order to be invoked. > + */ > + �...@requirespermissions("permission2") > + void secureMethod3(); > +} > > Added: > incubator/shiro/trunk/samples/spring-client/src/main/java/org/apache/shiro/samples/spring/ui/WebStartDriver.java > URL: > http://svn.apache.org/viewvc/incubator/shiro/trunk/samples/spring-client/src/main/java/org/apache/shiro/samples/spring/ui/WebStartDriver.java?rev=911722&view=auto > ============================================================================== > --- > incubator/shiro/trunk/samples/spring-client/src/main/java/org/apache/shiro/samples/spring/ui/WebStartDriver.java > (added) > +++ > incubator/shiro/trunk/samples/spring-client/src/main/java/org/apache/shiro/samples/spring/ui/WebStartDriver.java > Fri Feb 19 07:25:50 2010 > @@ -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. > + */ > +package org.apache.shiro.samples.spring.ui; > + > +import org.springframework.context.support.ClassPathXmlApplicationContext; > + > +/** > + * Driver class used to launch the web start application by loading a > + * Spring application context. Once the Spring application context is > + * loaded, the initialization of the {...@link WebStartView} does the rest. > + * > + * @author Jeremy Haile > + * @since 0.1 > + */ > +public class WebStartDriver { > + > + public static void main(String[] args) { > + new ClassPathXmlApplicationContext("webstart.spring.xml"); > + } > +} > > Added: > incubator/shiro/trunk/samples/spring-client/src/main/java/org/apache/shiro/samples/spring/ui/WebStartView.java > URL: > http://svn.apache.org/viewvc/incubator/shiro/trunk/samples/spring-client/src/main/java/org/apache/shiro/samples/spring/ui/WebStartView.java?rev=911722&view=auto > ============================================================================== > --- > incubator/shiro/trunk/samples/spring-client/src/main/java/org/apache/shiro/samples/spring/ui/WebStartView.java > (added) > +++ > incubator/shiro/trunk/samples/spring-client/src/main/java/org/apache/shiro/samples/spring/ui/WebStartView.java > Fri Feb 19 07:25:50 2010 > @@ -0,0 +1,168 @@ > +/* > + * 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.spring.ui; > + > +import java.awt.*; > +import java.awt.event.ActionEvent; > +import java.awt.event.ActionListener; > +import java.awt.event.WindowAdapter; > +import java.awt.event.WindowEvent; > +import javax.swing.*; > + > +import org.springframework.beans.factory.InitializingBean; > +import org.springframework.core.io.ClassPathResource; > + > +import org.apache.shiro.authz.AuthorizationException; > +import org.apache.shiro.samples.spring.DefaultSampleManager; > +import org.apache.shiro.samples.spring.SampleManager; > + > + > +/** > + * Simple web start application that helps to demo single sign-on and > + * remoting authorization using Shiro. The injected <tt>SampleManager</tt> > + * is hosted by the Spring sample web application and remotely invoked > + * when the buttons in this view are clicked. > + * > + * @author Jeremy Haile > + * @since 0.1 > + */ > +public class WebStartView implements ActionListener, InitializingBean { > + > + /*-------------------------------------------- > + | C O N S T A N T S | > + ============================================*/ > + > + /*-------------------------------------------- > + | I N S T A N C E V A R I A B L E S | > + ============================================*/ > + private SampleManager sampleManager; > + private JTextField valueField; > + private JButton saveButton; > + private JButton refreshButton; > + private JButton secureMethod1Button; > + private JButton secureMethod2Button; > + private JButton secureMethod3Button; > + private JFrame frame; > + > + /*-------------------------------------------- > + | C O N S T R U C T O R S | > + ============================================*/ > + > + /*-------------------------------------------- > + | A C C E S S O R S / M O D I F I E R S | > + ============================================*/ > + > + public void setSampleManager(SampleManager sampleManager) { > + this.sampleManager = sampleManager; > + } > + > + /*-------------------------------------------- > + | M E T H O D S | > + ============================================*/ > + public void afterPropertiesSet() throws Exception { > + ClassPathResource resource = new ClassPathResource("logo.png"); > + ImageIcon icon = new ImageIcon(resource.getURL()); > + JLabel logo = new JLabel(icon); > + > + valueField = new JTextField(20); > + updateValueLabel(); > + > + saveButton = new JButton("Save Value"); > + saveButton.addActionListener(this); > + > + refreshButton = new JButton("Refresh Value"); > + refreshButton.addActionListener(this); > + > + JPanel valuePanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); > + valuePanel.add(valueField); > + valuePanel.add(saveButton); > + valuePanel.add(refreshButton); > + > + secureMethod1Button = new JButton("Method #1"); > + secureMethod1Button.addActionListener(this); > + > + secureMethod2Button = new JButton("Method #2"); > + secureMethod2Button.addActionListener(this); > + > + secureMethod3Button = new JButton("Method #3"); > + secureMethod3Button.addActionListener(this); > + > + JPanel methodPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); > + methodPanel.add(secureMethod1Button); > + methodPanel.add(secureMethod2Button); > + methodPanel.add(secureMethod3Button); > + > + frame = new JFrame("Apache Shiro Sample Application"); > + frame.setSize(500, 200); > + > + Container panel = frame.getContentPane(); > + panel.setLayout(new BorderLayout()); > + panel.add(logo, BorderLayout.NORTH); > + panel.add(valuePanel, BorderLayout.CENTER); > + panel.add(methodPanel, BorderLayout.SOUTH); > + > + frame.setVisible(true); > + frame.addWindowListener(new WindowAdapter() { > + public void windowClosing(WindowEvent e) { > + System.exit(0); > + } > + }); > + } > + > + private void updateValueLabel() { > + valueField.setText(sampleManager.getValue()); > + } > + > + public void actionPerformed(ActionEvent e) { > + try { > + > + if (e.getSource() == saveButton) { > + sampleManager.setValue(valueField.getText()); > + > + } else if (e.getSource() == refreshButton) { > + updateValueLabel(); > + > + } else if (e.getSource() == secureMethod1Button) { > + sampleManager.secureMethod1(); > + JOptionPane.showMessageDialog(frame, "Method #1 successfully > called.", "Success", JOptionPane.INFORMATION_MESSAGE); > + > + } else if (e.getSource() == secureMethod2Button) { > + sampleManager.secureMethod2(); > + JOptionPane.showMessageDialog(frame, "Method #2 successfully > called.", "Success", JOptionPane.INFORMATION_MESSAGE); > + } else if (e.getSource() == secureMethod3Button) { > + sampleManager.secureMethod3(); > + JOptionPane.showMessageDialog(frame, "Method #3 successfully > called.", "Success", JOptionPane.INFORMATION_MESSAGE); > + > + } else { > + throw new RuntimeException("Unexpected action event from > source: " + e.getSource()); > + } > + > + } catch (AuthorizationException ae) { > + JOptionPane.showMessageDialog(frame, "Unauthorized to perform > action: " + ae.getMessage(), "Unauthorized", JOptionPane.WARNING_MESSAGE); > + } > + } > + > + public static void main(String[] args) throws Exception { > + WebStartView test = new WebStartView(); > + test.setSampleManager(new DefaultSampleManager()); > + test.afterPropertiesSet(); > + } > + > + > +} > > Added: incubator/shiro/trunk/samples/spring-client/src/main/resources/logo.png > URL: > http://svn.apache.org/viewvc/incubator/shiro/trunk/samples/spring-client/src/main/resources/logo.png?rev=911722&view=auto > ============================================================================== > Binary file - no diff available. > > Propchange: > incubator/shiro/trunk/samples/spring-client/src/main/resources/logo.png > ------------------------------------------------------------------------------ > svn:mime-type = application/octet-stream > > Added: > incubator/shiro/trunk/samples/spring-client/src/main/resources/webstart.spring.xml > URL: > http://svn.apache.org/viewvc/incubator/shiro/trunk/samples/spring-client/src/main/resources/webstart.spring.xml?rev=911722&view=auto > ============================================================================== > --- > incubator/shiro/trunk/samples/spring-client/src/main/resources/webstart.spring.xml > (added) > +++ > incubator/shiro/trunk/samples/spring-client/src/main/resources/webstart.spring.xml > Fri Feb 19 07:25:50 2010 > @@ -0,0 +1,42 @@ > +<?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. > + --> > +<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" > "http://www.springframework.org/dtd/spring-beans.dtd"> > + > +<!-- > + - Application context for Shiro WebStart sample application > + --> > +<beans> > + > + <bean id="webStartView" > + class="org.apache.shiro.samples.spring.ui.WebStartView"> > + <property name="sampleManager" ref="sampleManager"/> > + </bean> > + > + <bean id="sampleManager" > + > class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean"> > + <property name="serviceUrl" > value="http://localhost:8080/shiro-spring/remoting/sampleManager"/> > + <property name="serviceInterface" > value="org.apache.shiro.samples.spring.SampleManager"/> > + <property name="remoteInvocationFactory" > ref="secureRemoteInvocationFactory"/> > + </bean> > + > + <bean id="secureRemoteInvocationFactory" > + > class="org.apache.shiro.spring.remoting.SecureRemoteInvocationFactory"/> > + > +</beans> > > >
