众所周知,WSS3.0是一个基于角色的用户权限系统,我们可以管理网站的权限、列表的权限、文件夹(列表和文档库)的权限,还有条目(List Item级别)的权限,WSS3.0还提供了权限的继承,然而,有的时候我们希望在某些功能上能够有独立的权限,并且实现动态的去控制一个User或者一个Group对站点内容的访问,今天笔者做的这个Demo记录了在SharePoint开发中,如何通过Coding的方式去实现权限级别的定义以及权限的分配.
涉及内容:
1. 特权提升,以管理员的权限运行代码
2. 上载文档至SharePoint网站
3. 给某个用户指定列表项的访问权限
下面所做的事情都是在前面几篇的基础之上进行改动,用Microsoft SharePoint Designer打开Docs子站点,新建一个页面,取名upload.aspx,并继承default.master母板页
使用Microsoft SharePoint Designer工具在文档中心子站点的deafult.aspx页面上添加一个名为”上载文档”链接,该链接指向上面建好的upload.aspx,最终页面效果如下图显示
打开Visual Studio 2005,新建一个ASP.NET Web Application,名称为UploadFile;删除Default.aspx页面,我们不需要;往Application上添加一个User Control,命名为FileUpload.ascx.在编码之前,我做了这样一件事情,编辑生成后的事件命令行,这样做的目的是每当我们生成项目时可以自动的帮我们将想要的程序集以及用户控件文件拷贝到SharePoint虚拟路径下,省去手动拷贝这一过程,具体操作请参阅前面几篇的内容.
用户控件的界面如下图所示,两个DropDownList的ID分别为ddlListName和ddlFolderName,上载按钮的ID为btnUpload
FileUpload.ascx.cs代码如下,指定将文档上传至文档中心站点的”我的文档”列表下,并给用户”yopeng”赋予对该文档只读权限,记得引入命名空间Microsoft.SharePoint和System.IO
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindListName();
}
}
//绑定列表库
public void BindListName()
{
SPWeb myWeb = SPContext.Current.Web;
SPListCollection collList = myWeb.Lists;
ddlListName.Items.Clear();
foreach (SPList myList in collList)
{
ddlListName.Items.Add(new ListItem(myList.Title));
}
}
//列表库选择项改变时,级联绑定列表库下的文件夹
protected void ddlListName_SelectedIndexChanged(object sender, EventArgs e)
{
SPWeb myWeb = SPContext.Current.Web;
SPList myList = myWeb.Lists[ddlListName.SelectedValue];
ddlFolderName.Items.Clear();
ddlFolderName.Items.Add("根目录");
foreach (SPListItem myFolder in myList.Folders)
{
ddlFolderName.Items.Add(new ListItem(myFolder.Name));
}
}
//弹出消息框
private void ShowMessage(string txtMsg)
{
Literal msg = new Literal();
msg.Text = "<script>alert('" + txtMsg + "')</script>";
Page.Controls.Add(msg);
}
//给某个用户添加权限
public void AddedPermission(SPWeb spWeb, SPList spList, string fileName)
{
SPListItem listItem = null;
//遍历列表下的所有记录
foreach (SPListItem item in spList.Items)
{
//判断哪一条记录的"名称"字段与上传的文档名称一致
if (item["名称"].ToString() == fileName)
{
//通过ID获取上传的那一条记录
listItem = spList.GetItemById(item.ID);
break;
}
}
//断开原来列表项所继承的权限,使其可以设置独立权限
listItem.BreakRoleInheritance(true);
//将原来所继承的权限通通移除
foreach (SPRoleAssignment roleAssignment in listItem.RoleAssignments)
{
roleAssignment.RoleDefinitionBindings.RemoveAll();
spWeb.AllowUnsafeUpdates = true;
roleAssignment.Update();
listItem.Update();
}
//获取将要设置权限的用户
SPUser myUser = SPContext.Current.Site.RootWeb.AllUsers["mosing\\yopeng"];
//定义权限分配
SPRoleAssignment myRoleAssignment = new SPRoleAssignment(myUser.LoginName, myUser.Email, myUser.Name, myUser.Name);
//绑定设置的权限 myRoleAssignment.RoleDefinitionBindings.Add(spWeb.RoleDefinitions.GetByType(SPRoleType.Reader));
//把这个权限加到我们要设置的列表项中
listItem.RoleAssignments.Add(myRoleAssignment);
listItem.Update();
}
//上载文档方法
public void UploadFile(string srcUrl, string destUrl, string fileName)
{
//特权提升,以管理员身份运行下列代码段
//非网站管理员无法执行下列代码,故而需要提升权限
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPWeb myWeb = new SPSite(destUrl).OpenWeb())
{
myWeb.AllowUnsafeUpdates = true;
if (!File.Exists(srcUrl))
{
throw new ArgumentException(String.Format("{0} does not exist", srcUrl), "srcUrl");
}
SPList list = myWeb.Lists["我的文档"];
FileStream fStream = File.OpenRead(srcUrl);
byte[] contents = new byte[fStream.Length];
fStream.Read(contents, 0, (int)fStream.Length);
fStream.Close();
//将文件加入到列表中
if (ddlFolderName.SelectedValue == "根目录")
{
list.RootFolder.Files.Add(fileName, contents);
}
else
{
Guid id = Guid.Empty;
foreach (SPListItem subFolder in list.Folders)
{
if (subFolder.Name == ddlFolderName.SelectedValue)
{
id = subFolder.UniqueId;
break;
}
}
SPFolder myFolder = myWeb.GetFolder(id);
myFolder.Files.Add(fileName, contents);
}
//调用设置列表权限的方法
AddedPermission(myWeb, list, fileName);
}
});
}
//上载按钮触发时事件
protected void btnUpload_Click(object sender, EventArgs e)
{
if (FileUpload1.FileName == string.Empty)
{
ShowMessage("请选择您要上传的文件");
return;
}
string fileName = FileUpload1.FileName;
string filePath = FileUpload1.PostedFile.FileName;
string fileType = fileName.Substring(fileName.LastIndexOf('.') + 1, 3).ToLower();
if (fileType != "doc" && fileType != "docx")
{
ShowMessage("您上传的文件类型不正确,请重新选择上传的文件");
return;
}
else
{
UploadFile(filePath, "http://mosingserver/Docs/DocLib/", fileName);
ShowMessage("上传成功!");
}
}
生成应用程序,打开文档中心网站,单击”上载文档”链接,跳转到upload.aspx页面,依次”网站操作”->”编辑网页”,选择”添加Web部件”,找到quickPart,选中并点击”添加”按钮,修改该共享Web部件,从User Control List中选择生成的FileUpload用户控件,效果如下,退出编辑模式
现在验证下结果,上传一个文档到产品目录下
等待页面刷新,提示上传成功
回到文档中心首页,查看产品目录多了刚才上传的文档
到产品目录中查看的权限变化,使用yopeng用户登录,看到对于该条目,帐户yopeng只有”查看属性”的权限,这是因为在代码中我指定了帐户yopeng只能有查看该条目的权限
我们用管理员登录,看下该条目的权限是否有变化
当我们用管理员帐户登录时,可以看到对条目是有很多权限的,由此证明,设置yopeng帐户对该条目查看的权限是有达到预期的效果的,您不妨自己动手试试.