Phân quyền đăng nhập từ cơ bản đến nâng cao

Bạn cảm thấy chủ đề này như thế nào?

  • 2. Cũng bình thường

    Bình chọn: 0 0.0%
  • 3. Chán, không đáng để đọc

    Bình chọn: 0 0.0%

  • Số thành viên bình chọn
    6

Ngày Mới

SMod
Thành viên BQT
Giới thiệu
Chào các bạn, phân quyền là đăng nhập là một chủ đề vừa mới vừa cũ. Cũ là hầu như ai cũng biết VBA có thể làm được màn hình đăng nhập, mới là chưa có một hệ thống tài liệu nào giúp chúng ta có thể làm được một form đăng nhập hoàn chỉnh từ cơ bản đến nâng cao.

Nâng cao ở đây có thể hiểu là:
- Phân quyền từng User cho từng Sheet, từng cột cụ thể.
- Chỉ tài khoản Admin mới có thể phân quyền, chỉnh sửa thông tin đăng nhập cho các User.
- Tạo thời gian sử dụng cho file, khi hết hạn thì chỉ có đăng nhập tài khoản Admin mới gia hạn được.
- Tài khoản Admin có thể tạo mới, chỉnh sửa thông tin đăng nhập cho các User bằng hình thức Online, không cần mở file.
- Bảo mật hơn với các công cụ ẩn Module, khoá UnView.
- Khắc phục các lỗi khi đang mở nhiều file, tắt mở làm ảnh hưởng các file không liên quan.
...

Phân quyền có thể được dùng cho nhiều trường hợp, đặc biệt là trong trường hợp nhiều người cùng sử dụng 1 file Excel, hạn chế phân mảng dữ liệu 1 người 1 file, việc phân quyền là cần thiết.

Tuy nhiên, nếu xét về phương diện bảo mật thì mình cũng khẳng định là không đảm bảo. Chúng ta dùng phương thức phân quyền đăng nhập để công việc của chúng ta được thuận tiện, giảm phân mảnh dữ liệu và thuận tiện xử lý khi tổng hợp.

Mình sẽ hướng dẫn các bạn một cách dễ hiểu nhất có thể, để làm sao ai trong số chúng ta đều có thể làm theo được. Nào, giờ ta cùng vào phần nội dung.

Cách tạo một màn hình đăng nhập cơ bản
Bước 1:
Tạo một Userform mới và thiết kế một màn hình đăng nhập, bước này nếu các bạn không rõ có thể xem lại loạt bài hướng dẫn tạo Userform
Bạn cần đăng nhập để thấy hình ảnh


Ở đây, mình sẽ đặt tên các Controls như sau:
Label
- ĐĂNG NHẬP: lbLogin
- Tài Khoản: lbID
- Password: lbPW
Textbox
- Tài khoản: tbID
- Password: tbPW
Button
- Đăng nhập: btLogin
- Huỷ bỏ: btClose

Các bạn cũng nên tập thói quen đặt tên các Control khi thêm vào Userform, việc này sẽ giúp các bạn dễ định dang khi viết code đồng thời cũng dễ quản lý. Chứ viết code mà Textbox1, Textbox2... Mới thì hiểu, đợi khi 3 tháng sau quay lại nhìn code thì chỉ có "ngáo" thôi :)

Bước 2: Nhập mật khẩu thì phải hiện chữ * chứ nhỉ
Chọn Textbox Pasword > PasswordChar > *
Bạn cần đăng nhập để thấy hình ảnh


Bước 3: Giờ ta code thôi
Code khi mở form
Mã:
Private Sub UserForm_Initialize()
'//AN FILE EXCEL
Windows(ThisWorkbook.Name).Visible = False
End Sub
Code nút Đăng nhập
ID:
admin - Password: admin
Mã:
Private Sub btLogic_Click()
Dim ckID As Boolean

'//CHECK THONG TIN ID VA PASSWORD
If tbID.Value = "admin" And tbPW.Value = "admin" Then
    ckID = True
Else
    MsgBox "Ban da nhap sai tai khoan hoac Password"
    Exit Sub
End If

'//XU LY
If ckID = True Then
    '//AN MAN HINH DANG NHAP
    Me.Hide

    '//HIEN LAI FILE EXCEL
    Windows(ThisWorkbook.Name).Visible = True
End If

