web-dev-qa-db-ja.com

Django 1つのプロジェクトの複数認証バックエンド、どうやって?

ここで深刻な助けが必要です。

Django/pythonで記述されたアプリケーションがあり、それを拡張して、このアプリケーションの「アプリ」として他のソリューションを含める必要があります。たとえば、統合するアプリの名前は「my_new_app」です。メインアプリケーション用に作成されたバックエンド認証があり、使用できません。クエリを実行するmysqldbがあり、メインアプリは主にcassendraとredisを使用します。だから私の質問は、新しいアプリ「my_new_app」に個別の認証バックエンドを使用して、同じドメインで両方を実行する方法はありますか?質問はそれほど明確ではないかもしれません、私は尋ねられたら明確にします。

15

私は以前にこの問題を経験したことがあります。これは私が使用したコードです。

これは、api /backend.pyの認証バックエンドです。

from Django.contrib.auth.models import User


class EmailOrUsernameModelBackend(object):

    def authenticate(self, username=None, password=None):
        if '@' in username:
            kwargs = {'email': username}
        else:
             kwargs = {'username': username}
        try:
            user = User.objects.get(**kwargs)
            if user.check_password(password):
                return user
        except User.DoesNotExist:
            return None

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

そしてこれは私のsettings.pyです

AUTHENTICATION_BACKENDS = (
    'api.backend.EmailOrUsernameModelBackend',
    'Django.contrib.auth.backends.ModelBackend',
)

それが役に立てば幸い。それでも問題が解決しない場合は教えてください。このコードを使用すると、電子メールを使用して、Django adminでもデフォルトのDjangoユーザーを認証できます。

7
Edwin Lunando

複数のバックエンド認証の使用は、パイと同じくらい簡単です。 Djangoアプリのワークフローを理解する必要があります。

AUTHENTICATION_BACKENDS = (
    'Django.contrib.auth.backends.Backend1',
    'Django_openid_auth.auth.Backend2',
    )

たとえば、次の2つのバックエンドが定義されています。 Djangoは最初に最初のバックエンドに移動し、そのバックエンドにロジックを配置するだけで、そのバックエンドに関連していない場合は、他のバックエンドに転送されるか、結果なしで返されます。結果がない場合Djangoは自動的にリクエストを最初のバックエンドから2番目にシフトし、利用可能な場合は3番目のバックエンドにシフトします。これに多くの時間を費やし、それほど複雑ではないことがわかりました。

複数の認証バックエンドの使用は非常に簡単です。これをsettings.pyに追加するだけです。

AUTHENTICATION_BACKENDS = (
    'social_core.backends.open_id.OpenIdAuth',
    'social_core.backends.google.GoogleOpenId',
    'social_core.backends.google.GoogleOAuth2',
    'social_core.backends.google.GoogleOAuth',
    'social_core.backends.facebook.FacebookOAuth2',
    'Django.contrib.auth.backends.ModelBackend',
)

これによりサインアップページで問題が発生する可能性があるため、views.pyファイルのサインアップビューに次のようにログイン引数を追加しますlogin(request、user、backend = 'Django.contrib.auth.backends.ModelBackend')

def signup_view(request):
    if request.method=='POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            user=form.save()
            login(request, user, backend='Django.contrib.auth.backends.ModelBackend')
            return redirect('home')
0
Shubham Yadav