求实现权限设置的好方法

Jenky 2009-05-23 11:12:24
有三个表,
表名 字段1 字段2 备注
menu menuid menuname 菜单列表
role roleid rolename 角色列表
mero roleid menuid 权限表

用了两个gridview,
左边的gridview1 的sql语句为select roleid,rolename from role order by roleid
右边的gridview2 的初始sql语句为 select menuid,menuname from menu order by menuid
在gridview2里增加了一个checkbox控件,

想实现:
1、点左边的gridview1根据取得的roleid值后查找mero表,根据mero表里是否有值,有的话在gridview2的checkbox打上勾。
2、根据gridview2的checkbox选中,将值保存入mero表中。

能给实例就最好了,谢谢



...全文
98 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
老龙友 2009-05-23
  • 打赏
  • 举报
回复


Public Function GetUserCrenticial(ByVal strUserName As String, ByVal strPassword As String) As String

Dim strPasswordHashed = mdlComm.Md5Hash(strPassword)
Dim tmpUser As New User
tmpUser.Uname = strUserName

Dim strTmp As String = tmpUser.GetProperties(strUserName)
If strTmp = "OK" Then
If tmpUser.Password = strPasswordHashed Then
Return "OK"
Else
Return "User name or password not correct!"
End If
Else
Return "User name or password not correct!"
End If

End Function

Public Function GetUserGroupACL(ByVal strUserGroup As String) As String
Dim strGroup() As String = Split(strUserGroup, "|")
Dim strACL, strTmp As String
Dim strSQL As String, dt As New DataTable

strACL = ""

Try
For i As Integer = 0 To strGroup.Length - 1
strSQL = "SELECT TOP 1 strACL FROM UserGroup WHERE UGName='" & strGroup(i) & "'"
dt.Clear()
sqlSelect(strSQL, dt)
If dt.Rows.Count > 0 Then
strTmp = dt.Rows(0).Item("strACL").ToString
strACL = mdlSetup.InstrAdd(strACL, strTmp)
End If
Next

Return strACL

Catch ex As Exception
Return ex.Message
Exit Function
End Try

End Function


Public Function GetProperties(ByVal Uname As String) As String

Dim strSQL As String, dt As New DataTable
strSQL = "SELECT TOP 1 * FROM [User] WHERE Uname='" & Uname & "'"
sqlSelect(strSQL, dt)
If dt.Rows.Count > 0 Then
With dt.Rows(0)
_Uname = Uname
_Ename = .Item("Ename").ToString
_Cname = .Item("Cname").ToString
_Group = .Item("Group").ToString
_Position = .Item("Position").ToString
_Password = .Item("Password")
_Worknumber = .Item("WorkNumber").ToString
_Online = .Item("Online")
_Enabled = .Item("Enabled")
_LastLoginDate = .Item("LastLoginDate")
_strACL = .Item("strACL").ToString
'用户权限还要加上GROUP的
_strACL = mdlSetup.InstrAdd(_strACL, GetUserGroupACL(Group))
_strHostLab = .Item("strHostLab").ToString
_strSBU = .Item("strSBU").ToString
End With
Return "OK"
Else
Return "Record does not exist."
End If
End Function

老龙友 2009-05-23
  • 打赏
  • 举报
回复
干脆把这一段也给你吧,免得你看不懂


Private _Uname, _Ename, _Cname, _Group, _Position, _Password, _Worknumber As String
Private _Online, _Enabled As Boolean
Private _LastLoginDate As Date
Private _strACL, _strHostLab, _strSBU As String
Public Property Uname() As String
Get
Return _Uname
End Get
Set(ByVal value As String)
_Uname = value
End Set
End Property
Public ReadOnly Property Ename() As String
Get
Return _Ename
End Get
End Property
Public ReadOnly Property Cname() As String
Get
Return _Cname
End Get
End Property
Public ReadOnly Property Group() As String
Get
Return _Group
End Get
End Property
Public ReadOnly Property Position() As String
Get
Return _Position
End Get
End Property
Public ReadOnly Property Password() As String
Get
Return _Password
End Get
End Property
Public ReadOnly Property WorkNumber() As String
Get
Return _Worknumber
End Get
End Property
Public ReadOnly Property Online() As Boolean
Get
Return _Online
End Get
End Property
Public ReadOnly Property Enabled() As Boolean
Get
Return _Enabled
End Get
End Property
Public ReadOnly Property LastLoginDate() As Date
Get
Return _LastLoginDate
End Get
End Property
Public ReadOnly Property strACL() As String
Get
Return _strACL
End Get
End Property
老龙友 2009-05-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 Jenky 的回复:]
引用 8 楼 andywongz 的回复:
这和是不是WEB程序有关系吗?

给你提供一种思路。

我以前的WEB程序也是这样设置权限的。


你不要指望着人家把现成的正好符合你的代码都给你

那是不可能的。


呵呵
[/Quote]


再给你一段程序

不过估计你也懒得看了吧

像你这样的楼主,就得别人喂到你嘴边,你才满意




