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.
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:
- Verifique o URL e deixe acessar
- 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:
- O usuário pode acessar foo/show_all/
- Mas, ele não pode ver ou acessar a instância do Foo, ou seja, foo/show/foo_1/
- 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