2009-11-03 40 views
7

Tôi cần phải tạo một hệ thống xác thực dựa trên tên miền phụ, như một trong 37 ký hiệu, sách mới, sử dụng codebase. Tức là, mỗi tên miền phụ của ứng dụng chính của tôi cần có không gian tên người dùng riêng. Tôi muốn giữ càng nhiều càng tốt của hệ thống xác thực django.Django: cách lưu trữ tên người dùng xác thực dựa trên tên miền phụ?

Cách tốt để lưu trữ tên người dùng là gì?

Cụ thể, người dùng khác nhau nên có cùng tên người dùng miễn là tài khoản của họ thuộc về một tên miền phụ khác.

Một số phương pháp tôi đã xem xét, mà tôi có thể lường trước được những thiếu sót:

  • lưu trữ một số tiền tố trong lĩnh vực tên người dùng của mô hình sử dụng django auth.
  • mở rộng mô hình người dùng theo this.
  • tùy nguồn gốc của auth đến nhu cầu của tôi

Trả lời

1

Tôi nghĩ rằng đây có thể là một trường hợp sử dụng tốt cho việc sử dụng django.contrib.sites kết hợp với các mục đạn thứ hai mà bạn đề cập. Bạn có thể tạo mô hình Người dùng tùy chỉnh như sau:

from django.contrib.sites.models import Site 

class CustomUser(User): 
    """User with app settings.""" 
    sites = models.ManyToManyField(Site) 

Sau đó, bạn có thể viết phụ trợ xác thực tùy chỉnh để kiểm tra người dùng có thể đăng nhập vào tên miền phụ hiện tại bằng thông tin đăng nhập được cung cấp không. Điều này cho phép bạn có một tên người dùng cho nhiều trang web (tên miền phụ) mà không cần phải hack ứng dụng auth nội bộ hoặc lưu trữ nhiều tên người dùng với các tiền tố tùy chỉnh.

EDIT: bạn có thể truy cập trang web hiện tại bằng cách sử dụng Site.objects.get_current() và sau đó kiểm tra xem trang web hiện tại có nằm trong trang web của người dùng hay không.

Bạn có thể đọc thêm về các trang web khuôn khổ ở đây: http://docs.djangoproject.com/en/dev/ref/contrib/sites/

+0

nhưng tên người dùng sẽ không phải là duy nhất không? –

+0

cũng lưu ý rằng khung trang web không hỗ trợ nhiều trang web trong một triển khai duy nhất, vì vậy để mô phỏng sách mới hoặc tương tự, bạn phải tạo tệp cài đặt mới và cấu hình web cho từng trang web ! – easel

+0

@rz - về cơ bản bạn không thể tạo một CustomUser và sau đó gán nhiều trang cho họ @easel - true, nhưng bạn đã viết một dự án dựa trên tên miền phụ, bạn đang thực hiện một số lượng lớn cấu hình máy chủ tự động . nó sẽ không quá khó để viết một tín hiệu sau khi lưu để tự động tạo ra một tập tin cài đặt mà chỉ chứa một SITE_ID và sửa đổi cấu hình máy chủ của bạn/dns. – richleland

2

tôi đã xây dựng được chức năng này cho một số trang web trong quá khứ và đã phát hiện ra rằng điểm viên đạn đầu tiên của bạn là cách để đi.

Điều đó có nghĩa là bạn không phải thực hiện thay đổi lớn đối với django auth. Những gì tôi đã làm là thiết lập một chương trình phụ trợ xác thực tùy chỉnh, trừu tượng hóa cách thức tên người dùng được lưu trữ.

auth_backends.py 

from django.contrib.auth.backends import ModelBackend 

from Home.models import Account 

class CustomUserModelBackend(ModelBackend): 
    def authenticate(self, subdomain, email, password): 
     try: 
      user = Account.objects.get(username=u'%s.%s' % (subdomain, email)) 
      if user.check_password(password): 
       return user 
     except Account.DoesNotExist: 
      return None 

    def get_user(self, user_id): 
     try: 
      return Account.objects.get(pk=user_id) 
     except Account.DoesNotExist: 
      return None 

Đối với dự án đặc biệt này Account là mô hình người dùng và nó chỉ được thừa hưởng trực tiếp từ tài khoản tuy nhiên bạn có thể thay thế Account với bất cứ điều gì bạn muốn.

Bạn phải cài đặt auth backend tùy chỉnh trong tập tin cài đặt của bạn:

AUTHENTICATION_BACKENDS = (
    'auth_backends.CustomUserModelBackend', 
    'django.contrib.auth.backends.ModelBackend', 
) 

Sau đó, khi bạn gọi authenticate bạn cần phải vượt qua trong các tên miền phụ, email và mật khẩu.

Bạn cũng có thể thêm một số hàm trợ giúp hoặc phương thức mô hình khác giúp đảm bảo rằng chỉ tên người dùng thực của người dùng được hiển thị, nhưng đó là tất cả tầm thường.

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