Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 2 của 2
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Phân Quyền (Phần I : Phân quyền trên Menu)

    Chào các bạn,

    Như tất cả chúng ta biết các ứng dụng thông thường đều có nhu cầu phân quyền cho các user (các nhóm người sử dụng) nghĩa là user sau khi đăng nhập vào ứng dụng thì user đó được phép sử dụng những màn hình nào (thường thì truy cập từ menu) và những chức năng nào trên màn hình đó (phân quyền trên Form : Vấn đề này tôi sẽ viết ở Phần II).

    Trong bài viết này tôi sẽ chia sẻ với các bạn 1 cách thức phân quyền trên menu. Ý tưởng của cách làm này như sau :
    - Đầu tiên chúng ta thiết kế 5 tables sau :

    + User : Table nào chứa các thông tin về người sử dụng.
    + Group : Chứa thông tin về nhóm người sử dụng.
    + UserGroup : Cho biết users thuộc về group(s) nào.
    + Menu : Chứa thông tin về menu chính (dữ liệu được lấy từ menu được design trên Form Main) của ứng dụng. Menu chính khi thiết kế sẽ cần có thêm 1 giá trị bắt buôc như sau: Nếu menuItem đó liên kết tới 1 Form nào đó thì cần set value (tên Form) cho thuộc tính Tag của MenuItem này.
    + MenuGroup : Cho biết 1 nhóm nào đó thì được phép sử dụng những menu nào của ứng dụng.

    Hình Database Diagram :


    - Sau khi đã có các tables trên thì chúng ta sẽ làm 3 Forms (frmUser, frmGroup, frmAuthorizarion) để danh cho việc thêm, sửa, xóa dữ liệu trên 4 tables : User, Group, UserGroup & MenuGroup.

    Form chính dùng cho việc phân quyền là frmAuthorization :
    Hình Form Authorization :


    - Trên Form này có 2 phần : 1 bên là list các group (TreeView) & 1 bên là Menu được BindData từ table Menu trong DB.
    - Khi user click vào 1 group nào đó thì các menuItem mà group đó được phép sử dụng sẽ được checked.
    - Khi [admin user] click nút sửa thì sẽ cho phép họ phân quyền trên menu bằng cách click trên từng menuItem.

    Khi click menuItem này sẽ có 2 tình huống xảy ra :
    + Nếu menuItem chưa được chọn thì nó sẽ được chọn (checked của menuItem là true và tất cả các subMenu(nếu có) sẽ được checked theo).
    + Nếu menuItem đã được chọn thì sẽ bỏ checked của menuItem này cũng như tất cả các subMenu (nếu có).

    Sau khi họ sửa xong (phân quyền) thì sự thay đổi đó sẽ được lưu xuống DB bằng cách Click Save Button.

    => Mỗi lần các user chạy chương trình thì sẽ lấy dữ liệu từ DB để Bind cho Menu chính của chương trinh (nếu user không có quyền đối với Menu nào thì menu đó sẽ bị Disabled hoặc không hiện ra).

    Các bạn có thể coi chi tiết hơn trong attached file : Bao gồm Database và project hoàn chỉnh. Muốn chạy project này trước tiên phải restore Database tên là Framework.bak nằm trong thư mục DB. Sau đó sửa lại ConnectionString trong file app.config tương ứng với máy của mọi người.


    Note :
    Khi chạy lần đầu tiên thì table Menu trong DB chưa có giá trị do đó cần phải Insert dữ liệu từ Menu đã được Design trên Form Main xuống DB bằng cách click button [Update Menu] trên Form Main này. Button này được hiển thị khi giá trị DEBUGMODE trong file app.config là true.

    ====================Bổ Sung========================
    Khi các bạn tạo thêm các Form tương ứng với các Menu Item mới thì các bạn viết thêm code để gọi Form này trong sự kiện MenuItem_Click (sự kiện này được gọi khi Bind Menu từ DB lên).

    Giả sử tôi có 1 Form mới tên là frmTest và 1 Menu mới là TEST
    Function MenuItem_Click - Cần viết thêm code trong function này:

    Mã:
    private void MenuItem_Click(object sender, System.EventArgs e)        {            if (((ToolStripMenuItem)sender).Tag == null) return;            string frmName = ((ToolStripMenuItem)sender).Tag.ToString();            Form frm = null;            switch (frmName.ToLower())            {                #region "System"                                    #endregion                 #region "TEST"                case "frmtest"://chữ thường hết                    frm = new frmTest();                    break;                #endregion            }             if (frm != null)            {                frm.WindowState = FormWindowState.Maximized;                                frm.MdiParent = this;                                frm.Show();            }        }
    Còn đây là function ShowSubMenu - Bind Menu từ DB lên

    Mã:
    //Set MenuItem Click eventsubItem.Click += new System.EventHandler(MenuItem_Click);
    ================================================== =


    * Cái hình Form Authorization do trước đây không lấy được từ MediaFire do đó tôi up hình mới đã bao gồm cả phần phân quyền cho methods nên các bạn download về chạy sẽ không giống như hình trên mà chỉ có 1 TreeView ở bên trái và 1 toolStrip menu ở bên phải thôi. Hy vọng cuối tuần này sẽ post được tiếp Phần II.

    Phần II : http://forums.congdongcviet.com/showthread.php?t=28712

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Đang load về máy xem thử, cảm ơn bạn đã hướng dẫn !

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •