-
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
-
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 String, nSize 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$(strTemp, lngLen - 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 String, nSize 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$(strTemp, lngLen - 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 Nothing) Then
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