2017-01-06 4 views
1

Django noob。 MySQLからPostgreSQLにテーブルをエクスポートおよびインポートしました。クライアントと顧客の表はusersとなります。Django:レガシー(auth_userではない)テーブルへの暗号化されたパスワード

Djangoがpython manage.py shellを使用して暗号化に使用するテストアカウントのパスワードを更新しようとしています。 no attribute 'set_password'がありますので

from account.models import Users 
user = Users.objects.filter(pk=2) 
user.set_password('new_password') 

エラー:ハッシュ・アルゴリズムがにインポートされていないので、明らかに動作しません、以下を試してみました。

Fine。

from django.contrib.auth.models import User 
User.objects.filter(pk=2) 
Queryset [] 
User.objects.all() 

そして、それはauth_user表にのみユーザーを返します。すべてのチュートリアルの言うことを試してみてください。

基本的に、私はDjangoの暗号化を従来のusersテーブルに対してどのように使用しますか?

Djangoクライアントと顧客アカウントでauth_userテーブルに入るようですか? /adminにアクセスする必要があり、そのアプリを使用するクライアント/顧客が別のテーブルにアクセスする必要があるユーザーのために、そのテーブルをもっと考えていました。

EDIT 1:

レガシーテーブル管理定義された塩で保存されたパスワードは、(私は塩が同じであったことは言う理由があるので、Djangoはそのような各ユーザーまたは何かのために独自のアルゴリズムを使用しています信じていました誰でも)+ハッシュアルゴリズム(SHA256私は思う)を介して送信されたユーザーのパスワード。そうプレーンテキストではありません。

私はすべてのパスワードをクリアして、新しいものを作成しようとしていました。古いテーブルは1つのハッシュを使用し、Djangoは全く別のものを使用していたので、私はDjangoハッシュの下で解読と再暗号化を混乱させたくありませんでした。最初から始めましょう。

また、クライアント/顧客向けにusersテーブルを使用し続け、/adminのユーザーのためにauth_userを保持したいと思います。私の考え方は間違っています。

答えて

2

あなたのレガシーテーブルがどのようになっているかについては言及していませんが、この回答では基本的なユーザー名、パスワード、電子メールフィールドがあると仮定しています。パスワードを平文で保存している場合はハッシュすることができますが、何らかのサードパーティーのソリューションを使用している場合は、各ユーザーはパスワードをリセットする必要があります。

INSERT INTO auth_user(username,password,email) SELECT username, password, email FROM account_user 
PSQLまたはpgAdminで中

または任意:あなたはちょうどこれを行わない場合は、パスワードをサルベージしたい場合

import account.models import User as LegacyUser 
import django.contrib.auth.models User 

users = [] 
for u in LegacyUser.objects.all(): 
    new_user = User(username=u.user, email=u.email) 
    new_user.set_password(u.password) 
    users.append(new_user) 

User.objects.bulk_create(users) 

以上です。これははるかに速くなければなりません。

また、私はクライアント/顧客 のためのユーザーテーブルを使用しておくと、私の考えは、この上の間違っ でなければ... /管理者のユーザーのためにAUTH_USERを維持したいと思います。

ご迷惑をかけて申し訳ありません。 django.contrib.authという2つのテーブルは必要ありません。ユーザーテーブルには、この状況に対処するために特別に設計されたis_staffis_superuserという2つのフィールドがあります。

また、django.contrib.auth.models.Userモデルを完全に削除して、ユーザーモデルをデフォルトとして使用することもできます。 2つのモデルを持つSpecifying a custom user modelを参照してください。コードを複製して作業し、セキュリティ上の問題が発生する可能性があります。

+0

ありがとうございます。私のクライアント/顧客をDjangoの '/ admin'ユーザとは別のテーブルに入れようとしているので、' users'テーブルを使い続けたいと思います。 Djanoのハッシュを使ってパスワードを与えたいだけです。 – sockpuppet

+0

は答えを – e4c5

+0

Hmmm ...更新しました。顧客のために私は 'is_staff = false'と' is_superuser = false'を '/ admin'にアクセスできないようにしますか?私はこれらのfalseに(またはちょうど 'is_client'フィールドを追加する)アプリケーションに直面している顧客のロジックに基づいています。また、同じトピックを議論するようだこのスレッドを発見した:http://stackoverflow.com/questions/34743482/how-to-separate-users-models-by-admins-and-customers-on-django – sockpuppet

関連する問題