Ah, sim. Eu já havia suposto que se usasse o código do script logout
conseguiria abortar o usuário. Mas o resultado foi parcial.

Assim que o usuário se loga pela primeira vez, eu redireciono ele para
um formulário de alteração de senha (cópia do password_form ) que vai
submeter para um script python chamado password_change_logoff. Esse
contém o context.acl_users.logout e o trecho que invalida a sessão. 

Depois que ele muda a senha ele chama o template logged_out e mostra a
mensagem: "Você não está mais autenticado". Mas a barra personal_tools
continua mostrando o id do usuário, 'preferências' e o 'sair'.

Quer dizer, ele continua autenticado.

--- Em zope-pt@yahoogrupos.com.br, "Fernando Correa Neto" <[EMAIL PROTECTED]>
escreveu
>
> Opa.
> 
> On 3/13/07, FLÁVIO GOMES DA SILVA LISBOA
> <[EMAIL PROTECTED]> wrote:
> >
> >
> >
> >
> >
> >
> > Bem, estou usando o Plone. Aliás, o grande desafio que tenho há alguns
> >  meses é aproveitar essa ferramenta e seus recursos para fazer um
> >  portal de verdade.
> >  O usuário não deve se deslogar "facilmente". Eu quero abortar o
> >  usuário, dado um evento certo, no caso, alteração da senha após
> >  primeiro acesso.
> >  Se ele realmente é orientado a objetos, então deve haver alguém para
> >  quem eu peço "por favor, deslogue". Se ele faz isso quando clico num
> >  link, então pode fazer se eu enviar uma requisição sem interferência
> >  do usuário.
> >  Deixe ver se eu entendi, eu vou ter de esvaziar ou destruir o
> >  dicionário SESSION?
> 
> Retirado do script logout fo plone:
> 
> from Products.CMFCore.utils import getToolByName
> 
> try:
>     context.acl_users.logout(context.REQUEST)
> except:
>     pass  # XXX we expect Unauthorized, but why do we do a bare
except then?
> 
> REQUEST = context.REQUEST
> 
> 
> # Invalidate existing sessions, but only if they exist.
> sdm = getToolByName(context, 'session_data_manager', None)
> if sdm is not None:
>     session = sdm.getSessionData(create=0)
>     if session is not None:
>         session.invalidate()
> 
> from Products.CMFPlone import transaction_note
> transaction_note('Logged out')
> 
> target_url = REQUEST.URL1
> # Double '$' to avoid injection into TALES
> target_url = target_url.replace('$','$$')
> target_url += '/logged_out'
> return state.set(next_action='redirect_to:string:' + target_url )
> 
> Advinha onde é que ele 'desloga' o usuário? ;)
> 
> []'s
> Fernando
> >
> >  --- Em zope-pt@yahoogrupos.com.br, "Luciano Ramalho" <ramalho@>
> >  escreveu
> >  >
> >  > Não existe uma boa maneira de um servidor desfazer a
autenticação de
> >  > um usuário que se logou via HTTP Basic Authentication (o método
padrão
> >  > do HTTP, usado pelo Zope mas não pelo Plone).
> >  >
> >  > O motivo é que no protocolo HTTP não existe o conceito de sessão.
> >  > Qualquer sistema Web que implementa sessões o faz se a ajuda do
> >  > protocolo, em geral usando cookies ou identificadores de sessão
> >  > apendados à URL.
> >  >
> >  > Quem gerencia o login no HTTP Básico é o navegador. É por isso,
> >  > inclusive, que quem pede a senha é  navegador (exibindo uma
caixa de
> >  > diálogo). Quando se usa algum mecanismo de sessão, a
autenticação não
> >  > é feita numa caixa de diálogo gerada pelo navegador, e sim num
> >  > formulário HTML. No caso da autenticação básica, não existe uma
forma
> >  > 100% garantida do servidor dizer ao navegador para deixar de
enviar a
> >  > senha, o que simularia um "logoff". Esta situação simplesmente
não é
> >  > prevista no protocolo HTTP.
> >  >
> >  > Na autenticação por cookies, o servidor pode enviar uma
mensagem para
> >  > o browser deletar o cookie da sessão. Se a sessão é mantida via um
> >  > identificador nas URLs, novamente o servidor tem controle, pois
é ele
> >  > que gera as URLs dos links que o navegador usa para navegar.
> >  >
> >  > Resumindo, se a sua aplicação exige que o usuário possa se deslogar
> >  > facilmente, você será forçado a usar algum método de
autenticação por
> >  > sessão, como faz o Plone.
> >  >
> >  > [ ]s
> >  > Luciano
> >  >
> >
> >
>


Responder a