2

django とカスタム アプリの両方から同じ BD にアクセスする必要があります。

私はdjangoと同じ機能をpostgress 9に実装したいと思っています。

これは私の試みです:

CREATE EXTENSION pgcrypto
  SCHEMA public;
-- Genera una cadena aleatoria del tamaño especificado
CREATE OR REPLACE FUNCTION random_string(length integer) 
RETURNS TEXT
AS $$
DECLARE
  chars text[] := '{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}';
  result text := '';
  i integer := 0;
BEGIN
  IF length < 0 THEN
    raise exception 'Given length cannot be less than 0';
  END IF;

  FOR i IN 1..length LOOP
    result := result || chars[1+random()*(array_length(chars, 1)-1)];
  END LOOP;

  RETURN result;
END;
$$
LANGUAGE plpgsql;

-- Encripta con SHA1 una cadena y retorna el tipo de algoritmo + salt + hash
CREATE OR REPLACE FUNCTION encryp_text(_text text)
RETURNS TEXT
AS $$
DECLARE
    hash text := '';
    salt text := '';
BEGIN
    salt := random_string(12);
    hash := encode( digest(random_string(12) || _text, 'SHA1'), 'hex');

    RETURN 'sha1$' || salt || '$' || hash;
END;
$$
LANGUAGE 'plpgsql';


-- Resetea el pwd del usuario
CREATE OR REPLACE FUNCTION create_user (_username text, _password text, name text, lastname text, email text, isadmin bool, isstaff bool)
RETURNS BOOLEAN
AS $$
BEGIN
    IF isadmin THEN
        isstaff := isadmin;
    END IF;

    INSERT INTO auth_user(
            username, 
            first_name, 
            last_name, 
            email, 
            password, 
            is_staff, 
            is_active, 
            is_superuser)
    VALUES (_username, 
            name,
            lastname,
            email,
            encryp_text(_password),
            isstaff, 
            true,
            isadmin);
END;
$$
LANGUAGE 'plpgsql';
SELECT create_user('sample','123','sample','user','s@s.com',true,true)

ただし、django で認証しようとすると、次のようになります。

from django.contrib.auth import authenticate
authenticate(username='sample', password='123')

失敗します。私は何をする必要がありますか?

アップデート:

同じパスワード:

Django:sha1$46uim9Staj7A$d472909885d27a21bc6e489641e27cc6e4ed25b6 Postgress:sha1$CP5CDALuPntn$d85f6aec18ae781c02cddbaa53e7c92e1b2c7ab1

更新: この質問を忘れてしまいました。Postgres 9.1 で django の BCryptPasswordHasher を再実装し、新しい bcrypt メソッドにアップグレードする方法に示されているように解決されました。

4

2 に答える 2

0

現状では、あなたのコード自体を本当に批判する方法はありません。ただし、ログインを再利用するには、Django が使用するのと同じルーチンを実行し、必要に応じてそれらを新しい言語またはフレームワークに移植することをお勧めします。これは、セキュリティに関して単一の権限を持つことを意味します。

PostgreSQL はユーザー名とソルトされた md5 ハッシュとしてパスワードを保存するため、PostgreSQL 自体で SHA ハッシュ化パスワード (任意のアルゴリズム) を使用できないことに注意してください。ハッシュされていないユーザー名にアクセスできない限り、PostgreSQL ユーザー アカウントを効果的に変更することはできません。ただし、PostgreSQL と Django の両方のパスワードを同じ入力から変更する関数を作成できる場合もありますが、ステートメントのログ記録には注意が必要です。また、PostgreSQL では ALTER USER がパラメータ化されていないため、最終的に pl/pgsql を使用して次のようにする必要があることに注意してください。

  EXECUTE $e$ ALTER USER $e$ || quote_ident(in_username) || $e$ WITH PASSWORD $e$ 
      || quote_literal(in_password);
于 2013-03-26T10:18:26.250 に答える