Public Sub SetACLforDLG(ByVal cc As Control.ControlCollection)

If cc Is Nothing Then Exit Sub

Dim strACLeditable, strACLvisible, strACLuser(), strACLgroup(), strType() As String
Dim ControlEditable As Boolean = False, ControlVisible As Boolean = False

For Each ctl As Control In cc

If Len(ctl.Tag) > 0 Then
strType = Split(ctl.Tag.ToString.Trim, ";")
strACLeditable = strType(0)
If strType.Length >= 2 Then
strACLvisible = strType(1)
Else
strACLvisible = ""
End If

Else
strACLeditable = ""
strACLvisible = ""
End If

'若不是运行数据库(可能是历史数据库),则只允许管理员操作
If strCurrentConn <> strConnST Then
If Len(strACLeditable) > 0 Then
strACLeditable = "ADMINISTRATORS"
End If
If Len(strACLvisible) > 0 Then
strACLvisible = "ADMINISTRATORS"
End If
End If

If Len(strACLeditable) > 0 Then

'用个人ACL衡量EditControl
strACLuser = Split(CurrentUser.strACL, "|")
For i As Integer = 0 To strACLuser.Length - 1
If strACLeditable = strACLuser(i) Or strACLuser(i) = "ADMINISTRATORS" Then
ControlEditable = True
Exit For
End If
Next

'用Group ACL衡量EditControl
strACLgroup = Split(GetUserGroupACL(CurrentUser.Group), "|")
For i As Integer = 0 To strACLgroup.Length - 1
If strACLeditable = strACLgroup(i) Or strACLgroup(i) = "ADMINISTRATORS" Then
ControlEditable = True
Exit For
End If
Next

ctl.Enabled = ControlEditable

End If

If Len(strACLvisible) > 0 Then
'用个人ACL衡量ViewControl
strACLuser = Split(CurrentUser.strACL, "|")
For i As Integer = 0 To strACLuser.Length - 1
If strACLvisible = strACLuser(i) Or strACLuser(i) = "ADMINISTRATORS" Then
ControlVisible = True
Exit For
End If
Next

'用Group ACL衡量ViewControl
strACLgroup = Split(GetUserGroupACL(CurrentUser.Group), "|")
For i As Integer = 0 To strACLgroup.Length - 1
If strACLvisible = strACLgroup(i) Or strACLgroup(i) = "ADMINISTRATORS" Then
ControlVisible = True
Exit For
End If
Next

ctl.Visible = ControlVisible

End If

If ctl.Controls.Count > 0 Then
Call SetACLforDLG(ctl.Controls) '递归调用
End If

Next
End Sub

Public Sub SetACLforMENU(ByRef cms As ContextMenuStrip)

Dim strACLuser() As String = Split(CurrentUser.strACL, "|")
Dim strACLgroup() As String = Split(GetUserGroupACL(CurrentUser.Group), "|")
Dim blnDirty As Boolean = False
Dim strTag As String

For Each i As ToolStripItem In cms.Items
'If Not TypeOf (i) Is Windows.Forms.ToolStripSeparator Then

strTag = CStr(i.Tag)

If Len(strTag) > 0 Then

If strCurrentConn <> strConnST Then
strTag = "ADMINISTRATORS"
End If

blnDirty = False

'用个人ACL衡量
For k As Integer = 0 To strACLuser.Length - 1
If strTag = strACLuser(k) Or strACLuser(k) = "ADMINISTRATORS" Then
blnDirty = True
End If
Next

'用Group ACL衡量
For k As Integer = 0 To strACLgroup.Length - 1
If strTag = strACLgroup(k) Or strACLgroup(k) = "ADMINISTRATORS" Then
blnDirty = True
Exit For
End If
Next

If blnDirty = False Then
i.Enabled = False
End If
End If

Next

End Sub

Jenky 2009-05-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 andywongz 的回复:]
这和是不是WEB程序有关系吗?

给你提供一种思路。

我以前的WEB程序也是这样设置权限的。


你不要指望着人家把现成的正好符合你的代码都给你

那是不可能的。
[/Quote]

呵呵
niitnanfeng 2009-05-23
  • 打赏
  • 举报
回复
简单实用就行
老龙友 2009-05-23
  • 打赏
  • 举报
回复
这和是不是WEB程序有关系吗?

给你提供一种思路。

我以前的WEB程序也是这样设置权限的。


你不要指望着人家把现成的正好符合你的代码都给你

那是不可能的。
Jenky 2009-05-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 andywongz 的回复:]
我给你提供个思路吧,也正是我正在用的


一个角色表

一个用户表

一个权限表

权限表里列出数十种权限

一个用户可以拥有这数十种权限中的一种或多种
一个角色也可以拥有这数十种权限中的一种或多种

给用户一个属性,叫做ACL,类型为String

权限用AA|BB|CC|DD的形式来表示

假设我有4中权限,分别为 OPEN、READ、WRITE、DELETE
那么一个用户的权限(ACL)可以表示为 OPEN|WRITE|DELETE

