Theo mặc định, mật khẩu được băm khi chèn vào auth_user
bảng (thông qua trình xác thực biểu mẫu được liên kết với trường mật khẩu). Vì vậy, bạn không muốn chèn SQL tiêu chuẩn của các mật khẩu văn bản thuần túy vào bảng (không chỉ là không an toàn mà còn các lần đăng nhập tiếp theo sẽ không thành công vì Auth
đang mong đợi mật khẩu được băm).
Cách dễ nhất để thực hiện băm khi thực hiện chèn hàng loạt là lặp qua các bản ghi và chèn từng bản ghi bằng cách sử dụng .validate_and_insert
phương pháp. Thao tác này sẽ chạy tất cả các trình xác thực trường (dẫn đến mật khẩu được băm) và bất kỳ bản ghi nào không xác thực được sẽ đơn giản là không được chèn (vì vậy, ví dụ:tên người dùng trùng lặp sẽ không được chèn vì nó sẽ không xác thực được).
for user in db(db.user).select():
db.auth_user.validate_and_insert(username=user.username, password=user.password)
Mặc dù quá trình xác thực sẽ tự động từ chối bất kỳ tên người dùng trùng lặp nào, nhưng nếu bạn mong đợi có nhiều trùng lặp và muốn cải thiện hiệu quả, trước tiên bạn có thể chỉ chọn các tên người dùng không trùng lặp từ user
bảng:
users = db(~db.user.username.belongs(db()._select(db.auth_user.username))).select()
for user in users:
db.auth_user.validate_and_insert(username=user.username, password=user.password)
Ngoài ra, lưu ý rằng theo mặc định, auth_user
bảng yêu cầu các giá trị trong first_name
, last_name
và email
các trường (và địa chỉ email hợp lệ là cần thiết cho một số Auth
chức năng, chẳng hạn như đặt lại mật khẩu). Vì vậy, bạn cũng nên lập kế hoạch điền vào các trường đó hoặc đặt requires
của chúng thuộc tính cho None
để xác nhận không thất bại. Ví dụ:
db.auth_user.first_name.requires = None
Một tùy chọn khác là xác định auth_user
tùy chỉnh bảng.