2012-10-17 68 views
1

我的Flask應用程序當前使用PostgreSQL來存儲所有身份驗證信息(用戶,令牌)並與之交互。對於其他邏輯,我需要使用MongoDB。我喜歡使用一種類型的技術而不是多種技術來降低應用程序的複雜性(例如,只有Redis而不是Redis + memcached)。我需要在Mongo中重新實現身份驗證嗎?

因此,現在我只考慮使用MongoDB,將它用作身份驗證過程的後端。

當前工作流如下:PostgreSQL存儲兩個表:用戶和令牌。當我註冊用戶時,我打開交易,將他的數據(用戶名,登錄名,密碼)存儲在用戶表中,然後將激活令牌插入到令牌表中,然後發送激活信函,然後關閉交易。因此,在代碼中存儲用戶,令牌或更高版本時發生問題,當我嘗試發送電子郵件時,事務將被回滾。它可以防止用戶創建時的情況,但不支持令牌,因此無法激活帳戶。

據我所知,事務不是MongoDB的特性。所以,如果我有兩個文檔,User和Token,如果第二個文檔不能創建,我將無法回滾第一個文檔。

我的問題是:

  1. 你將如何實現描述有關MongoDB的行爲?
  2. 是不是隻使用MongoDB而不是PostgreSQL進行身份驗證,而MongoDB只使用文檔?

回答

3

是的,你必須在這種情況下自己實現註冊邏輯。例如,如果您存儲以下文檔:

user : { 
    name : 'Alex Black' 
    email : '[email protected]' 
    token : { 
     value : 'some_random_token'  # subject for indexing 
     expires : '00.00.00.18.11.2012' # use MongoDB date here 
    } 
} 

然後例如一個cron腳本應該刪除所有過期的用戶。但是一個訣竅就是使用Mongo的NoSQL特性!

只需創建兩個單獨的集合:Users並且例如UnregisteredUsers。將用戶信息存儲到UnregisteredUsers,並且僅在註冊確認時將user文檔從UnregisteredUsers轉換爲Users

+0

感謝您的回覆!據我瞭解,在一般情況下,如果我需要幾步操作,我需要在一個對象上下文中執行操作。這樣對嗎? – Marboni

+0

@Marboni,但你的意思是「一個對象上下文......」? –

+0

我的意思是,如果我需要在MongoDB中「在一個事務中」更改兩個對象,則首先必須位於第二個對象中。 – Marboni