manolegal 12 Denunciar post Postado Novembro 24, 2011 Olá Amigos. O problema é o seguinte. Tenho 02 sistemas totalmente distintos um do outro. Ambos possuem controle de acesso, com login. Estou trabalhando com sessoes. Acesso o primeiro programa normalmente digitando login e senha. Ao tentar acessar o segundo programa, em outr aba do navegador, ele acessa direto sem exigir login. Imagino que o problema seja a questao de ja ter a sessao ativa do primeiro sistema. Como faço para solucionar este problema, e exigir o login ao acessar o segundo programa? Valeu. Compartilhar este post Link para o post Compartilhar em outros sites
Leandro Chaves 0 Denunciar post Postado Novembro 24, 2011 Eu costumo tratar a sessão assim: $_SESSION['APLICACAOX']['LOGIN']= $var_login; Pra evitar esse tipo de problema Compartilhar este post Link para o post Compartilhar em outros sites
hufersil 145 Denunciar post Postado Novembro 25, 2011 Você pode trabalhar com o conceito de armazenamento de dados. Exemplo simples: Criar uma interface de acesso a dados Implementar a interface Fazer com que suas controllers/paginas acessem sempre atraves da interface Trabalhar com injeção de dependencia para facilitar a manutenção Com essa listinha simples acima, temos as implementações abaixo: Criar uma interface de acesso a dados /** * Interface para trabalharmos com armanzenamento de dados * * @author Hugo Ferreira da Silva */ interface DataStorage { /** * Recupera uma informacao * @param string $key nome da chave * @return mixed */ function get($key); /** * Verifica se um determinado valor existe na sessao com uma determinada chave * * @param string $key */ function has($key); /** * Armazena uma informacao * @param string $key Nome da chave * @param mixed $value Valor a ser armazenado */ function set($key, $value); /** * Limpa uma informacao * @param string $key Nome da chave */ function clear($key); /** * Destroi as informacoes */ function destroy(); /** * Altera a informacao sobre onde ficarao os dados * @param string $dataSource */ function setDataSourceName($dataSourceName); /** * Recupera a informacao sobre onde ficarao os dados */ function getDataSourceName(); } Implementar a interface Como neste caso precisamos armazenar os dados na sessão do PHP, vamos utilizar a propriedade dataSourceName como um escopo de sessão (Exemplos: admin, site, blog). Assim, isolamos as informações pelo escopo informado. /** * Implementacao de DataStorage, para utilizar a sessao do PHP * * @author Hugo Ferreira da Silva */ class SessionStorage implements DataStorage { /** * Nesta implementacao, nome do escopo da sessao * @var string */ private $dataSourceName; /** * Flag para indicar se a sessao ja foi iniciada * @var boolean */ private static $sessionStarted = false; /** * Construtor * * @param string $dataSourceName */ public function __construct($dataSourceName){ if(!self::$sessionStarted){ session_start(); self::$sessionStarted = true; } $this->setDataSourceName($dataSourceName); } /** * Recupera uma informacao * @param string $key nome da chave * @return mixed */ public function get($key){ return $this->has($key) ? $_SESSION[$this->getDataSourceName()][$key] : null; } /** * Verifica se um determinado valor existe na sessao com uma determinada chave * * @param string $key */ public function has($key){ return isset($_SESSION[$this->getDataSourceName()][$key]); } /** * Armazena uma informacao * @param string $key Nome da chave * @param mixed $value Valor a ser armazenado */ public function set($key, $value){ $_SESSION[$this->getDataSourceName()][$key] = $value; } /** * Limpa uma informacao * @param string $key Nome da chave */ public function clear($key){ unset($_SESSION[$this->getDataSourceName()][$key]); } /** * Destroi as informacoes */ public function destroy(){ $_SESSION[$this->getDataSourceName()] = array(); } /** * Altera a informacao sobre onde ficarao os dados * @param string $dataSource */ public function setDataSourceName($dataSourceName){ $this->dataSourceName = $dataSourceName; } /** * Recupera a informacao sobre onde ficarao os dados */ public function getDataSourceName(){ return $this->dataSourceName; } } Fazer com que suas controllers/paginas acessem sempre atraves da interface Trabalhar com injeção de dependencia para facilitar a manutenção Criamos uma controller base, que recebe como argumento no construtor uma instância de uma classe que implemente DataStorage. Desta forma, fazemos que se amanhã ou depois precisarmos implementar uma "FileStorage", nossa classe continua funcionando normal. /** * Controller de testes para exibir um exemplo simples de injecao de dependencia * e isolamento de sessao * * @author Hugo Ferreira da Silva */ class BaseController { /** * armazenamento de dados * @var DataStorage */ protected $dataStorage; /** * Construtor * * @param DataStorage $dataStorage */ public function __construct(DataStorage $dataStorage){ $this->dataStorage = $dataStorage; } /** * Exemplo de funcao para exibir o isolamento de dados * Simplesmente coloca o nome da classe na sessao, com a chave "nome", * e logo em seguida a exibe. */ public function teste(){ if(!$this->dataStorage->has('nome')){ $this->dataStorage->set('nome', get_class($this)); } echo $this->dataStorage->get('nome'), '<br />'; } } Este é só um exemplo bem simples de injeção de dependência. Este tipo de informação (de qual implementação usar) poderia ser colocado em outra parte, como uma de configuração por exemplo. Testando a bagaça toda: //////////////////////////////////////////////////////// // // Controllers diferentes para podermos testar nossa // implementação // //////////////////////////////////////////////////////// class SiteController extends BaseController {} class AdminController extends BaseController {} // instanciando as controllers $siteController = new SiteController(new SessionStorage('site')); $adminController = new AdminController(new SessionStorage('admin')); // testando o isolamento da sessao $siteController->teste(); $adminController->teste(); O resultado esperado no navegador é: SiteController AdminController @braços e fique com Deus. Compartilhar este post Link para o post Compartilhar em outros sites
manolegal 12 Denunciar post Postado Janeiro 3, 2012 Obrigado Leandro e hufersil. Imagino que o código proposto pelo hufersil ainda seja muito avançado para meus conhecimentos, mas possivelmente futuramente irei utilizá-lo. Em relaçao as colocações do Leandro imagino que seria: $_SESSION['nome_do_sistema']['LOGIN']= $var_login; Eu costumo usar da seguinte forma: $login = $_SESSION["login"]; Na verdade eu tenho um dominio. Exemplo: www.teste.com.br. E aí tenho os "diretorios" que seriam sistemas distintos. Exemplo: www.teste.com.br/teste1 - seria um sistema, com acesso de vários usuários www.teste.com.br/teste2 - seria outro sistema, com acesso de outros vários usuários. Se eu logar o www.teste.com.br/teste1 com um usuário e depois abrir outra aba e digitar www.teste.com.br/teste2, terei acesso tambem a este sistema, mesmo nao sendo usuario deste último sistema. Imagino que o problema esteja nas Sessões. Espero ajuda dos amigos. Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Janeiro 3, 2012 Olha, apesar dos estudos profundos que fiz sobre Sessions uns meses atrás, ainda não cavei nem um buraquinho de osso sobre assunto. :o Por isso que é apenas uma teoria. Como você não postou código de como está fazendo posso imaginar que suas sessões não tem nome personalizado, certo? Se você não sabe, veja se em seu código existe uma chamada à session_name() Como eu cheguei à esse ponto? Veja. No manual diz, com respeito ao argumento passado: The session name references the name of the session, which is used in cookies and URLs (e.g. PHPSESSID). It should contain only alphanumeric characters; it should be short and descriptive (i.e. for users with enabled cookie warnings). If name is specified, the name of the current session is changed to its value. Numa tradução livre, apenas da parte que interessa´para o assunto (em negrito) temos: Nome da sessão ao qual a Sessão se referirá, que será usado em cookies e URL's Essa função altera, em tempo de execução, um valor padrão, chamado PHPSESSID, definido na diretiva session.name do PHP.INI. Está acompanhando aonde quero chegar? Se não vamos ver... Aplicação A :seta: Define Sessão sem nome :seta: O nome da sessão vai ser PHPSESSID Aplicação B :seta: Define Sessão sem nome :seta: O nome da sessão vai ser PHPSESSID Aplicação C :seta: Define Sessão sem nome :seta: O nome da sessão vai ser PHPSESSID E por aí vai. Quando há uma autenticação na Aplicação A, uma sessão chamada PHPSESSID é definida e quando a Aplicação B vai verificar se os dados de sessão existem (para requisitar autenticação caso contrário), por não ter um nome próprio, busca sob PHPSESSID também e, por encontrar, faz o login automático. Você tem algumas possíveis soluções: - Passar a usar session_name(), definindo um nome diferente para cada aplicação - Trocar os nomes das variáveis de sessão criadas. Ao invés de sempre $_SESSION['login'], passar a usar $_SESSION['login'] em uma, $_SESSION['auth'] em outra... Sentiu o cheiro da gambiarra? :P - Utilizar uma forma de armazenamento para Sessões diferente para cada aplicação. A Aplicação A usa os arquivos (padrão), a Aplicação B usa um banco de dados SQLite, a Aplicação C armazena tudo em Memcache. Essa última, além de não ser uma boa pedida para esse caso, afinal a intenção que se tem ao diferenciar a forma de armazenamento das Sessões visa unicamente melhorias de performance, já que existem métodos melhores (e piores) em termos de velocidade do que os arquivos (noSQL, por exemplo), ainda acarreta uma alteração que, talvez você não esteja preparado para arcar (com base em sua última resposta). Tudo isso foi escrito aqui e agora. Nem testar eu testei, apenas formulei uma teoria e expus. Espero que esteja certa e que te ajude de alguma forma. Compartilhar este post Link para o post Compartilhar em outros sites
führ 0 Denunciar post Postado Janeiro 23, 2012 Prezados amigos do forum! Tive um problema identico e resolvi da seguinte maneira: SISTEMA AA ou meudominio.com.br/sistema_aa if (!isset($_SESSION)) session_start(); $_SESSION["id_usuario_AA"] = $id; $_SESSION["login_AA"] = $login; SISTEMA AB ou meudominio.com.br/sistema_ab if (!isset($_SESSION)) session_start(); $_SESSION["id_usuario_AB"] = $id; $_SESSION["login_AB"] = $login; e assim por diante... Tenho pouca experiencia em php, se tiver algo errado me corrijam! Compartilhar este post Link para o post Compartilhar em outros sites
manolegal 12 Denunciar post Postado Fevereiro 10, 2012 Fiz da seguinte forma: $_SESSION[teste_1']['login']= $login; $_SESSION[teste_2']['login']= $login; Aparentemente funcionou. Se alguém tiver alguma colaboração, agradeço. Valeu. Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Fevereiro 10, 2012 Veja se a primeira possível solução mostrada no post #6 é de fato uma solução ou apenas um devaneio de minha parte. Compartilhar este post Link para o post Compartilhar em outros sites
manolegal 12 Denunciar post Postado Fevereiro 11, 2012 Olá Bruno Seria mais ou menos assim? $login = $_SESSION["login"]; $login = session_name("login_teste_1"); Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Fevereiro 11, 2012 Ao contrário. session_name() deve ser invocado antes de definir as sessões. Na verdade, deve ser chamado antes mesmo de session_start(). Compartilhar este post Link para o post Compartilhar em outros sites
manolegal 12 Denunciar post Postado Fevereiro 11, 2012 Assim entao? $login = session_name("login_teste_1"); session_start(); Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Fevereiro 12, 2012 Eu não testei porque no momento não tenho duas ou mais aplicações que compartilhem da mesma Sessão. Mas teste eveja se funciona. Um detalhe, a menos que você vá usar o termo passado para session_name() mais adiante no script, na há necessidade de atribuí-lo à uma variável. :thumbsup: Compartilhar este post Link para o post Compartilhar em outros sites