Quên mật khẩu là việc chẳng ai mong muốn nhưng xảy ra khá thường xuyên. Đối với người dùng bình thường thì có thể thiết lập lại mật khẩu một cách dễ dàng nhưng với tài khoản quản trị thì đó là một lỗi kinh hoàng và ngớ ngẩn nhất. Chính vì vậy, bài này sẽ hướng dẫn một cách thiết lập lại mật khẩu của tài khoản test@liferay.com phòng trường hợp bạn quên.
Trong tình huống này, để thiết lập lại mật khẩu thì bạn phải là người quản trị sever mà cổng thông tin của bạn đang được đặt trên nó. Đồng thời bạn cũng phải truy cập được vào cơ sở dữ liệu của cổng.
Trong bài này, mình hướng dẫn hai cách để thiết lập lại mật khẩu của tài khoản test@liferay.com (hoặc tài khoản admin khác mà bạn mong muốn).
Thao tác trên cơ sở dữ liệu
Cách trực quan nhất là ta sẽ chỉnh sửa trực tiếp trên cơ sở dữ liệu. Bạn mở cơ sử dữ liệu của cổng thông ra và tìm bảng User_ (có dấu gạch dưới (_) ở cuối tên bảng nhé). Hình dưới đây là một ví dụ:
Ở hình trên, mình chỉ chọn một vài trường quan trong của bảng User_ mà thôi. Các bạn có thể mở cơ sở dữ liệu của mình ra để xem chi tiết hơn. Trong nội dung này, chúng ta chỉ quan tâm đến ba trường là Password_, PasswordEncrypted, PasswordReset mà thôi.
Thông thường, mật khẩu của người dùng được lưu trữ trong cơ sở dữ liệu sẽ được mã hóa bởi các thuật toán như: BCRYPT/10, MD2, MD5, PBKDF2WithHmacSHA1/160/128000, SHA, SHA-256, SHA-384, SSHA, UFC-CRYPT (bạn có thể xem chi tiết trong file portal.properties và tìm từ khóa passwords.encryption.algorithm). Rất khó để dịch ngược lại mật khẩu từ các chuỗi mã hóa.
Thực hiện
- Ta sửa nội dung của cột Password_ (ở dòng có EmailAdress là test@liferay.com) thành một chuỗi không được mã hóa (ví dụ: 123456).
- Sửa nội dung của cột PasswordEncrypted thành 0 (hoặc false, f tùy vào từng cơ sở dữ liệu). Khi sửa nội dung của cột này, hệ thống sẽ không mã hóa mật khẩu mà bạn nhập từ trình duyệt mà so sánh trực tiếp với mật khẩu được lưu trong cơ sở dữ liệu.
- Sửa nội dung ô PasswordReset thành 1 (hoặc true, t tùy từng cơ sở dữ liệu). Mục địch của việc này là ngay khi bạn đăng nhập lại hệ thống sẽ yêu cầu bạn đổi mật khẩu được đặt trong cơ sở dữ liệu thành mật khẩu mới.
- Cuối cùng, khởi động lại hệ thống và đăng nhập với mật khẩu mà bạn vừa sửa.
Sử dụng hook để thiết lập lại mật khẩu
Cách này cũng tương tư như cách trên mà thôi. Tuy nhiên, ta không cần trực tiếp thay đổi nội dung trong cơ sở dữ liệu mà chỉ cần deploy file war vào cổng thông tin là được.
Các bước thực hiện như sau:
Tạo một hook project
Đầu tiên bạn hãy tạo một plugin hook bằng cách: Chọn File >> New >> Other >> Liferay >> Liferay Plugin Project.
Chúng ta sẽ thực hiện việc thiết lập lại mật khẩu khi sự kiện startup sảy ra. Chính vì vậy, ta sẽ tạo một cấu hình hook (hook configuration) như sau. Click chuột phải vào project của bạn chọn New >> Other >> Liferay >> Liferay Hook Configuration.
Tạo mới một cấu hình Hook |
Bạn nhấn vào nút Next và tích chọn ô Portal properties và click vào nút Next ở cửa sổ tiếp theo. Bây giờ, chương trình sẽ cho phép bạn ghi đè các cấu hình đã có sẵn trong file portal.properties của hệ thống. Để ghi đè nội dung các cấu hình có sẵn bạn tích vào nút Add ở phần dưới (Specify properties to override).
Lúc này, một cửa sổ nhỏ hơn hiện ra như hình dưới đây:Ghi đè một thuộc tính của portal.properties |
Như bạn thấy trong hình, ở đây mình sẽ ghi đè cấu hình của thuộc tính application.startup.events với giá trị là com.blogspot.chingovan.passwordchanger.PasswordChanger (đường dẫn đầy đủ đến một lớp thực hiện sẽ được trình bày ở bước tiếp theo). Nếu bạn không nhớ tên đầy đủ của thuộc tính thì click vào nút Select... để chọn cho chính xác nhé.
Nhấn nút OK để đóng cửa sổ hiện tại và nhấn nút Finish để kết thục việc ghi đè cấu hình hook. Bạn mở project ra và tìm dưới trong thư mục src sẽ thấy có một tệp tin là portal.properties ghi lại cấu hình mà ta vừa ghi đè. Đồng thời mở file liferay-hook.xml ra bạn sẽ thấy một cấu hình chỉ đến file portal.properties vừa được sinh ra.
Viết code java
Kết thúc việc tạo một dự án hook, bây giờ, ta sẽ cài đặt một lớp để thực hiện việc thiết lập lại mất khẩu. Như ở bước trước đã nói, ta sẽ viết một lớp có tên pà PasswordChanger trong gói com.blogspot.chingovan.passwordchanger.
Nội dung của lớp này như sau:
Như bạn đã thấy, lớp PasswordChanger sẽ được kế thừa từ lớp SimpleAction chính vì vậy ta cần cài đặt chi tiết cho phương thức run. Phương thức này sẽ được gọi khi dự án được triển khai vào hệ thống. Bây giờ mình sẽ đi phân tích những gì được viết trong phương thức run và giải thích ý nghĩa của nó nhé.
- Dòng số 18: Ta tạo một đối tượng thuộc lớp Properties (java.util.Properties), đối tượng này sẽ lưu trữ các cấu hình mà ta cài đặt.
- Dòng số 21: Tải các cấu hình trong tệp tin password.changer.properties trong thư mục src. Nôi dung của tệp tin này như sau:
- type=e-mail, chúng ta đặt lại mật khẩu của người dùng theo địa chỉ email được cung cấp. Nếu type=screenname thì chúng ta phải cung cấp nick name.
- webId=liferay.com, cấu hình này để xác định tài khoản thuộc company nào. Thông thường, các tài khoản mặc định thuộc company liferay.com.
- virtualhost=localhost, địa chỉ ảo của company.
- emailaddress=test@liferay.com, địa chỉ email của tài khoản mà ta muốn đặt lại mật khẩu. Trong trường hợp này là test@liferay.com. Nếu type=screenname thì không phải cung cấp trường này.
- screenname=test, là nick name của người dùng. Nếu type=e-mail thì không phải khai báo trường này.
- password=123456, đây là mật khẩn sẽ được đổi thành. Nếu thành công, lần đăng nhập tiếp theo ta sẽ sử dụng mật khẩu này.
- Dòng số 22-23: đọc giá trị của hai thuộc tính type và webId.
- Dòng số 24: Đọc thông tin của company với webId đã được cung cấp.
- Dòng 29-40: tùy thuộc vào giá trị của biến type ta sẽ đọc được tài khoản (user) cần phải thiết lập lại mật khẩu.
- Dòng 43: Cập nhật lại mật khẩu bằng phương thức updatePasswordManually trong tiện ích UserLocalServiceUtil. Các tham số của phương thức này là: userId, password, passwordEncrypted, passwordReset, passwordModifiedDate. Thực tế, chúng ta sẽ lưu mật khẩu dưới dạng không mã hóa (passwordEncrypted=false) và yêu cầu thiết lập lại mật khẩu sau khi đăng nhập (passwordReset=true). Rõ ràng, công việc này cũng hoàn toàn tương tự như cách trên.
Bây giờ bạn triển khai vào hệ thống, nếu có thông báo cập nhật thành công thì bạn hãy đăng nhập vào tài khoản của mình mới mật khẩu mới. Ngược lại, hãy thử restart lại cổng thông tin xem có được không?
Mình giới thiệu với bạn cách thứ hai này vì nó sẽ giúp bạn nhanh chóng lấy được lại mật khẩu vì chỉ cần tải file changepassword-hook-6.2.0.1.war của mình về và triển khai trong hệ thống là được.
Sửa cấu hình setup.wizard.enabled
Hai cách trên có thể đặt lại mật khẩu cho bạn, nhưng một số tình huống thực tế mình vẫn không thể làm được. Đồng thời hai cách trên cũng khá lằng nhằng và phức tạp. Qua thời gian, mình tìm ra một cách mới, đơn giản và tiện lợi hơn rất nhiều so với hai cách trên.
Chúng ta thấy rằng, mỗi khi cài đặt môi trường Liferay mới lên, hệ thống sẽ cho phép ta chọn các thông số mặc định trong đó có tài khoản quản trị. Đồng thời nó cũng cho phép ta đặt mật khẩu cho tài khoản quản trị trên.
Như vậy, khi quên mật khẩu chúng ta sẽ phải cài lại môi trường ư? Nếu làm thế thì sao ta dám chê hai cách trên là lằng nhằng. Đúng vậy, ta không cần phải cài lại môi trường, bạn chỉ cần mở file portal-setup-wizard.properties nằm trong thư mục portal và sửa tham số setup.wizard.enabled từ false thành true là được (setup.wizard.enabled =true).
Bây giờ khởi động lại hệ thống nào, nhập lại mật khẩu và tiếp tục sử dụng hệ thống nào.
Một số tình huống khác
Hai cách trên là đủ để bạn lấy được lại mật khẩu của mình. Tuy nhiên, cũng có thể không thành công. Trong trường hợp đó, bạn hãy kiểm tra lại cơ sở dữ liệu và xem cột status trong bảng User_ nhé. Nếu cột này có giá trị khác 0 thì bạn hãy đặt lại là 0 và khởi động lại cổng thông tin.
Kết luận
Lời khuyên của mình là bạn hãy ghi chú lại những thông tin về hệ thống mà bạn đã triển khai để tránh trường hợp như trên. Tuy nhiên, nếu chẳng may thì bạn cũng có thể sử dụng hai cách trên để lấy lại mật khẩu một cách nhanh chóng.
Bạn có thể tải mã nguồn tại đây và file *.war tại đây. Với file *.war (cho phiên bản Liferay 6.2) bạn chỉ cần copy nó vào thư mục deploy trong thư mục của portal là xong.
Chúc các bạn thành công.
nice
Trả lờiXóa