web2py – Implementando o login único em 10 passos de duas maneiras diferentes

web2py – Implementando o login único em 10 passos de duas maneiras diferentes

A Rede Kolaborativa vem sendo construída em web2py, um framework da linguagem Python, pouco (nem tanto) conhecido, porém muito eficiente. Esse processo que, aparentemente, segue bastante produtivo encontrou um impasse: precisamos que um único cadastro efetue o login em todas as aplicações. Mas como? Bom, esse tipo de informação não é fácil de se encontrar na internet ou, sequer, na documentação. Por isso requer pesquisas (uma pilha delas) e um teste atrás do outro. Portanto, eis que vem a imagem divina (eu) para mostrar a resposta de uma forma mais fácil.

Requisitos do Sistema: Obviamente, se você quer um login único, você deve ter, no mínimo, duas aplicações no web2py. Para efeitos de exemplo, chamaremos a aplicação principal de Principal e a secundária de Outra (não, eu não sou um babuíno, mas Outra é mais simples que Secundaria).

Comprovadamente (eu comprovei), existem pelo menos duas formas fáceis de realizar um login único. A primeira é o CAS (Central Authentication Service) do próprio web2py. Ele irá utilizar todos os formulários de registro, login, recuperação de senha, etc. da aplicação Principal para ambas as aplicações, assim como seu banco de dados. Portanto, você será sempre redirecionado para a aplicação Principal para fazer o registro/login e depois redirecionado de volta à aplicação Outra.

Para utilizar o CAS:

1. Acesse o arquivo db.py nos models (modelos) da aplicação Outra.

2. Altere a linha que contém
auth = Auth(db)
para
auth = Auth(db,cas_provider = 'http://localdaapp/Principal/default/user/cas')

O que você está fazendo nesse passo é, simplesmente, indicar onde o usuário deverá fazer seu registro/login/etc. Então, se você está testando localmente, por exemplo, o local da aplicação deverá ser substituído pelo localhost, mas se está em um domínio específico, o local da aplicação deverá ser substituído pelo domínio.
Observe: auth = Auth(db,cas_provider = 'http://divindade.com/Principal/default/user/cas')

3.

4.

5.

6. *Tosse*

7.

8.

9.

10. Por que você está me olhando? Sou divina, mas não faço sua aplicação se testar sozinha. Vai na fé e testa logo essa aplicação. No final, admire a praticidade do web2py e agradeça a força maior que te fez conhecer esse framework.

Agora, se você está curioso sobre a segunda forma de tornar o login único, continue lendo.

É bastante simples você chegar à conclusão de que seria muito prático também, e até mais conveniente, compartilhar o banco de dados em que os usuários estão cadastrados e garantir que, não importa em qual aplicação eles irão realizar os registros, todos eles serão gravados no mesmo banco de dados.

Compartilhando banco de dados:

1. Acesse a aplicação Principal e no arquivo db.py nos models (modelos) crie uma nova conexão, ou seja, um novo banco de dados. Por quê? Porque, para não compartilharmos todas as tabelas existentes em cada aplicação, vamos criar um banco de dados específico para os registros de usuários. Dessa forma, se na aplicação Principal eu tenho uma tabela de Projetos que não é nem um pouco necessária na aplicação Outra, a aplicação Outra não terá acesso a ela. Então, criemos nosso segundo banco de dados:
db = DAL('sqlite://storage.sqlite',pool_size=1,check_reserved=['all'])
#logo abaixo do db existente criaremos o novo
auth_db = DAL('sqlite://users.sqlite')

Se você utiliza um banco de dados externo, que não o sqlite, use sua string de conexão própria. Por exemplo:
auth_db = DAL('mongodb://:@servidor.mongohq.com:10043/meudb')

2. Altere a linha que contém
auth = Auth(db)
para
auth = Auth(auth_db).
Assim, usaremos o Auth no nosso novo banco de dados.

3. Acesse agora a aplicação Outra e no arquivo db.py nos models (modelos) crie uma nova conexão ligada ao banco de dados utilizado na aplicação Principal.
Se você utiliza o sqlite padrão do web2py, poderá especificar a conexão a partir do seu diretório:
auth_db = DAL('sqlite://users.sqlite', folder='/home/voce/web2py/applications/Principal/databases/')
O nome do banco de dados na string de conexão deve ser o mesmo do banco de dados da aplicação Principal que você irá compartilhar e o conteúdo de folder é o caminho para a pasta de banco de dados da aplicação Principal que está no web2py.
Já se você utiliza outra banco de dados a partir de uma string de conexão que irá realizar seu acesso exterior ao web2py, basta repetir a string de conexão utilizada na aplicação Principal:
auth_db = DAL('mongodb://:@servidor.mongohq.com:10043/meudb')

4. Altere a linha que contém
auth = Auth(db)
para
auth = Auth(auth_db), não se esqueça.
Precisamos garantir que o Auth use o banco de dados que separamos só para ele com todo o carinho.

5.

6.

7. Você não vai me fazer repetir aquilo, vai?

8.

9.

10. Bom, esse foi um pouco mais longo, mas não é tão complicado assim, é? Como eu disse antes, admire a praticidade do web2py e, dessa vez, o benefício de poder usar as páginas de registro/login/etc. de cada aplicação ainda salvando os dados em uma mesma tabela, em um mesmo banco de dados.

Simples assim, está tudo resolvido. Mas você deve ter notado que isso não garante que um usuário que fez o login na aplicação Principal continuará logado na Outra ou vice-versa. Para que isso aconteça, é necessário compartilhar sessões. Como? Vamos lá…

