Pergunta

Um middleware pode verificar se um valor está no URL, como um id de imagem ("/imagem/152/") e, se for, faça algumas verificações para garantir que o usuário atual tenha permissão para visualizar essa imagem e Se não for redirecionado para outro URL?

Eu tive que rolar minhas próprias permissões para este site em que estou trabalhando e não quero entupir quase todas as visões que escrevo para todo o site com o mesmo código, então pensei que um middleware seria uma boa ideia para isso, Mas não tenho certeza de como fazer isso.

Foi útil?

Solução

Sim, isso é possível. O django Middleware Docs for Process_Request indique aquilo:

DEF Process_Request (self, solicitação)

A solicitação é um objeto httprequest. Este método é chamado em cada solicitação, antes que o Django decida qual visão de executar.

process_request () deve retornar nenhum ou um objeto httproponse. Se ele não retornar, o Django continuará processando essa solicitação, executando qualquer outro middleware e, em seguida, a visualização apropriada. Se ele retornar um objeto HTTPRESPOnsion, o Django não se incomodará em chamar qualquer outra solicitação, visualização ou middleware de exceção ou a visualização apropriada; Vai retornar essa resposta.

o HttpRequest Objeto tem um path atributo que lhe dará o URL solicitado.

Se você preferir, no entanto, observe que você também pode estender o sistema do Django para obter backends de autenticação para preencher o usuário na solicitação com permissões com base em qualquer critério arbitrário, como talvez o seu esquema de permissões enroladas à mão. Dessa forma, você pode aproveitar os decoradores de autenticação padrão (@permission_required e @user_passes_test) e outros aplicativos/o site administrativo também poderão honrar suas permissões. O objeto e as permissões do usuário criadas não precisam residir nas tabelas de usuário/permissão do Django e podem ser criadas virtualmente no login; Eu tive uma quantidade razoável de sucesso com isso.

Ver Escrevendo um back -end de autenticação Se isso apelar.

Outras dicas

Se você implementar a autorização (sistema de permissão) no middleware, você acabará com duas opções:

  1. Verifique o URL e deixe acessar
  2. Verifique o URL e rejeite o acesso

Se o seu requisito é muito simples, tudo bem, pois você não precisa tocar em visualizações.

Mas, em geral, o sistema de permissão é muito complexo do que isso, por exemplo:

  1. O usuário pode acessar foo/show_all/
  2. Mas, ele não pode ver ou acessar a instância do Foo, ou seja, foo/show/foo_1/
  3. Como ele não pode acessar a instância Foo_1, não devemos mostrá -los em show_all (todas as instâncias Foo)

Se você deseja implementar acima 3 juntos, sugiro escrever seu próprio back -end de autorização, com o qual o Django está feliz em trabalhar. Tudo o que você precisa fazer é implementar poucos métodos (sua lógica específica) e anexar como back -end.

Ler: http://docs.djangoproject.com/en/dev/topics/auth/#handling-authorization-in-custom-backends

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top