"Dale V. Georg" wrote:
>
> We have built a J2EE application with a Swing GUI Rich Client (using the
> J2EE
> Reference Implementation application client container).  When we added
> security
> to the EJBs, we found that if you call an EJB from a Swing event handler
> the
> security context is lost and the EJB container believes you to be guest.
> However, if you make the call from the main method, or a separate thread
> started from the main method, the security principal is propagated
> correctly.
>
> The output and code is included below.  If anyone has seen anything like
> this
> before and knows why it may be happening, or better yet, what we can do
> to make
> it stop happening, your help would be greatly appreciated.

<vendor>

Try Sybase EAServer. We allow the client's credentials to be associated
with the object references instead of the client's threads, thereby
avoiding these problems.

</vendor>

> Regards,
> Brett Beaumont
> Dale V. Georg
>
> ================================
>    Dale V. Georg
>    Technical Manager
>    Indus Consultancy Services
>    [EMAIL PROTECTED]
>    (201) 261-3100 x229
> ================================
>
> ========= Output ==========
>
> Initiating login ...
> Looking up authenticator...
> Binding name:`java:comp/env/com.ics.test.testAHome`
> Running in this thread
> bbeaumo
> Running in another thread
> bbeaumo
>
> Now testing GUI
>
> Button pressed
> guest
>
> Button pressed
> guest
> Out of wait loop
> bbeaumo
> Unbinding name:`java:comp/env/com.ics.test.testAHome`
>
> =========== Client program (Class1Client.java) ============
>
> package com.ics.test;
>
> import java.util.Properties;
> import javax.naming.*;
> import javax.ejb.*;
> import java.rmi.*;
> import java.sql.SQLException;
>
> import javax.swing.*;
> import java.awt.*;
> import java.awt.event.*;
>
> /**
>  * This package is EJB-part of project. It must contain the following:
>  * @Class com.ics.test.testAHome.java
>  * @Class com.ics.test.testA.java
>  */
> public class Class1Client extends WindowAdapter implements
> Runnable,ActionListener  {
>
>     private testAHome home;
>
>     /** Invoked when the button is pressed, this method callls the
>      *  body of the client
>      *
>      *  @param e Event
>      **/
>     public void actionPerformed(ActionEvent e) {
>         System.out.println("\nButton pressed");
>         try {
>             body();
>         } catch(Exception ex) {
>             System.out.println("Exception in body on button press");
>         }
>     }
>
>     /** Notifies the client that the main window has been closed
>      *
>      *  @param e Event
>      **/
>     public synchronized void windowClosed(WindowEvent e) {
>         this.notify();
>     }
>
>     /** This method is required so that the the main method doesn't
>      *  exit until the main window is closed
>      **/
>     public synchronized void waitForAWhile() {
>         try
>         {
>             this.wait();
>         } catch(Exception e) {
>             System.out.println("Interrupted");
>         }
>     }
>
>     /** Initialise the client.  Looks up the home interface of the EJB
> **/
>     public Class1Client() throws NamingException {
>         home = lookupHome();
>     }
>
>     /** Main method
>      *
>      *  @param argv The command line parameters
>      **/
>     public static void main(String[] argv) {
>
>         // Create a client object
>         Class1Client client = null;
>         try {
>             client = new Class1Client();
>         }
>         catch(Exception e) {
>             System.out.println("Exception creating client : " +
> e.getMessage());
>             System.exit(0);
>         }
>
>         try {
>             // Test security propagation from current thread - succeeds
>             System.out.println("Running in this thread");
>             client.body();
>
>             // Test security propagation from user created thread -
> succeeds
>             System.out.println("Running in another thread");
>             Thread t = new Thread(client);
>             t.start();
>             t.join();
>
>             // Test security propagation from Swing GUI - fails
>             System.out.println("\n\nNow testing GUI");
>             client.makeWindow();
>             client.waitForAWhile();
>
>             // After window is closed, check if we can still propagate
> the
>             // security context to the EJB container - succeeds
>             System.out.println("Out of wait loop");
>             client.body();
>
>         } catch (Exception e) {
>             e.printStackTrace();
>         }
>     }
>
>     /** Method used to test running EJBs from a normal thread **/
>     public void run()  {
>         try {
>             body();
>         } catch(Exception e) {
>             System.out.println("Exception while running in second
> thread");
>         }
>     }
>
>     public void body() throws CreateException, RemoteException,
> RemoveException, SQLException, NamingException {
>         // Create the EJB
>         com.ics.test.testA ejb = home.create();
>
>         // Print out who the bean thinks I am
>         System.out.println(ejb.whoAmI());
>         ejb.remove();
>     }
>
>     /** Looks up the home interface of the test EJB
>      *
>      *  @return Home interface of the testA EJB
>      **/
>     private testAHome lookupHome() throws NamingException {
>         Context ctx = getInitialContext();
>         com.ics.test.testAHome home = null;
>         try {
>             home = (com.ics.test.testAHome) ctx.lookup
> ("com.ics.test.testAHome");
>         } catch (NamingException e) {
>             e.printStackTrace();
>         }
>         return home;
>     }
>
>     /** Narrows the class **/
>     private Object narrow(Object obj, Class c) {
>         return javax.rmi.PortableRemoteObject.narrow(obj, c);
>     }
>
>     /** Retrieves the initial context
>      *
>      *  @return The initial context
>      **/
>     private Context getInitialContext() throws NamingException {
>         Context ctx = null;
>         try {
>             ctx = new InitialContext();
>         } catch (NamingException e) {
>             e.printStackTrace();
>         }
>         return ctx;
>     }
>
>     /** Creates a simpe test window  **/
>     public void makeWindow() {
>         // Create the window and its components
>         JFrame frame = new JFrame("Test Window");
>         JButton button = new JButton("Test");
>
>         // Add the event listeners
>         button.addActionListener(this);
>
> frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
>         frame.addWindowListener(this);
>
>         // Prepare window for display
>         frame.getContentPane().add(button);
>         frame.pack();
>         frame.show();
>     }
>
> }
>
> ========= TestA EJB - Home Interface (TestAHome.java) =============
> package com.ics.test;
>
> import javax.ejb.*;
> import java.rmi.RemoteException;
>
> public interface testAHome extends EJBHome {
>    public testA create() throws RemoteException, CreateException;
>
> }
>
> ========= TestA EJB - Remote Interface (TestA.java) ===============
> package com.ics.test;
>
> import javax.ejb.*;
> import java.rmi.RemoteException;
>
> public interface testAHome extends EJBHome {
>    public testA create() throws RemoteException, CreateException;
>
> }
>
> ========== TestA EJB - Bean Implementation (testABean.java) =========
>
> package com.ics.test;
>
> import javax.ejb.*;
> import javax.naming.*;
> import java.rmi.RemoteException;
>
> /**
>  * @ejbStateful Stateful
>  */
> public class testABean implements SessionBean {
>     private SessionContext ctx;
>     private transient boolean isDirty;
>     private transient boolean verboseMode = true;
>
>    /**
>     * Sets session context for bean
>     */
>     public void setSessionContext(SessionContext context) throws
> RemoteException {
>         if (verboseMode) System.out.println("Bean "+id()+";
> setSessionContext
> called");
>         ctx = context;
>     }
>
>    /**
>     * Called when bean is activated
>     */
>     public void ejbActivate() throws RemoteException {
>         if (verboseMode) System.out.println("Bean "+id()+"; ejbActivate
> called");
>     }
>
>    /**
>     * Called when bean is activated
>     */
>     public void ejbPassivate() throws RemoteException {
>         if (verboseMode) System.out.println("Bean "+id()+"; ejbPasivate
> called");
>     }
>
>    /**
>     * Remove bean
>     */
>     public void ejbRemove() throws RemoteException {
>         setModified(false);
>     }
>
>    /**
>     * Create method
>     */
>     public void ejbCreate() throws RemoteException, CreateException {
>     }
>
>     public int id() {
>         return System.identityHashCode(this);
>     }
>
>    /**
>     * Returns true if the bean was modified
>     */
>     public boolean isModified() {
>         return isDirty;
>     }
>
>    /**
>     * Sets whether the bean was modified
>     */
>     public void setModified(boolean flag) {
>         isDirty = flag;
>     }
>
>      public String whoAmI() {
>         return ctx.getCallerPrincipal().getName();
>     }
>
> }
>
> ===========================================================================
> To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
> of the message "signoff EJB-INTEREST".  For general help, send email to
> [EMAIL PROTECTED] and include in the body of the message "help".

--
________________________________________________________________________________

Evan Ireland              Sybase EAServer Engineering        [EMAIL PROTECTED]
                            Wellington, New Zealand               +64 4 934-5856

===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff EJB-INTEREST".  For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".

Reply via email to