然…
[/Quote]
呵,我的是WEB程序,另外,我暂时不想用其它方法去实现它,
大家会的话帮忙实现一下
老龙友 2009-05-23
  • 打赏
  • 举报
回复
当某一个FORM 需要进行权限控制时,在FORM_LOAD事件中加入


Sub Form_Load

Call SetACLforDLG(Me.controls)

End Sub
老龙友 2009-05-23
  • 打赏
  • 举报
回复
我给你提供个思路吧,也正是我正在用的


一个角色表

一个用户表

一个权限表

权限表里列出数十种权限

一个用户可以拥有这数十种权限中的一种或多种
一个角色也可以拥有这数十种权限中的一种或多种

给用户一个属性,叫做ACL,类型为String

权限用AA|BB|CC|DD的形式来表示

假设我有4中权限,分别为 OPEN、READ、WRITE、DELETE
那么一个用户的权限(ACL)可以表示为 OPEN|WRITE|DELETE

然后,我们再给控件设置权限,一般我喜欢放在控件的TAG属性上,因为TAG这个属性是任何一个控件都有的,他就是给用户设置自定义值使用的

假设一个控件 Button1,它的TAG属性值为“WRITE”,那么意味着必须ACL中包含“WRITE”的用户或角色才能操作此控件。



而具体权限的控制,可以在FORM的LOAD事件中遍历FORM中的所有控件,和当前用户的身份(也就是ACL)比较,从而设定控件的“Enable”值。

下面的代码供参考:



Public Sub SetACLforDLG(ByVal cc As Control.ControlCollection)

If cc Is Nothing Then Exit Sub

Dim strACLeditable, strACLvisible, strACLuser(), strACLgroup(), strType() As String
Dim ControlEditable As Boolean = False, ControlVisible As Boolean = False

For Each ctl As Control In cc

If Len(ctl.Tag) > 0 Then
strType = Split(ctl.Tag.ToString.Trim, ";")
strACLeditable = strType(0)
If strType.Length >= 2 Then
strACLvisible = strType(1)
Else
strACLvisible = ""
End If

Else
strACLeditable = ""
strACLvisible = ""
End If

'若不是运行数据库(可能是历史数据库),则只允许管理员操作
If strCurrentConn <> strConnST Then
If Len(strACLeditable) > 0 Then
strACLeditable = "ADMINISTRATORS"
End If
If Len(strACLvisible) > 0 Then
strACLvisible = "ADMINISTRATORS"
End If
End If

If Len(strACLeditable) > 0 Then

'用个人ACL衡量EditControl
strACLuser = Split(CurrentUser.strACL, "|")
For i As Integer = 0 To strACLuser.Length - 1
If strACLeditable = strACLuser(i) Or strACLuser(i) = "ADMINISTRATORS" Then
ControlEditable = True
Exit For
End If
Next

'用Group ACL衡量EditControl
strACLgroup = Split(GetUserGroupACL(CurrentUser.Group), "|")
For i As Integer = 0 To strACLgroup.Length - 1
If strACLeditable = strACLgroup(i) Or strACLgroup(i) = "ADMINISTRATORS" Then
ControlEditable = True
Exit For
End If
Next

ctl.Enabled = ControlEditable

End If

If Len(strACLvisible) > 0 Then
'用个人ACL衡量ViewControl
strACLuser = Split(CurrentUser.strACL, "|")
For i As Integer = 0 To strACLuser.Length - 1
If strACLvisible = strACLuser(i) Or strACLuser(i) = "ADMINISTRATORS" Then
ControlVisible = True
Exit For
End If
Next

'用Group ACL衡量ViewControl
strACLgroup = Split(GetUserGroupACL(CurrentUser.Group), "|")
For i As Integer = 0 To strACLgroup.Length - 1
If strACLvisible = strACLgroup(i) Or strACLgroup(i) = "ADMINISTRATORS" Then
ControlVisible = True
Exit For
End If
Next

ctl.Visible = ControlVisible

End If

If ctl.Controls.Count > 0 Then
Call SetACLforDLG(ctl.Controls) '递归调用
End If

Next
End Sub
Jenky 2009-05-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liu4545533 的回复:]
做权限还是用树结构比较好 感觉楼主思路不是很好
[/Quote]
俺不喜欢用树结构来设置权限功能
liu4545533 2009-05-23
  • 打赏
  • 举报
回复
做权限还是用树结构比较好 感觉楼主思路不是很好
Jenky 2009-05-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wts_net 的回复:]
你再想想结构,这种不太好。
[/Quote]

这种不好?那哪种好?
wts_net 2009-05-23
  • 打赏
  • 举报
回复
你再想想结构,这种不太好。
qxw0816 2009-05-23
  • 打赏
  • 举报
回复
解决了就好 呵呵
不用谢
hui_play 2009-05-23
  • 打赏
  • 举报
回复
楼主的想要的功能可以实现,也就是主从表的关系,当你选择了gridview1中的一条记录,做个事件,selectChange事件好象是,取出你选择的roleID,直接动态的添加/修改 gridview2,这样应该可以,你试试

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