Phân quyền truy cập cho Menu trong asp.net
Bài viết hướng dẫn phân quyền cho từng menu trong asp.net
I. Introduction
Trong bài viết trước tôi đã giới thiệu với các bạn kỹ thuật tạo ra dynamic menu lấy trong database. Bài viết này, tôi sẽ tiếp tục hướng dẫn bạn làm thế nào để phân quyền truy cập cho từng menu một và quyền này được cài đặt bởi admin trong hệ thống.
Trong bài viết trước tôi đã giới thiệu với các bạn kỹ thuật tạo ra dynamic menu lấy trong database. Bài viết này, tôi sẽ tiếp tục hướng dẫn bạn làm thế nào để phân quyền truy cập cho từng menu một và quyền này được cài đặt bởi admin trong hệ thống.
Trước tiên việc cần làm là design menu đa cấp và nhớ 2 giá trị sau:
- ValuePath của MenuItem
- Thuộc tính MaximumDynamicDisplayLevels của control Menu
II. ValuePath
ValuePath là thuộc tính lưu trữ giá trị đường dẫn tương đối của menu đó với menu gốc. Các bạn xem hình sẽ rõ:
Vậy, nếu ta quy định giá trị Value của MenuItems có dạng như sau:
ValuePath là thuộc tính lưu trữ giá trị đường dẫn tương đối của menu đó với menu gốc. Các bạn xem hình sẽ rõ:
Vậy, nếu ta quy định giá trị Value của MenuItems có dạng như sau:
1
2
3
4
5
| MenuItem Value ParentItem1 p1 SubMenuItem2 s1 SubSubItem1 ss1 SSubItem1 sss1 |
Thì giá trị ValuePath của MenuItems sẽ có dạng như sau:
1
2
3
4
5
| MenuItem ValuePath ParentItem1 p1 SubMenuItem2 p1/s1 SubSubItem1 p1/s1/ss1 SSubItem1 p1/s1/ss1/sss1 |
OK!. Giờ chúng ta sẽ xây dựng một hàm tên là getValuePath để tính toán và trả về valuePath của MenuItem, được thừa kế từ MenuId và MenuItemCollection từ database.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| private string getValuePath(Int32 Parent, DataTable dt) { int predecessor = Parent; StringBuilder valuePath = new StringBuilder(); valuePath.Append(Parent.ToString()); DataRow[] drPar; while (true) { drPar = dt.Select( "MenuID=" + predecessor); if (drPar[0][ "ParentID" ].ToString().Equals( "0" )) break ; valuePath.Insert(0, '/' ); valuePath.Insert(0,drPar[0][ "ParentID" ].ToString()); predecessor = Convert.ToInt32(drPar[0][ "ParentID" ].ToString()); } return valuePath.ToString(); } |
III. Menu Level
Bạn có thể thay đổi mức hiển thị tối đa cho menu (Maximum display levels) (ví dụ như MenuDepth) trong menu bằng cách add thêm một dòng code nữa vào sự kiện Page_Load của trang MasterPage khi !IsPostBack như thế này:
Bạn có thể thay đổi mức hiển thị tối đa cho menu (Maximum display levels) (ví dụ như MenuDepth) trong menu bằng cách add thêm một dòng code nữa vào sự kiện Page_Load của trang MasterPage khi !IsPostBack như thế này:
1
| menuBar.MaximumDynamicDisplayLevels = 3; |
Khi chúng ta set = 1
1
| menuBar.MaximumDynamicDisplayLevels = 1; |
Khi chúng ta set = 2
1
| menuBar.MaximumDynamicDisplayLevels = 2; |
Như bạn có thể nhìn thấy đấy, sau khi chúng ta làm xong thì kết quả sẽ được như vậy đó, còn lưu ý nữa là cái Maximum display Levels là mức cao nhất để hiển thị, cho nên trong database các bạn cũng phải thiết lập menu có mức đó, thì nó mới hiển thị, chứ không là không xong đâu! hì hì.
IV. Create a Menu with multiple Level
Để tạo được menu kiểu dạng này, thì bạn phải sửa lại hàm getMenu() ở bài trước như sau:
1
2
3
4
5
6
7
8
9
| foreach (DataRow dr in dt.Select( "ParentID >" + 0)) { MenuItem mnu = new MenuItem(dr[ "MenuName" ].ToString(), dr[ "MenuID" ].ToString(), "" , dr[ "MenuLocation" ].ToString()); //Code for Multiple Menu Levels string valuePath = getValuePath(Convert.ToInt32(dr[ "ParentID" ].ToString()),dt); menuBar.FindItem(valuePath).ChildItems.Add(mnu); //End Code for Multiple Menu Levels } |
Đoạn code trong dòng comment có nghĩa như sau:
- dòng đầu lấy ra giá trị ValuePath của MenuItem
- dòng thứ hai là dựa vào giá trị ValuePath vừa lấy được, tìm ra MenuItem tương ứng từ MenuItemsCollection và thêm một menu con là mnu vào menu đã tìm thấy.
IV. Menu Permission
Trước tiên tôi cần nói qua cho bạn biết cách mà tôi lưu trữ quyền người dùng được phép truy cập vào các menu có định dạng như sau:
- dòng đầu lấy ra giá trị ValuePath của MenuItem
- dòng thứ hai là dựa vào giá trị ValuePath vừa lấy được, tìm ra MenuItem tương ứng từ MenuItemsCollection và thêm một menu con là mnu vào menu đã tìm thấy.
IV. Menu Permission
Trước tiên tôi cần nói qua cho bạn biết cách mà tôi lưu trữ quyền người dùng được phép truy cập vào các menu có định dạng như sau:
1
| 1-11-12- |
Ở đây menuId là các giá trị được phân cách nhau bằng dấu ‘-’
Áp dụng quyền này để thực hiện phân quyền, chúng ta làm như sau:
B1: Thực hiện lấy quyền trong database và trả về một mảng string bằng hàm getUserPermissions(string username) và thực hiện cắt các ký tự ‘-’ ra khỏi chuỗi đó.
Áp dụng quyền này để thực hiện phân quyền, chúng ta làm như sau:
B1: Thực hiện lấy quyền trong database và trả về một mảng string bằng hàm getUserPermissions(string username) và thực hiện cắt các ký tự ‘-’ ra khỏi chuỗi đó.
1
2
3
4
5
| if (Session[ "username" ] == null) { return ; } String[] permissions = getUserPermissions(Session[ "username" ].ToString()).Split( '-' ); |
B2: Khi đã có trong tay quyền này, thì chúng ta sẽ cho phép hiển thị những menu nào được phép.
1
2
3
4
5
6
7
8
9
| if (!permissions.Contains(dr[ "MenuID" ].ToString())) { mnu.Enabled = false; mnu.ImageUrl = "denied.png" ; } else { mnu.Enabled = true; } |
Vậy là xong rồi đó! Bạn coi lại hình phía dưới nha
V. Url Validation
Tiếp theo chúng ta sẽ xử lý trường hợp người dùng cố tình click vào những menu không được phép này bằng hàm validateUrl(string url) như sau:
V. Url Validation
Tiếp theo chúng ta sẽ xử lý trường hợp người dùng cố tình click vào những menu không được phép này bằng hàm validateUrl(string url) như sau:
1
2
3
4
5
6
7
8
9
10
11
| ... DataRow[] drValidUrl = dt.Select( "MenuLocation like '%" + url + "%'" ); if (!(drValidUrl.Length == 0)) { String[] permissions = getUserPermissions(Session[ "username" ].ToString()).Split( '-' ); if (!permissions.Contains(drValidUrl[0][ "MenuID" ].ToString())) { Response.Redirect( "~/Denied.htm" ); } } ... |
Trong đó giá trị đầu vào chúng ta sẽ lấy request mà user gửi tới như sau:
1
| this.Request.Url.AbsolutePath |
Nếu được quyền truy cập thì sẽ cho truy cập tiếp, còn không thỉ redirect tới 1 trang báo lỗi như sau
copy mà không ghi nguồ, ko biết tìm ở đâu, ko biết bài trước là bài nào luôn.
Trả lờiXóahttp://www.hoclaptrinhweb.com/asp-net/phan-quyen-truy-cap-cho-menu-trong-asp-net-hltw5632.aspx#