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 > > > > > > > >