Há uma pequena linha de código no web2py que irá fazer com que as sessões sejam gravadas no banco de dados de uma aplicação e permitirá que outra acesse essas sessões para ver se o usuário está logado e, caso esteja, fazer com que ele permaneça logado mesmo mudando de aplicação. Eis que surge, como um milagre, essa linha:
session.connect(request, response, tablename = 'sessions')

Ela deverá ser inserida no arquivo db.py nos models (modelos) da aplicação Principal, logo abaixo da declaração da conexão ao banco de dados. Assim:
db = DAL('sqlite://storage.sqlite',pool_size=1,check_reserved=['all'])
auth_db = DAL('sqlite://users.sqlite')
session.connect(request, response, tablename='sessions')

Isso irá registrar as sessões e o campo mais peculiar ali, o tablename, dará um nome personalizado a essa tabela. Ainda assim, ele não é obrigatório.

Essa mesma linha deverá ser copiada no arquivo db.py nos models (modelos) da aplicação Outra, no mesmo local, com apenas uma alteração:
db = DAL('sqlite://storage.sqlite',pool_size=1,check_reserved=['all'])
auth_db = DAL('sqlite://users.sqlite', folder='/home/voce/web2py/applications/Principal/databases/')
session.connect(request, response, masterapp = 'Principal')

Nesse caso, o campo masterapp indica com qual aplicação a Outra deverá receber/compartilhar as informações de session. Esse sim é obrigatório se você deseja que isso funcione.

Tudo feito. Suas aplicações deverão manter o login efetuado mesmo alternando de uma aplicação para outra.

Observação: é recomendável utilizar migrate=False na definição das tabelas do Auth no arquivo db.py de ambas as aplicações, para garantir a compatibilidade nesse compartilhamento de tabelas, tanto de sessions quanto de usuários.
auth.define_tables(username=False, signature=False, migrate=False)

Por motivos de curiosidade extrema, continue lendo.

Se você tem uma tabela já preenchida com usuários e deseja compartilhá-la com outra aplicação que também já possui usuários, você pode exportar os dados de uma aplicação para outra de forma simples, mantendo todos os dados cadastrados em apenas uma tabela que poderá ser compartilhada. Veja só:

1. Acesse o appadmin de uma aplicação (http://localhost:8000/Outra/appadmin/index) e você verá uma lista de tabelas.
2. Acesse uma das tabelas, no caso auth_user, e você terá uma lista de registros e, logo abaixo, a opção Importar/Exportar.
3. Clicando em ‘exportar como um um csv’, você fará o download desses registros.
4. Acesse o appadmin da aplicação que você deseja inserir esses registros (http://localhost:8000/Principal/appadmin/index) e a respectiva tabela que receberá os registros.
5. Importe esse arquivo baixado clicando em ‘import’ após ter especificado o arquivo a ser inserido.

BOOM! Seus registros foram inseridos e agora você pode compartilhar essa tabela sem problemas.

Esse post (enorme, diga-se de passagem) acaba aqui. Agora você sabe duas formas diferentes de tornar um login único entre aplicações, como compartilhar sessões e manter o usuário logado nas diferentes aplicações e como transferir registros (mesmo os criptografados, com senhas) sem perder nenhum dado de uma aplicação para outra. Você com certeza está feliz com o web2py e seu usuário, com certeza absoluta, está mais feliz com você. Você também deveria se sentir mais feliz consigo mesmo, agora que você é quase tão divino quanto eu. Aceito elogios e, se você conseguiu, comente para que eu possa particularmente te parabenizar. Aguardem próximos posts sobre coisas que descobrimos com a vida e com o web2py!

Author Description

Julia Rizza

Ensino mediana, coruja e pythonista de 16 anos. Ocupo a maior parte da minha vida com coisas produtivas, ou é o que parece. Por isso sou interessada em desenvolver as oito maravilhas da internet; interesse diferente da maioria das pessoas, ou seja, sou quase evoluída.

There are 13 comments. Add yours

  1. 11th novembro 2013 | erichideki says: Responder
    Parabéns Júlia, fico feliz em saber que seus esforços já estão rendendo bons trabalhos e conteúdos. Grande abraço!
    • 11th novembro 2013 | Júlia Rizza says: Responder
      Obrigada, Eric! Fico muito contente com isso e com o apoio. Vou continuar assim e, quem sabe, um dia faça posts tão bons quanto os seus! haha Abraços!
  2. 11th novembro 2013 | Mazulo says: Responder
    Parabéns mesmo menina Rizza! Isso mostra o futuro grandioso que te espera. :D
    • 11th novembro 2013 | Júlia Rizza says: Responder
      Muito obrigada! Aguardo ansiosamente esse futuro :D haha Abraços!
  3. 11th novembro 2013 | rochacbruno says: Responder
    Muito bom! parabéns pelo tutorial! se me permite, irei usa-lo como referencia em minha próxima turma de web2py em Janeiro! (darei os devidos créditos)
    • 11th novembro 2013 | Júlia Rizza says: Responder
      Muito obrigada! Tem toda a permissão do mundo, mestre :D haha Sem problemas! É muito bom poder compartilhar conhecimento e ser reconhecida por quem mais me serviu de exemplo durante toda a minha jornada com o web2py. Fico muito feliz, de verdade!
  4. 12th novembro 2013 | R4bugento says: Responder
    Muito bom Júlia. O post ficou ótimo ;)
    • 12th novembro 2013 | Júlia Rizza says: Responder
      Obrigada pessoinha legal :P Sua vez de fazer um post sobre o web2py agora!
  5. 8th abril 2014 | Thiago says: Responder
    muito legal parabens pelo post julia !
  6. 18th março 2015 | Elisio says: Responder
    Voce ja evoluiu mais? rsrsrsrs

Join the Conversation