2010-01-11 23 views
10

Tôi đã tìm thấy một dạng rò rỉ thông tin khi sử dụng trang trí @login_required và đặt biến LOGIN_URL.Django: vấn đề rò rỉ thông tin khi sử dụng @login_required và thiết lập LOGIN_URL

Tôi có trang web yêu cầu thông tin đăng nhập bắt buộc cho tất cả nội dung. Vấn đề là bạn được chuyển hướng đến trang đăng nhập với tập biến tiếp theo khi đó là một trang hiện có.

Vì vậy, khi chưa đăng nhập và yêu cầu:

http://localhost:8000/validurl/ 

Bạn thấy điều này:

http://localhost:8000/login/?next=/validurl/ 

Và khi yêu cầu một phi trang đã có sẵn:

http://localhost:8000/faultyurl/ 

Bạn thấy điều này:

http://localhost:8000/login/ 

Hiển thị một số thông tin mà tôi không muốn. Tôi nghĩ về việc ghi đè phương thức đăng nhập, buộc tiếp theo để trống và gọi 'siêu' trên phương thức được phân lớp này.

Một vấn đề khác là một số thử nghiệm của tôi không thành công nếu không có bộ LOGIN_URL. họ chuyển hướng đến '/ accounts/login /' thay vì '/ login /'. Do đó, tại sao tôi muốn sử dụng LOGIN_URL nhưng vô hiệu hóa tính năng 'tự động tiếp theo'.

Bất kỳ ai có thể làm sáng tỏ chủ đề này?

Thanx rất nhiều.

Gerard.

+0

IMO, đó là hành vi bán chính xác. Bạn thực sự nên trả lại 404 cho các tài nguyên không tồn tại và 403 cho các tài nguyên hiện có yêu cầu quyền xem. Nói cách khác, bạn không nên hướng đến trang đăng nhập cho những thứ không tồn tại - hiển thị trang 404 rất trần. –

Trả lời

5

Bạn có thể bao gồm dòng này làm mẫu cuối cùng trong tệp urls.py của mình. Nó sẽ định tuyến lại các url không khớp với bất kỳ mẫu nào khác trên trang đăng nhập.

urlpatterns = patterns('', 

    ... 

    (r'^(?P<path>.+)$', 'django.views.generic.simple.redirect_to', { 
     'url': '/login/?next=/%(path)s', 
     'permanent': False 
    }), 
) 

EDIT: Để tiếp tục nâng cao trang 404 để xác thực người dùng, làm như sau:

from django.http import Http404, HttpResponseRedirect 
def fake_redirect(request, path): 
    if request.user.is_authenticated: 
     raise Http404() 
    else: 
     return HttpResponseRedirect('/login/?next=/%s' % path) 

urlpatterns = patterns('', 

    ... 

    (r'^(?P<path>.+)$', fake_redirect), 
) 
+0

jbochi, giải pháp thú vị. Tuy nhiên, điều này sẽ giết chết hành vi 404 bình thường đối với những người đã đăng nhập đúng. Tôi phải kiểm tra xem trình xử lý 404 tùy chỉnh của tôi có tầm ảnh hưởng đến mức nào. Nó sẽ kiểm tra nếu ai đó đăng nhập, sau đó quyết định 404 hoặc đăng nhập. Tôi thấy một vòng lặp đang nổi lên ở đó :) – GerardJP

+0

@GerardJP. Bạn đúng! Tôi đã chỉnh sửa câu trả lời của mình. Vui lòng xem giải pháp thứ hai. Nếu bạn muốn, bạn có thể sửa đổi dòng 'raise Http404()' để gọi trình xử lý 404 tùy chỉnh của bạn. – jbochi

+0

jbochi, tuyệt vời! Đó thực sự là cái tôi đang tìm kiếm. Hiện tại, tôi đã chọn để nới lỏng thử nghiệm của mình một chút và vô hiệu hóa LOGIN_URL, vì nó được xử lý bởi trình xử lý 404 của tôi. Nếu không, tôi chỉ thực hiện một số mã cho một biến mà tôi không sử dụng, ngoài thực tế là nó phá vỡ thử nghiệm của tôi. Nhưng tôi chắc chắn sẽ nhớ rằng 'bắt tất cả' lừa url. Thanx lần nữa! – GerardJP

Các vấn đề liên quan