概述
近日来研究了RBAC模型,参考了网上诸多例子,而后利用WPF技术实现了一个基于角色的权限菜单的简单示例,例子非常简单,重在这种模型的应用。将这些概念及例子做一个总结,以便大家交流学习。
RBAC模型主要是首先将访问权限与角色相关联,然后角色再与用户相关联。
主要分为三个部分:User用户,Role角色,及Permission权限。
首先设计数据表:
Users表:UserID,UserName,UserPwd,RoleID;
Role表:RoleID,RoleName;
Permission表:PermissionID,PermissionName;
RolePermission表:RolePermissionID,RoleID,PermissioID;
设计好数据表以后,就开始项目的编写,因为这段时间研究的是MVVM模式的应用,因此,使用了MVVM模式编写此例。
项目分为Model,View及ViewModel三个部分。Model只要的功能是实体类和提供的服务。实体类是对事物属性抽象构成的类,即代表事物的属性集合,只有属性,没有方法。所提供的服务主要是通过访问数据存储获取数据,来生成实体类的实例,为实体类实例提供数据。ViewModel是View和Model之间的纽带,其过程是将View绑定到ViewModel上,而同时有包装了Model的实体及服务。当用户对界面操作时,会引发ViewModel的变化,ViewModel调用Model中的服务,修改其包装实体或实体集。由于这些实体或实体集同样被绑定到界面上,因此,界面对用户的操作做出响应。
在Service中有两个服务,分别是对于权限的判断,就主界面的显示。
PermissionServie.cs中的内容:
public class PermissionServie : IPermissionServie
{
public static int userIDstatic;
public PermissionServie()
{
userIDstatic = 0;
}
/// <summary>
/// 判断用户登录是否有效
/// </summary>
/// <param name="user"></param>
string IPermissionServie.LoginIsValid(User user)
{
string valid = "";
int ID = 0;
string constr = "server=(local);Integrated Security=True;pwd='';uid=sa;database=Children";
SqlConnection con = new SqlConnection(constr);
try
{
con.Open();
string cmdstr = "select UserPwd,UserID from Users where UserName='" + user.UserName + "'";
SqlCommand sqlcmd = new SqlCommand(cmdstr, con);
SqlDataReader sqlreader = sqlcmd.ExecuteReader();
if (sqlreader.Read())
{
string pwd = sqlreader[0].ToString();
if (pwd == user.UserPwd)
{
valid = "登录成功";
ID = Convert.ToInt16(sqlreader[1]) ;
}//name+pwd
else
valid = "密码错误";
}
else
valid = "用户名不存在";
sqlreader.Close();
}
catch (Exception e1) { }
con.Close();
userIDstatic = ID;
return valid;
}
/// <summary>
/// 根据用户名密码查找数据库,返回该用户相应的权限集合
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
ObservableCollection<Permission> IPermissionServie.GetUserPermissions()
{
Permission _permission;
ObservableCollection<Permission> list = new ObservableCollection<Permission>();
User user = DataPool.UserDataStore;
string constr = "server=(local);Integrated Security=True;pwd='';uid=sa;database=Children";
SqlConnection con = new SqlConnection(constr);
try
{
con.Open();
//string cmdstr = "select PermissionID from RolePermission where RoleID=(select RoleID from UserRole where UserID="+ userIDstatic +")";
string cmdstr = "select PermissionID from Users inner join RolePermission on Users.RoleID=RolePermission.RoleID where UserName='"+ user.UserName +"'";
SqlDataAdapter da = new SqlDataAdapter(cmdstr, con);
DataSet ds = new DataSet();
SqlCommandBuilder mySqlCommandBuilder = new SqlCommandBuilder(da); //使用 CommandBuilder 自动生成 SQL 语句
da.Fill(ds);
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
_permission = new Permission();
_permission.PermissionID = Convert.ToInt16(ds.Tables[0].Rows[i][0]);
list.Add(_permission);
}
}
catch (Exception e)
{
}
con.Close();
return list;
}
}
ShowWinService.cs:
public class ShowWinService : IShowWinService
{
public ShowWinService()
{
}
public void ShowDialog<T>(object viewModel) where T : Window
{
T showWin = Activator.CreateInstance<T>();
//showWin.DataContext = viewModel;
showWin.Show();
}
public void ClosedWin<T>() where T : Window
{
T closedWin = Activator.CreateInstance<T>();
closedWin.Close();
}
}
个文件是主要的内容,其中PermissionServie.cs中首先对用户名及密码进行了判断,看是否是合法用户,接着看此用户相对应的角色是什么,并将其角色对应的权限找出,并设置相应的菜单权限。在设计权限时,首先考虑的是权限逻辑,这仅仅是对于对象的类别,不涉及到对象的特定实例。对所有的用户都是一样的,并不区分操作的具体对象实例。要实现对象的实例级,就要将权限逻辑配合业务逻辑。例如,在业务逻辑中判断用户具体的权限有哪些。
ShowMainViewModel.cs中涉及了关于权限的业务逻辑判断。
public void OperateMenu()
{
for (int i = 0; i < _permissionProperty.Count; i++)
{
Permission _permission = _permissionProperty[i];
int ID = _permission.PermissionID;
switch(ID)
{
case 1:
IsUse1 = true;
break;
case 2:
IsUse2 = true;
break;
case 3:
IsUse3 = true;
break;
default :
break;
}
}
}
比较简单,讲的也比较简单,重在MVVM模式及RBAC模型的了解。
源码下载:http://download.csdn.net/source/2267576
最后
以上就是冷静大门为你收集整理的利用MVVM来实现基于角色的权限菜单的全部内容,希望文章能够帮你解决利用MVVM来实现基于角色的权限菜单所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复