End Sub
Code nút Huỷ bỏ
Mã:
Private Sub btClose_Click()
'//DONG FOMR
Unload Me

'//DONG FILE
ThisWorkbook.Close False
End Sub
Bước 4: Tự mở form khi mở file
Cho đoạn code sau vào Thisworkbook là xong :)
Mã:
Public Sub Auto_Open()
UfLogin.Show
End Sub
Và đây là kết quả, quá đơn giản đúng không nào.
Bạn cần đăng nhập để thấy hình ảnh


Trên đây là cách chúng ta có thể tạo 1 form đăng nhập cơ bản. Trong các bài tiếp theo, chúng ta sẽ tìm hiểu cách tinh chỉnh nhiều tính năng hơn cho form đăng nhập này.
 
Sửa lần cuối:

Ngày Mới

SMod
Thành viên BQT
Tinh chỉnh thêm tính năng cho form đăng nhập
1. Đăng nhập sai Password 3 lần thì tự đóng form

Để làm được việc này ta cần đếm số lần đăng nhập sai, ta khai báo 1 biến toàn cục ở đầu Module tên intCountLogin
Mã:
Public intCountLogin As Integer
Sau đó ta cho cộng dồn biến này mỗi lần đăng nhập sai ở sự kiện nút Đăng nhập, Dòng code số 9,10,11
Mã:
Private Sub btLogic_Click()
Dim ckID As Boolean

'//CHECK THONG TIN ID VA PASSWORD
If tbID.Value = "admin" And tbPW.Value = "admin" Then
    ckID = True
Else

    '//DEM SO LAN DANG NHAP SAI
    intCountLogin = intCountLogin + 1
    If intCountLogin >= 3 Then ThisWorkbook.Close False

    MsgBox "Ban da nhap sai tai khoan hoac Password"
    Exit Sub
End If

'//XU LY
If ckID = True Then
    '//AN MAN HINH DANG NHAP
    Me.Hide

    '//HIEN LAI FILE EXCEL
    Windows(ThisWorkbook.Name).Visible = True
End If

End Sub
2. Nhấn Enter để thực hiện nhanh nút Đăng nhập và nút Exit sẽ thoát form
Thay vì chọn Đăng nhập, theo thói quen người Enter sẽ thuận tiện hơn.
Chọn vào nút Đăng nhập > Default > True
Bạn cần đăng nhập để thấy hình ảnh


Tương tự đối với nút Exit
Chọn nút Huỷ bỏ > Cancel > True
Bạn cần đăng nhập để thấy hình ảnh


3. Cảnh báo người dùng khi nhập thiếu thông tin đăng nhập
Ta sẽ thêm 1 điều kiện If thông tin đăng nhập trước khi kiểm tra thông tin, ta sẽ thêm đoạn code dòng 4-8
Mã:
Private Sub btLogic_Click()
Dim ckID As Boolean

'//BAY LOI NHAP THIEU THONG TIN
If tbID.Value = "" Or tbPW.Value = "" Then
    MsgBox "Ban chua nhap du thong tin dang nhap", vbInformation
    Exit Sub
Else

'//CHECK THONG TIN ID VA PASSWORD
If tbID.Value = "admin" And tbPW.Value = "admin" Then
    ckID = True
End if

    '//DEM SO LAN DANG NHAP SAI
    intCountLogin = intCountLogin + 1
    If intCountLogin >= 3 Then ThisWorkbook.Close False

    MsgBox "Ban da nhap sai tai khoan hoac Password", vbInformation
    Exit Sub
End If

'//XU LY
If ckID = True Then
    '//AN MAN HINH DANG NHAP
    Me.Hide

    '//HIEN LAI FILE EXCEL
    Windows(ThisWorkbook.Name).Visible = True
End If

End Sub
VÀ ĐÂY LÀ KẾT QUẢ
Bạn cần đăng nhập để thấy hình ảnh
 
Sửa lần cuối:

Ngày Mới

SMod
Thành viên BQT
Đưa thông tin đăng nhập lên Sheet và phân quyền Admin

Đưa thông tin lên sheet sẽ giúp có Admin có thể dễ dàng quản lý các tài khoản User hơn.

