2015-09-26 78 views
-1

我在User模型代碼中爲我的用戶密碼添加了一個密碼正則表達式,如下所示。不接受密碼正則表達式

validates :password, presence: true, length: { minimum: 6 } 
validate :password_complexity 
has_secure_password 

def password_complexity 
    if password.present? and not password.match(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d). /) 
    errors.add :password, "must include at least one lowercase letter, one uppercase letter, and one digit" 
    end 
end 

當我試着Password1,它不會接受它。任何想法,爲什麼這不會採取?

+1

刪除空間的正則表達式的末尾:'/ ^(?= * [AZ])( ?=。* [AZ])(? =。* \ d)。| - here - | /' – dimakura

+0

在這種情況下,https://regex101.com/是你的朋友。 –

+1

我建議你不要使用這些東西。你會發現,你爲Rails應用程序增加了額外的開銷,只是有些人不能使用他們選擇的密碼。當網站告訴我使用什麼樣的密碼時,它總是讓我很煩惱。您很可能會在後端散列密碼,因此根本沒有必要使用此規則。 –

回答

1

我相當肯定,就性能和處理而言,使用單個正則表達式(即使可能)可能效率較低。

此外,由於返回值不同,使用String#match比使用String#=~要慢。

我會分離的要求到一個數字或正則表達式,並保持它簡單一點,就像這樣:

def password_complexity 
    return unless password.present? 
    unless password =~ /[a-z]/ && password =~ /[A-Z]/ && password =~ /[\d]/ 
    errors.add :password, "must include at least one lowercase letter, one uppercase letter, and one digit" 
    end 
end 

這是一個有點簡單閱讀和維護。它還可以讓你打破了錯誤消息,到更具體的錯誤以後,也許像這樣:

def password_complexity 
    return unless password.present? 
    errors.add :password, "must include at least one lower case letter." unless password =~ /[a-z]/ 
    errors.add :password, "must include at least one upper case letter." unless password =~ /[A-Z]/ 
    errors.add :password, "must include at least one digit." unless password =~ /[\d]/ 
end 
+0

這個完美的作品,謝謝@Myst !!!!沒有意識到我可以將正則表達式分成不同的部分。對我幫助很大,學習的時刻 - 謝謝。 :) – richiepop2

-1

您可以使用這一模式

if password.present? and not password.match(/^[a-zA-Z]+\d+/) 

的看到這個DEMO

希望這有助於。

+0

OP的正則表達式並不那麼複雜。需要展望未來。 OP的使用很好。你的正則表達式既不夠也不需要。 – sawa

+0

那麼你能解釋爲什麼它沒有馬克密碼1 –

+0

請參閱dimakura的評論。順便說一下,'Password1',而不是'password1'。後者應該被拒絕。 – sawa