Autenticação usando Flex

Boa noite amigos,

Desenvolvi uma tela de login utilizando Flex integrado a Java via BlazeDS. Utilizei Spring e Hibernate.

Vejam:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
			   xmlns:s="library://ns.adobe.com/flex/spark"
			   xmlns:mx="library://ns.adobe.com/flex/mx"
			   xmlns:valueObjects="model.valueObjects*"
			   xmlns:services="services.*"
			   xmlns:valueObjects1="model.valueObjects.*"
			   minWidth="955" minHeight="600" currentState="autenticacao">

	<s:states>
		<s:State name="autenticacao"/>
	</s:states>
	
	<fx:Script>
		<![CDATA[
			
			
			import mx.controls.Alert;
			import mx.rpc.events.ResultEvent;
			protected function tenteLogin_resultHandler(result: ResultEvent):void
			{
		
				if(result.result as Boolean==true){
					Alert.show("Autenticado","Autenticou?");
					
				}else{
					Alert.show("NÃO Autenticado","Autenticou?");
				}
			}
			
			protected function logar():void
			{
				tenteLogin.token=usuarioService.autentica(usuario);
			}
		]]>
	</fx:Script>
	
	<fx:Declarations>
		<valueObjects1:UsuarioVO id="usuario"/>
		<services:UsuarioService id="usuarioService"/>
		<s:CallResponder id="tenteLogin" result="tenteLogin_resultHandler(event)"/>
		
		<!--Validadores-->
		<mx:EmailValidator id="val1" property="text" required="true" source="{email}"
						   trigger="{btLogin}" triggerEvent="click"/>
		<mx:Validator id="val2" property="text" required="true" source="{pass}" trigger="{btLogin}"
					  triggerEvent="click"/>

		
	</fx:Declarations>
	<s:Panel width="303" height="191" horizontalCenter="-1" title="Autenticação" verticalCenter="4">
		<s:Button id="btLogin" x="225" y="129" label="Login">
			<s:click>
				<![CDATA[
					if(Validator.validateAll(new Array(val1,val2)).length==0)
					{
						logar();
					}else
					{
						errorMessage.text="Corriga os erros apresentados";
					}
				
				
				
				]]>
			</s:click>
		</s:Button>
		<s:Label id="errorMessage" x="20" y="130" width="197" color="#F82217" fontWeight="bold"/>
		<s:Label x="38" y="40" fontWeight="bold" text="email:"/>
		<s:Label x="38" y="76" fontWeight="bold" text="password:"/>
		<s:TextInput id="email" x="109" y="31"/>
		<s:TextInput id="pass" x="109" y="69"/>
	</s:Panel>
</s:Application>

Minha dúvida, preciso salvar o objeto USUARIO que é o que de fato autenticou numa camada para que as outras janelas saibam quem está logado. Como posso fazer isso?

O que vocês me sugerem?

Abraços

Tiago,
Utiliza o pattern Singleton http://fabiophx.blogspot.com/2009/05/metodo-construtor-singleton.html

[]s
Fabio da Silva

Obrigado Fabio,

Um outro colega me sugeriu a seguinte implementação:

    [Bindable]
    public class VariaveisGlobais {
        private static var instance:VariaveisGlobais;
        
        public var currentUsuario:Usuarios;
        public static function getInstance():VariaveisGlobais {
            if (instance==null) {
                instance = new VariaveisGlobais();
            }
            return instance;
        }
    }

Vi essa como mais simples. O que você acha?

Abraço

Tiago,
Do jeito q vc colocou não impede de dar new VariaveisGlobais().
Esta q vc postou é similar (faltando o tratamento do construtor) a q postei como comentário do meu post no meu blog q coloquei antes, do Mário Santos.
Dá uma olhada no comentário do blog tb.

[]s

Também faria isso, colocaria na Application uma varíavel pública e bindable chamada usuarioLogado.

Utilizar variáveis publicas funciona perfeitamente no Application mas é o melhor para a aplicação?

Vamos dizer o seguinte, você precisa acessar essa informação em outras classes/telas da sua App, irá utilizar o FlexGlobals a todo momento?

(FlexGlobals.topLevelApplication as spark.components.Application).seuObjeto

Vamos piorar, um dia você precisa mudar o nome do teu objeto, terá que refatorar o teu código todo por causa disso.

A melhor opção é usar o singleton, nessa classe você poderá armazenar mais coisas, e não apenas o teu usuário logado no sistema.

Abraço

Não, aqui usei uma variável estatica no Application. Ficou MinhaApp.usuarioLogado.

Mas isso foi no SDK Flex 3.6, no Spark pelo visto mudou bastante.