Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Thủ Thuật] Sử dụng window account cho việc phân quyền trong access
#1
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à.
Chữ ký của tvn_hut Xin chào, mình là Dameaccess, Tham gia http://thuthuataccess.com/forum từ ngày 06-06 -13.
Reply
Những người đã cảm ơn
#2
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.
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn tvn_hut
#3
(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.
Chữ ký của tvn_hut Xin chào, mình là Dameaccess, Tham gia http://thuthuataccess.com/forum từ ngày 06-06 -13.
Reply
Những người đã cảm ơn
#4
(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.
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn maidinhdan , tvn_hut
#5
(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
Chữ ký của tvn_hut Xin chào, mình là Dameaccess, Tham gia http://thuthuataccess.com/forum từ ngày 06-06 -13.
Reply
Những người đã cảm ơn
#6
(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 
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Noname , maidinhdan , tvn_hut


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  Hướng Dẫn Hàm kiểm tra dữ liệu để import dữ liệu từ excel vào access subasatran 14 710 16-11-18, 01:36 AM
Bài mới nhất: maidinhdan
  [Thủ Thuật] Demo Tổng hợp tất cả các kiểu thông báo tiếng việt trong Access maidinhdan 39 8,469 22-09-18, 12:40 PM
Bài mới nhất: NguyenDungAnh
  [Help] SQL trong VBA chạy không đúng! NguyenDungAnh 12 657 07-09-18, 10:44 AM
Bài mới nhất: NguyenDungAnh
  Xin hỏi cách : Ép phần mềm phải dùng File có đuôi OCX cũ ledangvan 6 276 07-09-18, 10:42 AM
Bài mới nhất: ongke0711
  [Help] Tự chọn yes or no trong VBA khi chạy SQL NguyenDungAnh 7 413 26-08-18, 03:40 PM
Bài mới nhất: NguyenDungAnh

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ| PMA Nha Trang| Gỗ Acrylic Không Đường Line