ProjectForStudy

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 677|ตอบกลับ: 27

[แบ่งปัน] การทำระบบการกำหนดสิทธิ์การเข้าใช้งาน ( User roles & Permission )

[คัดลอกลิงก์]
  • อารมณ์วันนี้
    แฮปปี้
    2 ชั่วโมงที่แล้ว
  • เช็คชื่อแล้ว: 302 วัน

    [LV.8]ConquerorI

    26

    กระทู้

    646

    โพสต์

    3087

    เครดิต

    RapterClaw

    Rank: 5Rank: 5

    เครดิต
    3087
    Ticket
    1962
    จิตพิสัย
    1125

    Merciful MemberInstructor

    สวัสดีทุกท่าน
    วันนี้ผมขอนำเสนอการทำระบบ การกำหนดสิทธิ์การเข้าใช้งาน ( User roles & Permission )
    คือการกำหนดให้ผู้ใช้งานในแต่ละ User ให้ใช้งานได้ในขอบเขตตามที่ถูกกำหนดได้เท่านั้น

    ข้างล่างนี้จะเป็นโครงสร้างหลักของตารางฐานข้อมูล สำหรับสร้างระบบ Roles & Permission
    หลัก ๆ จะมีตารางทั้งหมด 5 ตาราง ดังนี้


    ตัวอย่างโปรแกรมการสร้าง Role & Permission มีดังนี้
    จากตัวอย่างด้านล่างนี้ผมได้สร้างเอาไว้ 2 User ได้แก่
    admpuklit ==> เป็น admin จะเป็นผู้ที่กำหนด Roles & Permission ให้กับ User : puklit
    puklit ==> เป็น user

    1. หน้าฟอร์มสำหรับสร้าง Roles


    2. กำหนดหรือมอบหมายบทบาทหรือสิทธิ์ในแต่ละ Roles สามารถใช้งานอะไรได้บ้าง


    3. เลือก Roles ที่ได้กำหนดไว้มอบหมายให้กับ User ที่จะสามารถเข้าใช้งาน Roles นั้น ๆ ได้
    User : admpuklit (Admin) กำลังกำหนด Role & Permission ให้กับ User : puklit (User)


    4. ตัวอย่างการเข้าใช้งานของ User : puklit และการแสดงสิทธิ์เมนู Roles ที่ได้กำหนดไว้
    ผู้ใช้งานจะเห็นได้เฉพาะเมนูการใช้งานที่ได้กำหนดไว้เท่านั้นจากการกำหนด Role & Permission
    ไม่สามารถเข้าใช้งานอย่างอื่นนอกเหนือจากที่กำหนดไว้ได้


    แนวคิดนี้ผมถอดแบบระบบมาจากระบบใหญ่ ๆ ERP ที่มีการจัดการ Role & Permission สำหรับจัดการผู้เข้าใช้งานในแต่ละ Users
    หวังว่าคงเป็นประโยชน์กับหลาย ๆ ท่านนำไปประยุกต์ใช้งานกับโปรแกรมของท่านได้นะครับ

    ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

    คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

    x
  • อารมณ์วันนี้
    แฮปปี้
    2 ชั่วโมงที่แล้ว
  • เช็คชื่อแล้ว: 302 วัน

    [LV.8]ConquerorI

    26

    กระทู้

    646

    โพสต์

    3087

    เครดิต

    RapterClaw

    Rank: 5Rank: 5

    เครดิต
    3087
    Ticket
    1962
    จิตพิสัย
    1125

    Merciful MemberInstructor

     เจ้าของ| puklit โพสต์ 2019-5-8 09:24:10 | ดูโพสต์ทั้งหมด
    แก้ไขครั้งสุดท้ายโดย puklit เมื่อ 2019-5-8 09:38
    pattaphol ตอบกลับเมื่อ 2019-5-8 09:14
    สอบถามหน่อยครับ จะ group ข้อมูล ใน Gridcontrol แบบในกรอบสีเขียว ต้องทำยังไงครับ

    ผมใช้ Tree list ครับ ไม่ใช่ Gridcontrol
    https://documentation.devexpress.com/WindowsForms/2434/Controls-and-Libraries/Tree-List
    ส่วน Gridcontrol หากต้องการ group ตามคลิ๊ปด้านล่างนี้ครับ
    https://www.youtube.com/watch?v=kYzFDuOQaio


  • อารมณ์วันนี้
    เหนื่อย
    เมื่อวาน 09:13
  • เช็คชื่อแล้ว: 150 วัน

    [LV.7]JuniorIII

    19

    กระทู้

    235

    โพสต์

    493

    เครดิต

    TeenLion

    Rank: 3Rank: 3

    เครดิต
    493
    Ticket
    326
    จิตพิสัย
    167
    as.rockchat โพสต์ 2018-11-6 09:35:48 | ดูโพสต์ทั้งหมด
    ถ้าผมจะทำแบบนี้ ต้องใช้โปรแกรมอะไรบ้างครับ ในส่วนของ UI
    as.rockchat
  • อารมณ์วันนี้
    แฮปปี้
    2 ชั่วโมงที่แล้ว
  • เช็คชื่อแล้ว: 302 วัน

    [LV.8]ConquerorI

    26

    กระทู้

    646

    โพสต์

    3087

    เครดิต

    RapterClaw

    Rank: 5Rank: 5

    เครดิต
    3087
    Ticket
    1962
    จิตพิสัย
    1125

    Merciful MemberInstructor

     เจ้าของ| puklit โพสต์ 2018-11-6 10:13:28 | ดูโพสต์ทั้งหมด
    as.rockchat ตอบกลับเมื่อ 2018-11-6 09:35
    ถ้าผมจะทำแบบนี้ ต้องใช้โปรแกรมอะไรบ้างครับ ในส่วนของ UI

    ผมใช้ Devexpress ตัวเดียวครับ

    Third party มีทั้งแบบฟรีและเสียเงิน
    ขึ้นอยู่กับว่าท่านจะเลือกแบบไหน เพราะมันมีปัจจัยอื่นเข้ามาเกี่ยวข้องอีกเช่น
    1. ใช้งานง่ายหรือยาก
    2. เอกสารคู่มือการใช้งานมีหรือไม่ ถ้ามีครบถ้วนหรือไม่ / อ่านแล้วเข้าใจหรือไม่
    3. Support จากผู้ผลิตหากต้องการ

    ตัวอย่าง Third party
    https://www.infoq.com/research/dotnet-web-components


    แบบฟรีไม่เสียตัง (ตามเงื่อนไขการใช้งาน)

    Syncfusion
    https://www.syncfusion.com/products/communitylicense

    Metro UI Framwork
    https://www.youtube.com/watch?v=Ryxew9cgkZA

    ผมเพียงยกตัวอย่างมาให้ท่านดู มันยังมี UI หรือ Third party อีกเยอะ
    ลองหาดูครับเอาให้เหมาะกับตัวท่านว่าชอบตัวใหนหรือคิดว่าใช้ถนัดมือทีสุด

  • อารมณ์วันนี้
    เหนื่อย
    เมื่อวาน 09:13
  • เช็คชื่อแล้ว: 150 วัน

    [LV.7]JuniorIII

    19

    กระทู้

    235

    โพสต์

    493

    เครดิต

    TeenLion

    Rank: 3Rank: 3

    เครดิต
    493
    Ticket
    326
    จิตพิสัย
    167
    as.rockchat โพสต์ 2018-11-6 10:15:51 | ดูโพสต์ทั้งหมด
    แก้ไขครั้งสุดท้ายโดย as.rockchat เมื่อ 2018-11-6 10:19

    ขอบคุณครับ ผมกำลังหัดสร้าง ui แบบนี้ แต่ไมรู้ว่าเวลาเราเขียนโค้ด มันจะเขียนแบบปกติไหมครับ พี่เขียนด้วย C# ใช่ไหมครับ ผมใช้เป็นแค่ .net เดียวผมจะลองเขียนบ้าง555 ถ้าผมจะเข้ามาถามเกี่ยวกับการสร้างเป็นระยะๆ  จะรบกวนพี่ไหมครับ
    as.rockchat
  • อารมณ์วันนี้
    แฮปปี้
    2 ชั่วโมงที่แล้ว
  • เช็คชื่อแล้ว: 302 วัน

    [LV.8]ConquerorI

    26

    กระทู้

    646

    โพสต์

    3087

    เครดิต

    RapterClaw

    Rank: 5Rank: 5

    เครดิต
    3087
    Ticket
    1962
    จิตพิสัย
    1125

    Merciful MemberInstructor

     เจ้าของ| puklit โพสต์ 2018-11-6 10:50:38 | ดูโพสต์ทั้งหมด
    แก้ไขครั้งสุดท้ายโดย puklit เมื่อ 2018-11-9 10:24
    as.rockchat ตอบกลับเมื่อ 2018-11-6 10:15
    ขอบคุณครับ ผมกำลังหัดสร้าง ui แบบนี้ แต่ไมรู้ว่าเวลาเ ...

    จะ C# หรือ VB.net ก็ได้ครับ แต่ผมหัด VB.net ก่อนจะมา C#
    เพราะพื้นฐานผมมาจาก VBA Excel ถ้าจะให้ดีท่านลองเขียนทั้ง 2 คู่กันไปเลยครับ
    ท่านจะได้ความรัดกุมในการเขียนโค้ดจาก C# เข้ามาช่วยหากท่านเขียน VB.net
    และช่วยยกระดับการเขียนโค้ดใน VB.net ให้ดีขึ้น ความท้าทายแรกที่ผมเจอยกตัวอย่างได้ ดังนี้
    1. VB.net สามารถเรียกฟอร์มตรงตัวได้ แต่ C# ต้องสร้างและเรียกผ่าน Instance หรือ Object ของ Class Form เท่านั้น
    2. VB.net มี Module ให้ใช้งาน แต่ C# ไม่มี Module ให้ใช้งาน ต้องเขียนผ่าน Class เท่านั้น3. ค่อย ๆ ซึมซับหลักการ OOP ทีละเล็กน้อย (แบบมึนๆ งง)

    ผมจะสร้างแบบ ให้ผู้ใช้งานสามารถเลือก Skin ได้ตามใจชอบครับ


    ตัวอย่างฟอร์มเดียวกัน
    ตัวอย่างการเปลี่ยน skin เป็นรูปแบบอื่น ๆ จากฟอร์มเดียวกัน


    UI เป็นส่วนที่ผมมองเป็นสิ่งสุดท้ายครับ สิ่งที่ผมมองอันดับแรกคือ Controls ต่างหาก
    ที่จะเข้ามาช่วยลดการทำงานการเขียนโปรแกรมของผมให้ใช้เวลาน้อยลงแต่มองกลับกัน User จะบ่นว่า เห้ยทำไม่ UI หน้าตามันธรรมดา บ้านนอกขนาดนั้น 555
    ทั้ง ๆ ที่คนเขียนจะเน้น Performance มาก่อน สรุปคือ Performance นำ UI ตาม

    ส่วนการเขียนโค้ดก็เขียนเหมือนกันครับ ยกเว้นท่านจะใช้ Controls เฉพาะของ Third part นั้น ๆ
    มันจะมี Methods / Events / Properties เพิ่มเติมเข้ามาให้เราใช้งาน
    นอกเหนือจาก Standard controls ของ .Net
    แต่พื้นฐานการเขียนก็ยังคงเหมือนเดิมครับ

    อย่างของ Devexpress ผมจะใช้ Controls ของ Devexpress ทั้งหมดครับ ตั้งแต่ label ยัน Gridview
    เพราะผมพบว่าตอนเปลี่ยน UI หากใช้ Standard controls ของ .net บางตัวมันจะไม่ Support การเปลี่ยน UI
    แต่ Third party บางเจ้าก็ Support การเปลี่ยน UI กับ Standard controls ของ .net ลองดูครับ
    แล้วท่านจะพบทางออก


    ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

    คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

    x
  • อารมณ์วันนี้
    เหนื่อย
    เมื่อวาน 09:13
  • เช็คชื่อแล้ว: 150 วัน

    [LV.7]JuniorIII

    19

    กระทู้

    235

    โพสต์

    493

    เครดิต

    TeenLion

    Rank: 3Rank: 3

    เครดิต
    493
    Ticket
    326
    จิตพิสัย
    167
    as.rockchat โพสต์ 2018-11-6 10:57:55 | ดูโพสต์ทั้งหมด
    ครับ
    as.rockchat
  • อารมณ์วันนี้
    เหนื่อย
    เมื่อวาน 09:13
  • เช็คชื่อแล้ว: 150 วัน

    [LV.7]JuniorIII

    19

    กระทู้

    235

    โพสต์

    493

    เครดิต

    TeenLion

    Rank: 3Rank: 3

    เครดิต
    493
    Ticket
    326
    จิตพิสัย
    167
    as.rockchat โพสต์ 2019-3-15 10:48:23 | ดูโพสต์ทั้งหมด
    พี่ครับ มีตัวอย่างในการกำหนดในฐานข้อมูลไหมครับ พยายามทำแล้ว คิดไม่ออกจริงๆ
    as.rockchat
  • อารมณ์วันนี้
    แฮปปี้
    2 ชั่วโมงที่แล้ว
  • เช็คชื่อแล้ว: 302 วัน

    [LV.8]ConquerorI

    26

    กระทู้

    646

    โพสต์

    3087

    เครดิต

    RapterClaw

    Rank: 5Rank: 5

    เครดิต
    3087
    Ticket
    1962
    จิตพิสัย
    1125

    Merciful MemberInstructor

     เจ้าของ| puklit โพสต์ 2019-3-15 14:23:24 | ดูโพสต์ทั้งหมด
    แก้ไขครั้งสุดท้ายโดย puklit เมื่อ 2019-3-16 08:04
    as.rockchat ตอบกลับเมื่อ 2019-3-15 10:48
    พี่ครับ มีตัวอย่างในการกำหนดในฐานข้อมูลไหมครับ พยายามทำแล้ว คิดไม่ออกจริงๆ

    ฐานตัวอย่างข้อมูลจริง เป็น SQL Server แต่ผมจำลองเป็น MS Access ให้ครับ

    นี่เป็น Database Relationship ใช้ ตารางทั้งหมด 9 ตารางดังนี้
    (เฉพาะการจัดการ Roles & Permission เท่านั้น ไม่รวมกับฐานข้อมูลของตัวโปรแกรม)



    ตัวอย่าง Query ที่ใช้ดึงรายการตามที่ได้กำหนดไว้ให้
    ชื่อ Query_UserRole_Permission



    SQL command (ตอนนำไปใส่โปรแกรมผมจะเลือกแสดงตามภาษาที่เลือกจากการตั้งค่าแสดงผลจากฟิล์ดนี้)dbo_SYS_Menu.Menu_TextEN เมนูภาษาอังกฤษ
    dbo_SYS_Menu.Menu_TextTH เมนูภาษาไทย
    1. SELECT DISTINCT dbo_SYS_User_Role_Menu.MenuId, dbo_SYS_Menu.ParentMenuId, dbo_SYS_Menu.Menu_TextEN, dbo_SYS_Menu.Form_Name, dbo_SYS_Menu.Form_Icon
    2. FROM (dbo_SYS_Menu INNER JOIN dbo_SYS_User_Role_Menu ON dbo_SYS_Menu.MenuId = dbo_SYS_User_Role_Menu.MenuId) INNER JOIN dbo_SYS_User_Role_Permission ON dbo_SYS_User_Role_Menu.Role_ID = dbo_SYS_User_Role_Permission.Role_ID
    3. WHERE (((dbo_SYS_Menu.Form_IsActived)=True) AND ((dbo_SYS_User_Role_Permission.User_ID)="puklit"))
    4. ORDER BY dbo_SYS_User_Role_Menu.MenuId, dbo_SYS_Menu.ParentMenuId;
    คัดลอกไปที่คลิปบอร์ด

    ผลลัพธ์ที่ได้



    ตัวอย่างที่นำไปแสดงบนฟอร์มหลัก  (ในรูปแบบ Treelist DevExpress)

    แสดงฟอร์ม ตามที่เลือกตั้งค่าภาษา
    ภาษาอังกฤษ


    ภาษาไทย


    ตัวอย่างโค้ดที่ผมใช้ในโปรแกรม C#
    1.        #region(แสดงเมนู ฟอร์ม)

    2.         private void Show_Menu()
    3.         {

    4.             try
    5.             {

    6.                 string _Language = Properties.Settings.Default.App_Language; // เก็บภาษาที่กำหนดไว้เพื่อนำมาแสดงใน Treelist
    7.                 string sqlstr = "";

    8.                 tlMenu.ClearNodes();

    9.                 ClsConnectDB.DBOpen();
    10.                 ClsUser U = new ClsUser();
    11.                 ClsTreelist ctl = new ClsTreelist();

    12.                 if (ClsUser.info.Group == U.UserGroup(ClsUser.User_Group.Admin))
    13.                 {

    14.                     sqlstr = @"SELECT MenuId, ParentMenuId, Menu_Text"+ _Language+ ", Form_Name, Form_Icon FROM SYS_Menu " +
    15.                               "ORDER BY ParentMenuId, MenuId";
    16.                     
    17.                     ctl.Show_Dataset(tlMenu, sqlstr, "SYS_Menu", "ParentMenuId", "MenuId"); // แสดงเมนูใน Treelist

    18.                 }
    19.                 else
    20.                 {

    21.                     sqlstr = @"SELECT DISTINCT SYS_User_Role_Menu.MenuId, SYS_Menu.ParentMenuId, SYS_Menu.Menu_Text"+ _Language +", SYS_Menu.Form_Name, SYS_Menu.Form_Icon " +
    22.                              @"FROM SYS_User_Role_Permission INNER JOIN
    23.                                SYS_User_Role_Menu ON SYS_User_Role_Permission.Role_ID = SYS_User_Role_Menu.Role_ID INNER JOIN
    24.                                SYS_Menu ON SYS_User_Role_Menu.MenuId = SYS_Menu.MenuId
    25.                                WHERE (SYS_Menu.Form_IsActived = 1) AND (SYS_User_Role_Permission.User_ID = '" + ClsUser.info.ID + "') " +
    26.                               "ORDER BY SYS_Menu.ParentMenuId, SYS_User_Role_Menu.MenuId";

    27.                     ctl.Show_Dataset(tlMenu, sqlstr, "SYS_User_Role_Permission", "ParentMenuId", "MenuId"); // แสดงเมนูใน Treelist

    28.                 }
    29.                
    30.                 Set_Tree(); // ตั้งค่า Treelist
    31.                 ctl.HideNodes(tlMenu.Nodes); // ซ่อน Node ที่ไม่มี Parent node

    32.             }
    33.             catch (Exception ex)
    34.             {
    35.                 XtraMessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    36.             }
    37.             finally
    38.             {
    39.                 ClsConnectDB.DBClose();
    40.             }

    41.         }

    42.         // เปิดฟอร์มที่เลือกจาก Treelist
    43.         private void tlMenu_DoubleClick(object sender, EventArgs e)
    44.         {

    45.             try
    46.             {

    47.                 TreeListMultiSelection selectedNodes = tlMenu.Selection;
    48.                 string note_frm = selectedNodes[0].GetValue(tlMenu.Columns[1]).ToString();
    49.                 if (!String.IsNullOrEmpty(note_frm))
    50.                 {
    51.                     this.Activate();
    52.                     ClsForm frm = new ClsForm();
    53.                     frm.Show_Active(note_frm);
    54.                 }
    55.                 else
    56.                 {
    57.                     return;
    58.                 }

    59.             }
    60.             catch { }
    61.             
    62.         }

    63.         #endregion
    คัดลอกไปที่คลิปบอร์ด

    ดาวโหลดตัวอย่างฐานข้อมูล ไฟล์ MS Access


    ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

    คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

    x
  • อารมณ์วันนี้
    เหนื่อย
    เมื่อวาน 09:13
  • เช็คชื่อแล้ว: 150 วัน

    [LV.7]JuniorIII

    19

    กระทู้

    235

    โพสต์

    493

    เครดิต

    TeenLion

    Rank: 3Rank: 3

    เครดิต
    493
    Ticket
    326
    จิตพิสัย
    167
    as.rockchat โพสต์ 2019-3-15 18:58:45 | ดูโพสต์ทั้งหมด
    ตอนนี้ผมกำลังงงเลย ว่าจะดึงมาแสดงที่ treeview ผมดึงมาแล้ว มันแสดงแค่ 1 row ใน columns นั้น
    as.rockchat
  • อารมณ์วันนี้
    เหนื่อย
    เมื่อวาน 09:13
  • เช็คชื่อแล้ว: 150 วัน

    [LV.7]JuniorIII

    19

    กระทู้

    235

    โพสต์

    493

    เครดิต

    TeenLion

    Rank: 3Rank: 3

    เครดิต
    493
    Ticket
    326
    จิตพิสัย
    167
    as.rockchat โพสต์ 2019-5-1 16:26:08 | ดูโพสต์ทั้งหมด
    พี่ครับรบกวนอีกที่ครับ พอมีโปรแกรมตัวอย่างไหมครับ
    as.rockchat
    ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

    รายละเอียดเครดิต

    ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|ProjectForStudy  

    GMT+7, 2019-7-19 08:56 , Processed in 0.056428 second(s), 28 queries .

    Powered by Discuz! X3.2 R20150609, Rev.38

    © 2001-2013 Comsenz Inc.

    ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้