簡體   English   中英

Perl Dancer2身份驗證密碼管理

[英]Perl Dancer2 Authentication Password Management

因此,任何使用過Perl舞者的人都知道,要在登錄時對用戶進行身份驗證,您可以致電authenticate_user

authenticate_user(
    params->{username}, params->{password}
);

這是Auth :: Extensible插件的一部分。

對我來說,它似乎鼓勵使用純文本存儲密碼! 當然,您可以先對密碼進行哈希處理,然后確保所存儲的密碼是相同的哈希,但這似乎更多的解決方法,但我發現不能保證能正常工作。 我只能使用不應該使用的sha1來工作。 我想使用Bcrypt,但密碼短語根本無法匹配。 不確定奇數字符不匹配我不確定。

事情是使用Dancer Passphrase插件,我已經可以驗證用戶名和密碼,甚至不需要依靠authenticate_user來驗證它們。 但是,要使舞者框架考慮已登錄的用戶,您仍然必須調用authenticate_user,必須向其傳遞密碼。

我完全被困住了。 我很好奇其他人如何設法在Dancer2中使用正確的密碼管理?

Dancer2 :: Plugin :: Auth :: Extensible的文檔中, authenticate_user()的描述為:

通常,您需要讓內置的登錄處理代碼處理對用戶進行身份驗證的操作,但是如果您需要自己進行身份驗證,此關鍵字將接受用戶名和密碼...

在我看來,這強烈暗示着,除非您做的特別聰明,否則根本不應該調用此函數。

我自己沒有使用過此模塊,但在我看來,所有哈希和加密內容都應由一個身份驗證提供程序處理 ,如果沒有一個可以滿足您的使用情況,則您可以自己編寫一個

每當我需要為Dancer應用程序存儲安全密碼時,都可以訪問Dancer2 :: Plugin :: Passphrase 我想知道是否應該考慮為其編寫Auth :: Extensible Style身份驗證提供程序。

首先,我將回應“您幾乎肯定不需要使用authenticate_user() ”注釋。 該插件可以為您處理所有這些。

但是,“不散列”是錯誤的。 這是它的工作方式。 authenticate_user關鍵字循環遍歷所有已配置的身份驗證領域,並針對每個提供者的authenticate_user() ,詢問提供者的authenticate_user()方法以查看其是否接受用戶名和密碼。 Database提供者(和其他提供者)從數據庫獲取記錄,並使用$self->match_password() (來自提供者角色 )進行驗證; 該代碼檢查從數據庫存儲的密碼是否以{scheme}開頭,如果是,則使用Crypt::SaltedHash->validate驗證用戶提供的密碼(以純文本形式,因為它只是通過網絡輸入)匹配存儲的散列密碼(以下代碼中的$correct是存儲的密碼):

if ( $correct =~ /^{.+}/ ) {

    # Looks like a crypted password starting with the scheme, so try to
    # validate it with Crypt::SaltedHash:
    return Crypt::SaltedHash->validate( $correct, $given );
}

因此,是的,如果您存儲在數據庫中的密碼是哈希值,那么如果提供的密碼與該哈希值匹配,它將與之匹配。

有關存儲的散列密碼應如何顯示的示例,這是捆綁的generate-crypted-password實用程序的輸出:

[davidp@supernova:~]$ generate-crypted-password 
Enter plain-text password ?> hunter2
Result: {SSHA}z9llSLkkAXENw8FerEchzRxABeuJ6OPs

有關其支持的算法及其使用的格式(請參閱“ Crypt :: SaltedHash”文檔)的詳細信息(“來自RFC-3112,並通過使用不同的數字算法進行了擴展”)。

請記住, authenticate_user背后的代碼正是為您使用的。

有關僅讓插件為您完成工作的示例,請考慮:

get '/secret' => require_login sub {
    my $user = logged_in_user();
    return "Hi, $user->{username}, let me tell you a secret";
};

... 而已。 require_login意味着插件將檢查用戶是否已登錄,如果未登錄,則將其重定向到登錄頁面以登錄。您無需自己調用authenticate_user ,無需設置任何會話變量或任何東西。 logging_in_user logged_in_user()將返回有關已登錄用戶的信息的hashref(並且由於路由代碼具有require_login ,因此在這一點上可以肯定是一個,因此您無需檢查)。

如果您需要檢查它們是否具有適當的作用,而不僅僅是檢查它們是否已登錄,請改為查看文檔中的require_role

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM