• Sử dụng window account cho việc phân quyền trong access
  • Sử dụng window account cho việc phân quyền trong access

    tvn_hut > 23-10-17, 11:08 AM

    Hi All
    Mình muốn phát triển 1 ý tưởng. khi viết chương trình access, chúng ta thường phải xây dựng form login, dựa vào đó sẽ phân quyền cho mỗi user khác nhau. Hiện tại trong máy tính ở công ty, chúng ta hay dùng user đăng nhập vào window. Tất cả tên user đã được lưu trữ tại một table. Vậy làm cách nào chúng ta có thể lấy tên user ấy trên window - không cần care tới password (ví dụ như ngt1hc) để so sánh với user trong bảng nơi đã define phân quyền. Chỉ cẩn mở chương trình, phụ thuộc vào tên user thì user đó sử dụng được những chức năng đã được phân quyền. Anh em nào đã phát triển rồi thì cho mình chút gợi ý nhé. mình xin cảm ơn cả nhà.
  • RE: Sử dụng window account cho việc phân quyền trong access

    ongke0711 > 23-10-17, 11:21 AM

    Lấy user name của windows bạn dùng hàm ENVIRON.

    ---------------------------------------------------------------
    Public Function GetUserName () As String
       GetUserName= VBA.Environ ("username")
    End Function
    ---------------------------------------------------------------

    PS: Thêm "VBA" để tránh lỗi "Unknown function" trong Access 2007.
  • RE: Sử dụng window account cho việc phân quyền trong access

    tvn_hut > 23-10-17, 01:11 PM

    (23-10-17, 11:21 AM)ongke0711 Đã viết: Lấy user name của windows bạn dùng hàm ENVIRON.
    UserName= Environ ("username")

    Cám ơn bạn nhé. bạn có code không có thể share cho anh em tham khảo được ko? tại khi đọc trên web thì họ sư dụng hàm rất phức tạp.
  • RE: Sử dụng window account cho việc phân quyền trong access

    ongke0711 > 24-10-17, 10:15 PM

    (23-10-17, 01:11 PM)tvn_hut Đã viết: Cám ơn bạn nhé. bạn có code không có thể share cho anh em tham khảo được ko? tại khi đọc trên web thì họ sư dụng hàm rất phức tạp.

    Code demo lấy User đăng nhập của windows thì không khó nhưng theo tôi thì ý tưởng lấy Users của Windows (hoặc NetworkID) để đăng nhập ứng dụng Access không được an toàn và linh hoạt vì các lý do sau:
    - Máy tính người nào thì người đó xài, không thể mượn máy để đăng nhập ứng dụng Access khi máy tính mình bị sự cố gì đó.
    - Ứng dụng của bạn phụ thuộc hoàn toàn vào Username/pass của Windows. Nếu tài khoản Windows này bị h@ck thì ứng dụng của bạn cũng mất an toàn. 
    - Nếu ai đó nhảy vào sử dụng máy tính của User có quyền cao nhất trong ứng dụng của bạn (khi User đó di đâu đó mà chưa lock máy), họ táy máy hoặc có ý đồ xấu thì cũng toi ứng dụng của bạn.
    - Phụ thuộc vào việc đặt tên UserName của nhân viên IT quản lý mạnh máy tính.
    Nếu dùng Username tự tạo riêng của ứng dụng thì User đó có thể dùng bất kỳ máy tính nào để đăng nhập ứng dụng với quyền của mình. Admin của ứng dùng có toàn quyền, không phụ thuộc IT bên mạng máy tính.
    Trước mắt thì tôi thấy có mấy ý như vậy.

    Dưới đây là hàm lấy Username của Windows bằng hàm API, thay thế cái hàm Environ() vì hàm này không bảo mật cao, dễ bị h@ck. Người ta có thể can thiệp vào  Username trả về của hàm Environ () bằng lệnh trong CMD

    Mã PHP:
    Option Explicit

    Public Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As StringnSize As Long) As Long

    Public Function UserName() As String
       On Error 
    GoTo EH
       Dim lngLen 
    As Long
       Dim strTemp 
    As String 256
       Dim strUserName 
    As String

       lngLen 
    256
       GetUserName strTemp
    lngLen
       strUserName 
    Trim$(Left$(strTemplngLen 1))
       UserName strUserName
       Exit 
    Function
    EH:
       MsgBox "There was an error getting the User Name!  " _
              
    "Please contact your Database Administrator."vbOKOnly"WARNING!"
       Exit Function
    End Function 

    Bạn muốn sử dụng hàm này cũng đơn giản. Ở cái form Main mà bạn Open khi khởi động ứng dụng, tạo 1 textbox để lưu Username (txtUserName), 1 texbox lưu QUyền (txtQuyen). Ở sự kiện On Open dùng code sau:


    Me.txtUserName = UserName
    Me.txtQUyen = DLookup (“Quyen”,”tblUsers”,”UserName = ‘” & Me.txtUserName & “’”)

    Tôi dùng textbox lưu UserName và Quyền thay vì dùng biến toàn cục vì biến toàn cục không thể tin tưởng hoàn toàn, nó có thể không bị mất vì lý do nào đó của hệ thống. Nếu là Textbox nằm trên Form thì nó lúc nào cũng nằm đó, bạn có thể cho "Ẩn" form đi và chỉ đóng khi đóng ứng dụng.
  • RE: Sử dụng window account cho việc phân quyền trong access

    tvn_hut > 30-10-17, 11:36 PM

    (24-10-17, 10:15 PM)ongke0711 Đã viết:
    (23-10-17, 01:11 PM)tvn_hut Đã viết: Cám ơn bạn nhé. bạn có code không có thể share cho anh em tham khảo được ko? tại khi đọc trên web thì họ sư dụng hàm rất phức tạp.

    Code demo lấy User đăng nhập của windows thì không khó nhưng theo tôi thì ý tưởng lấy Users của Windows (hoặc NetworkID) để đăng nhập ứng dụng Access không được an toàn và linh hoạt vì các lý do sau:
    - Máy tính người nào thì người đó xài, không thể mượn máy để đăng nhập ứng dụng Access khi máy tính mình bị sự cố gì đó.
    - Ứng dụng của bạn phụ thuộc hoàn toàn vào Username/pass của Windows. Nếu tài khoản Windows này bị h@ck thì ứng dụng của bạn cũng mất an toàn. 
    - Nếu ai đó nhảy vào sử dụng máy tính của User có quyền cao nhất trong ứng dụng của bạn (khi User đó di đâu đó mà chưa lock máy), họ táy máy hoặc có ý đồ xấu thì cũng toi ứng dụng của bạn.
    - Phụ thuộc vào việc đặt tên UserName của nhân viên IT quản lý mạnh máy tính.
    Nếu dùng Username tự tạo riêng của ứng dụng thì User đó có thể dùng bất kỳ máy tính nào để đăng nhập ứng dụng với quyền của mình. Admin của ứng dùng có toàn quyền, không phụ thuộc IT bên mạng máy tính.
    Trước mắt thì tôi thấy có mấy ý như vậy.

    Dưới đây là hàm lấy Username của Windows bằng hàm API, thay thế cái hàm Environ() vì hàm này không bảo mật cao, dễ bị h@ck. Người ta có thể can thiệp vào  Username trả về của hàm Environ () bằng lệnh trong CMD

    Mã PHP:
    Option Explicit

    Public Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As StringnSize As Long) As Long

    Public Function UserName() As String
       On Error 
    GoTo EH
       Dim lngLen 
    As Long
       Dim strTemp 
    As String 256
       Dim strUserName 
    As String

       lngLen 
    256
       GetUserName strTemp
    lngLen
       strUserName 
    Trim$(Left$(strTemplngLen 1))
       UserName strUserName
       Exit 
    Function
    EH:
       MsgBox "There was an error getting the User Name!  " _
              
    "Please contact your Database Administrator."vbOKOnly"WARNING!"
       Exit Function
    End Function 

    Bạn muốn sử dụng hàm này cũng đơn giản. Ở cái form Main mà bạn Open khi khởi động ứng dụng, tạo 1 textbox để lưu Username (txtUserName), 1 texbox lưu QUyền (txtQuyen). Ở sự kiện On Open dùng code sau:


    Me.txtUserName = UserName
    Me.txtQUyen = DLookup (“Quyen”,”tblUsers”,”UserName = ‘” & Me.txtUserName & “’”)

    Tôi dùng textbox lưu UserName và Quyền thay vì dùng biến toàn cục vì biến toàn cục không thể tin tưởng hoàn toàn, nó có thể không bị mất vì lý do nào đó của hệ thống. Nếu là Textbox nằm trên Form thì nó lúc nào cũng nằm đó, bạn có thể cho "Ẩn" form đi và chỉ đóng khi đóng ứng dụng.

    Mình cảm ơn những chia sẻ của ongke0711, dĩ nhiên mình hiểu nếu làm như vậy thì sự bảo mật sẽ ko cao nhưng nó thuận tiện cho người sử dụng vì không cần phải nhớ pass. vào là sử dụng liền. Mình đã làm theo hướng dẫn của bạn nhưng nó vẫn báo lỗi: run time eror "91" - Object variable or with block variable not set. và nó chỉ tới dòng :  gobjRibbon.InvalidateControl "tab1". Việc sử dụng phân quyền mình có tham khảo của MTNQ - phải nói là rất đơn giản nhưng rất hay. mình có thể áp dụng khi xây dựng form login nhưng khi sử dụng windown account thì lại báo lỗi như vậy. Bài toán của mình là xây dựng 3 tab, trong mỗi tab có 2 đến 3 nhóm lệnh. Chỉ cần làm được như vậy là có thể giải quyết xong vấn đề.

    Đây là file demo của mình, mong các bạn chỉ dẫn giúp nó đang chạy sai chỗ nào. 

    https://drive.google.com/open?id=0Bwa-4B...TZNU196OTg
  • RE: Sử dụng window account cho việc phân quyền trong access

    ongke0711 > 01-11-17, 01:47 PM

    (30-10-17, 11:36 PM)tvn_hut Đã viết: ...
    Mình đã làm theo hướng dẫn của bạn nhưng nó vẫn báo lỗi: run time eror "91" - Object variable or with block variable not set. và nó chỉ tới dòng :  gobjRibbon.InvalidateControl "tab1". Việc sử dụng phân quyền mình có tham khảo của MTNQ - phải nói là rất đơn giản nhưng rất hay. mình có thể áp dụng khi xây dựng form login nhưng khi sử dụng windown account thì lại báo lỗi như vậy. Bài toán của mình là xây dựng 3 tab, trong mỗi tab có 2 đến 3 nhóm lệnh. Chỉ cần làm được như vậy là có thể giải quyết xong vấn đề.

    Đây là file demo của mình, mong các bạn chỉ dẫn giúp nó đang chạy sai chỗ nào. 

    https://drive.google.com/open?id=0Bwa-4B...TZNU196OTg

    Bạn sửa dòng code của Sub UpdateRibbon như bên dưới:

    Mã PHP:
    Public Sub UpdateRibbon()
       If (Not gobjRibbon Is NothingThen
           gobjRibbon
    .InvalidateControl "tab1"
           gobjRibbon.InvalidateControl "tab2"
           gobjRibbon.InvalidateControl "tab3"

           gobjRibbon.InvalidateControl "grp1_1"
           gobjRibbon.InvalidateControl "grp1_2"
           gobjRibbon.InvalidateControl "grp2_1"
           gobjRibbon.InvalidateControl "grp2_2"
           gobjRibbon.InvalidateControl "grp2_3"
       End If
    End Sub