Selamat datang kembali ke perjalanan kami membina pengurus kata laluan dalam Go! Dalam ansuran kedua ini, kami akan meneroka kemajuan yang telah kami buat sejak komitmen awal kami. Kami telah menambah ciri baharu, menambah baik struktur kod dan melaksanakan ujian. Jom terjun!
Salah satu perubahan pertama yang anda akan perhatikan ialah struktur projek yang dipertingkatkan. Kami telah mengasingkan kod kami kepada berbilang fail dan pakej, mengikut amalan terbaik Go:
dost/ . ├── LICENSE ├── README.md ├── go.mod ├── go.sum ├── internal │ ├── internal_test.go │ └── passgen.go └── main.go
Struktur ini membolehkan organisasi dan kebolehselenggaraan yang lebih baik semasa projek kami berkembang.
Kami telah meningkatkan CLI kami dengan ketara, menjadikannya lebih fleksibel dan mesra pengguna. Berikut ialah coretan daripada main.go kami:
func main() { generateCmd := flag.NewFlagSet("generate", flag.ExitOnError) flag.Parse() switch os.Args[1] { case "generate": internal.Generate(generateCmd) } }
Persediaan ini membenarkan subperintah, yang kini menyokong perintah jana. Pengguna kini boleh berinteraksi dengan alat kami seperti ini:
go run main.go generate email/reachme@example.com 15
Kami telah menambah pilihan untuk menyesuaikan penjanaan kata laluan. Pengguna kini boleh menentukan panjang kata laluan dan memilih untuk mengecualikan aksara khas:
func Generate(generateFlags *flag.FlagSet) { generateFlags.BoolVar(&noSymbols, "n", false, "Skip symbols while generating password") generateFlags.BoolVar(©ToClipBoard, "c", false, "Copy to clipboard.") generateFlags.Parse(os.Args[2:]) passwordLength := 25 // ... (code to parse custom length) password, err := generatePassword(passwordLength, noSymbols) // ... (code to handle password output) }
Fungsi ini membolehkan pengguna menggunakan bendera seperti -n untuk mengecualikan simbol dan -c untuk menyalin kata laluan ke papan keratan dan bukannya memaparkannya.
Kami telah memperhalusi fungsi penjanaan kata laluan kami untuk mengendalikan pilihan penyesuaian baharu:
func generatePassword(length int, noSymbols bool) (string, error) { const ( uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" lowercaseLetters = "abcdefghijklmnopqrstuvwxyz" digits = "0123456789" specialChars = "!@#$%^&*()-_=+[]{}|;:'\",.<>/?" ) allChars := uppercaseLetters + lowercaseLetters + digits if !noSymbols { allChars += specialChars } var password string for i := 0; i < length; i++ { // Generate a random index to select a character from allChars randomIndex, err := rand.Int(rand.Reader, big.NewInt(int64(len(allChars)))) if err != nil { return "", err } // Append the randomly selected character to the password password += string(allChars[randomIndex.Int64()]) } return password, nil }
Fungsi ini kini menghormati bendera noSymbols, membolehkan penjanaan kata laluan yang lebih fleksibel.
Kami telah mengambil langkah penting ke arah memastikan kebolehpercayaan kod kami dengan melaksanakan ujian. Berikut ialah coretan daripada fail ujian kami:
func TestPasswordLength(t *testing.T) { password, err := generatePassword(10, true) if err != nil { t.Errorf("Expected no error, got %v", err) } else { if len(password) != 10 { t.Errorf("Expected 10 character password, got %d", len(password)) } } } func TestSpecialCharacter10K(t *testing.T) { splCharMissing := 0 for i := 1; i <= 10000; i++ { password, err := generatePassword(10, false) // ... (code to check for special characters) } if splCharMissing > 0 { t.Errorf("Special character was missing in %d / 10000 instances.", splCharMissing) } }
Ujian ini menyemak panjang kata laluan yang betul dan kemasukan aksara khas. Menariknya, ujian aksara khas kami mendedahkan kawasan untuk penambahbaikan: dalam 10,000 kata laluan yang dijana, 234 tidak mengandungi aksara khas. Ini memberi kita hala tuju yang jelas untuk pemurnian seterusnya.
Walaupun kami telah mencapai kemajuan yang ketara, masih ada ruang untuk penambahbaikan:
Nantikan bahagian seterusnya siri kami, di mana kami akan menangani cabaran ini dan terus mengembangkan pengurus kata laluan kami!
Ingat, kod sumber penuh tersedia di GitHub. Jangan ragu untuk mengklon, membuat garpu dan menyumbang kepada projek itu. Maklum balas dan sumbangan anda sentiasa dialu-alukan!
Selamat pengekodan, dan kekal selamat! ??
dost ialah pengurus kata laluan CLI yang ditulis dalam Go.
Diinspirasikan oleh (Pass)[https://www.passwordstore.org/]
> go build -o dost main.go
Generating password:
> ./dost generate email/vema@example.com Generated Password: );XE,7-Dv?)Aa+&<{V-|pKuq5
Generating password with specified length (default is 25):
> ./dost generate email/vema@example.com 12 Generated Password: si<yJ=5/lEb3
Copy generated password to clipboard without printing:
> ./dost generate -c email/vema@example.com Copied to clipboard! ✅
Avoid symbols for generating passwords:
> ./dost generate -n email/vema@example.com Generated Password: E2UST}^{Ac[Fb&D|cD%;Eij>H
MIT
Atas ialah kandungan terperinci Membina Pengurus Kata Laluan dalam Go: Bahagian 2. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!