Bước 1: Tạo 1 sheet mới, đặt tên ví dụ như Setting, Tạo một bảng để lưu trữ thông tin đăng nhập, bảng này chỉ bao gồm các tài khoản User, tài khoản Admin sẽ được đặt trong code
Bạn cần đăng nhập để thấy hình ảnh


Bước 2: Ta sẽ khai báo 2 từ gợi nhớ ở đầu Module giúp để dễ dàng gọi đến khi cần
Mã:
Public Const strPW As String = "1" '//PASSWORD ADMIN
Public Const SHEET_SETTING As String = "Setting" '//TEN SHEET SETTING
Bước 3: 2 Sub hiện toàn bộ Sheet và siêu ẩn toàn bộ Sheet chỉ chừa lại sheet Home:
Mã:
Public Sub ShowAllWS()
    Dim WS As Worksheet

    For Each WS In ThisWorkbook.Worksheets
        'HIEN TOAN BO SHEET
        WS.Visible = xlSheetVisible
    Next WS
End Sub
Mã:
Public Sub HideAllWS()
    Dim WS As Worksheet
    
    '//BẪY LỖI - BUỘC HIỆN SHEET HOME
    On Error Resume Next
    ThisWorkbook.Sheets("Home").Visible = xlSheetVisible
    On Error GoTo 0
    
    For Each WS In ThisWorkbook.Worksheets
        If WS.Name <> "Home" Then
            If WS.Visible = xlSheetVisible Then
                WS.Visible = xlSheetVeryHidden
            End If
        End If
    Next WS
End Sub
Bước 4: Vì Sheet Setting chứa thông tin đăng nhập. Nên khi đăng nhập bằng tài khoản User, Sheet Setting sẽ không được hiện, chỉ hiện khi đăng nhập bằng tài khoản Admin.

Vì lý do đó, Ta cần ẩn Sheet Setting trước khi đóng file và chỉ hiện lại khi đăng nhập bằng tài khoản admin. Nghĩ đến đây, ta cần chắc chắn code chỉ được thực thi khi file được đóng thật sự. Đến đây, bạn cần đọc bài viết

Code sau đây sẽ được đặt trong Thisworkbook
Mã:
Private WorkbookClosing As Boolean

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  WorkbookClosing = True
End Sub

Private Sub Workbook_Deactivate()
  On Error Resume Next
  If WorkbookClosing And ThisWorkbook.Name = ActiveWindow.Caption Then
    Workbook_Closing
  Else
    WorkbookClosing = False
  End If
End Sub

Private Sub Workbook_Closing()
  Call HideAllWS
End Sub
Nút Login sẽ được thêm sự kiện hiện Sheet khi đăng nhập, code đóng 19, 27 được thêm.
Mã:
Private Sub btLogic_Click()
Dim ckID As Boolean
Dim arrID As Variant
Dim i As Long

'//BAY LOI NHAP THIEU THONG TIN
If tbID.Value = "" Or tbPW.Value = "" Then
    MsgBox "Ban chua nhap du thong tin dang nhap", vbInformation
    Exit Sub
End If

'//CHECK THONG TIN ID VA PASSWORD
arrID = ThisWorkbook.Sheets("Setting").Range("A3:B30").Value
For i = LBound(arrID, 1) To UBound(arrID, 1)

    '//NEU DANG NHAP LA ADMIN
    If tbID.Value = "admin" And tbPW.Value = strPW Then
        ckID = True
        Call ShowAllWS
        ThisWorkbook.Sheets(SHEET_SETTING).Visible = True
        Exit For
    End If
    
    '//NEU DANG NHAP BANG USER
    If tbID.Value = CStr(arrID(i, 1)) And tbPW.Value = CStr(arrID(i, 2)) Then
        ckID = True
        Call ShowAllWS
        ThisWorkbook.Sheets(SHEET_SETTING).Visible = xlVeryHidden
        Exit For
    End If
Next i

'//XU LY
If ckID = True Then
    '//AN MAN HINH DANG NHAP
    Me.Hide

    '//HIEN LAI FILE EXCEL
    Windows(ThisWorkbook.Name).Visible = True
Else
    '//DEM SO LAN DANG NHAP SAI
    intCountLogin = intCountLogin + 1
    If intCountLogin >= 3 Then ThisWorkbook.Close False
    
    MsgBox "Ban da nhap sai tai khoan hoac Password", vbInformation
    Exit Sub
End If

End Sub
File mẫu: tải về
 
Top