日历中 SPlistitem级别的用户(角色)权限控制

huxuanchenxy 2010-01-28 10:55:12

这个问题在这个帖子中问过,
http://topic.csdn.net/u/20100125/14/4ee1761b-15ff-47e9-a6c6-d1ffa7f636e4.html
不过现在用户提出如果不是自己创建的记录的用户不能看到“编辑项目”“删除项目”的按钮

现在有个想法,在ItemEventReceiver.cs (public override void ItemAdded(SPItemEventProperties properties))
能不能控制splistitem级别的用户权限,以便每一条记录都有自己的用户权限设置
如果思路对的话,语句应该怎么写
我在网上试图找了些代码
//if(properties.ListItem.HasUniqueRoleAssignments)
//{
properties.ListItem.BreakRoleInheritance(false);//这句要么不进来,要么就报错拒绝访问。 (异常来自 HRESULT:0x80070005 (E_ACCESSDENIED))//}
SPRoleDefinition role = web.RoleDefinitions["读取"];//这里英文的Read不行,应该有哪些权限?SPRoleAssignment roleAssignment;
roleAssignment = new SPRoleAssignment(user);
roleAssignment.RoleDefinitionBindings.Add(role);
properties.ListItem.RoleAssignments.Add(roleAssignment);//这里也会报错properties.ListItem.SystemUpdate();
...全文
566 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoxin1122 2010-04-26
  • 打赏
  • 举报
回复
//获取当前登录人的部门(前提:在AD里已经设置好部门,或者在moss管理中心设置好),并且对当前日历记录赋值部门
SPUser user = web.CurrentUser;
这句是不对的,这个user是系统管理员,你的web是new出来的,你楼上的那位是正确的
SPUser user=web.AllUsers[properties.UserLoginName];
huxuanchenxy 2010-01-29
  • 打赏
  • 举报
回复
这个问题已经在各位大师的帮助下解决了,非常感谢!!!

下面是小弟的代码,并且附上Permission Level的中文对照

SPSecurity.RunWithElevatedPrivileges(delegate
{
using (SPSite site = new SPSite(properties.SiteId))
{
using (SPWeb web = site.OpenWeb(properties.ListItem.ParentList.ParentWeb.ID))
{
web.AllowUnsafeUpdates = true;
// Make sure referring to the new objec created under the evelvated security context
// there seems to be some bug in web.Lists[properties.ListId].Items[properties.ListItemId] // IndexOutOfRange
SPListItem item = web.Lists[properties.ListId].Items[properties.ListItem.UniqueId];
item.BreakRoleInheritance(false);

SPRoleDefinition contributeRoleDef = web.RoleDefinitions["参与讨论"];
SPRoleDefinition readRoleDef = web.RoleDefinitions["读取"];


// the user creating this item have the Contribute permisioin level
SPRoleAssignment roleAssOfCurrentUser = new SPRoleAssignment(web.AllUsers[properties.UserLoginName]);
roleAssOfCurrentUser.RoleDefinitionBindings.Add(contributeRoleDef);

// all the authenticated user can read
SPRoleAssignment roleAssOfAllUser = new SPRoleAssignment(web.AllUsers["NT AUTHORITY\\Authenticated Users"]);
roleAssOfAllUser.RoleDefinitionBindings.Add(readRoleDef);

item.RoleAssignments.Add(roleAssOfCurrentUser);
item.RoleAssignments.Add(roleAssOfAllUser);

//获取当前登录人的部门(前提:在AD里已经设置好部门,或者在moss管理中心设置好),并且对当前日历记录赋值部门
SPUser user = web.CurrentUser;
ServerContext context = ServerContext.GetContext(site);
UserProfileManager profileManager = new UserProfileManager(context);
UserProfile profile = profileManager.GetUserProfile(properties.UserLoginName.ToString());
try
{
properties.ListItem["dept"] = profile["Department"].Value.ToString();
}
catch { }
properties.ListItem.SystemUpdate(); // NO NEED
}
}
});


Full Control = 完全控制
Design = 设计
Contribute = 参与讨论
Read = 读取
Limited Access = 受限访问

其他的没试过,如有不对的请指出,再次感谢!!!

Jinglecat 2010-01-29
  • 打赏
  • 举报
回复
以下代码是经过测试的

注意我的是英文版,其他语言版本的 Read 和 Contribute Permission Level 名称可能不一样
预期在 SPSecurity.RunWithElevatedPrivileges 中得到操作权限提升的任何对象都必须是来之这个新的安全上下文创建的对象,在其内部引用外部创建的对象,还是没有权限操作


SPSecurity.RunWithElevatedPrivileges(delegate
{
using (SPSite site = new SPSite(properties.SiteId))
{
using (SPWeb web = site.OpenWeb(properties.ListItem.ParentList.ParentWeb.ID))
{
web.AllowUnsafeUpdates = true;
// Make sure referring to the new objec created under the evelvated security context
// there seems to be some bug in web.Lists[properties.ListId].Items[properties.ListItemId] // IndexOutOfRange
SPListItem item = web.Lists[properties.ListId].Items[properties.ListItem.UniqueId];
item.BreakRoleInheritance(false);

SPRoleDefinition readRoleDef = web.RoleDefinitions["Read"];
SPRoleDefinition contributeRoleDef = web.RoleDefinitions["Contribute"];

// the user creating this item have the Contribute permisioin level
SPRoleAssignment roleAssOfCurrentUser = new SPRoleAssignment(web.AllUsers[properties.UserLoginName]);
roleAssOfCurrentUser.RoleDefinitionBindings.Add(contributeRoleDef);

// all the authenticated user can read
SPRoleAssignment roleAssOfAllUser = new SPRoleAssignment(web.AllUsers["NT AUTHORITY\\Authenticated Users"]);
roleAssOfAllUser.RoleDefinitionBindings.Add(readRoleDef);

item.RoleAssignments.Add(roleAssOfCurrentUser);
item.RoleAssignments.Add(roleAssOfAllUser);

//properties.ListItem.SystemUpdate(); // NO NEED
}
}
});
a-zhwang 2010-01-28
  • 打赏
  • 举报
回复
using (SPWeb web = site.OpenWeb(item.ParentList.ParentWeb.ID))
{
web.AllowUnsafeUpdates = true;
SPUser user = web.CurrentUser;
ServerContext context = ServerContext.GetContext(site);
UserProfileManager profileManager = new UserProfileManager(context);
UserProfile profile = profileManager.GetUserProfile(properties.UserLoginName.ToString());
try
{
properties.ListItem["dept"] = profile["Department"].Value.ToString();
}
catch { }

//properties.ListItem.BreakRoleInheritance(false);
//});
//if (properties.ListItem.HasUniqueRoleAssignments)
//{
//properties.ListItem.BreakRoleInheritance(false);
//}
web.Lists[item.ParentList.ID].BreakRoleInheritance(false);
//这句现在好了
SPRoleDefinition role = web.RoleDefinitions["读取"];
SPRoleAssignment roleAssignment = new SPRoleAssignment(properties.UserLoginName, "", properties.UserDisplayName, "");
roleAssignment.RoleDefinitionBindings.Add(role);
SPRoleDefinitionBindingCollection roleDefBindings = roleAssignment.RoleDefinitionBindings;
properties.ListItem.RoleAssignments.Add(roleAssignment); //到这句就完了
properties.ListItem.SystemUpdate();


无语。。。。
roleAssignment是来自于的自己new的SPWeb对象,而properties的ListItem是从properties.OpenWeb()的Web对象中创建。

所以这句properties.ListItem.RoleAssignments.Add(roleAssignment);肯定抛异常
a-zhwang 2010-01-28
  • 打赏
  • 举报
回复
添加这个Code再试下:
SPWeb.AllowUnsafeUpdate = true
yuanyuyuyu 2010-01-28
  • 打赏
  • 举报
回复

web.Lists[item.ParentList.ID].Items[item.ID].BreakRoleInheritance(false);
晕 绕一大圈。
直接item
item.BreakRoleInheritance(false);
item.Update();
你出错可能是因为此项正在被你锁定。
huxuanchenxy 2010-01-28
  • 打赏
  • 举报
回复

web.Lists[item.ParentList.ID].Items[item.ID].BreakRoleInheritance(false);
properties.ListItem.BreakRoleInheritance(false);
SPRoleDefinition role = web.RoleDefinitions["读取"];
SPRoleAssignment roleAssignment = new SPRoleAssignment(properties.UserLoginName, "", properties.UserDisplayName, "");
roleAssignment.RoleDefinitionBindings.Add(role);
SPRoleDefinitionBindingCollection roleDefBindings = roleAssignment.RoleDefinitionBindings;
web.Lists[item.ParentList.ID].Items[item.ID].RoleAssignments.Add(roleAssignment);
web.Lists[item.ParentList.ID].Items[item.ID].Update();

web.Lists[item.ParentList.ID].BreakRoleInheritance(false);
这样写好像到列表这个级别,没到每个项的级别
我想针对每一条记录分配权限这样写不可以吗(定义到splistitem级别)?
web.Lists[item.ParentList.ID].Items[item.ID].BreakRoleInheritance(false);
报错了。。。

yuanyuyuyu 2010-01-28
  • 打赏
  • 举报
回复
我具体实施的是工作流,让新建的时候启动工作流,将你上面的代码执行,然后指定用户权限。

或者取出创建者的用户组,赋给这个用户组读取权限,很灵活 自己利用吧 呵呵
huxuanchenxy 2010-01-28
  • 打赏
  • 举报
回复
总算看到希望了,谢谢大师对于一个菜鸟的耐心,小的在这里叩拜了。
1.现在我试着把登录的人的权限加好,并且把其他人的权限删除,
2.然后我在试试看是不是针对每条记录都有了一套自己的权限分配

这个帖子一定会按照要求结贴,再次谢谢。
Justin-Liu 2010-01-28
  • 打赏
  • 举报
回复
你用管理员账户到那个list setting permission设置 setting 有继承权限 再给继承回来
Jinglecat 2010-01-28
  • 打赏
  • 举报
回复
不是让你注意我注释的地方了吗,要用 new 出来的对象的,才具有提高的权限

web.Lists[item.ParentList.ID].RoleAssignments.Add(roleAssignment);// properties.ListItem.RoleAssignments.Add(roleAssignment);
//到这句就完了
web.Lists[item.ParentList.ID].SystemUpdate();
// properties.ListItem.SystemUpdate();
huxuanchenxy 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 foxdave 的回复:]
引用 17 楼 huxuanchenxy 的回复:
我现在怎么任何人(除了moss管理员)都没有权限访问那个日历了?连日历的链接用一般用户登录也看不到了,这是为什么?难道是这句话:
web.Lists[item.ParentList.ID].BreakRoleInheritance(false);
我前面调试的时候到
SPRoleAssignmentCollection collRoleAssignments = item.RoleAssignments;
报错了,说拒绝访问,然后就说当前用户没有权限了,接着链接也没了

啊 对  你把list的权限打破了  还不拷贝原来的  就全没了呗
[/Quote]

那怎么办啊,急死我了,求求你再指点一下吧,我不行了

SPListItem item = properties.ListItem;
SPSecurity.RunWithElevatedPrivileges(delegate
{
using (SPSite site = new SPSite(item.ParentList.ParentWeb.Site.ID))
{
using (SPWeb web = site.OpenWeb(item.ParentList.ParentWeb.ID))
{
web.AllowUnsafeUpdates = true;
SPUser user = web.CurrentUser;
ServerContext context = ServerContext.GetContext(site);
UserProfileManager profileManager = new UserProfileManager(context);
UserProfile profile = profileManager.GetUserProfile(properties.UserLoginName.ToString());
try
{
properties.ListItem["dept"] = profile["Department"].Value.ToString();
}
catch { }

//properties.ListItem.BreakRoleInheritance(false);
//});
//if (properties.ListItem.HasUniqueRoleAssignments)
//{
//properties.ListItem.BreakRoleInheritance(false);
//}
web.Lists[item.ParentList.ID].BreakRoleInheritance(false);
//这句现在好了
SPRoleDefinition role = web.RoleDefinitions["读取"];
SPRoleAssignment roleAssignment = new SPRoleAssignment(properties.UserLoginName, "", properties.UserDisplayName, "");
roleAssignment.RoleDefinitionBindings.Add(role);
SPRoleDefinitionBindingCollection roleDefBindings = roleAssignment.RoleDefinitionBindings;
properties.ListItem.RoleAssignments.Add(roleAssignment);
//到这句就完了
properties.ListItem.SystemUpdate();

}
}
});
Justin-Liu 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 huxuanchenxy 的回复:]
我现在怎么任何人(除了moss管理员)都没有权限访问那个日历了?连日历的链接用一般用户登录也看不到了,这是为什么?难道是这句话:
web.Lists[item.ParentList.ID].BreakRoleInheritance(false);
我前面调试的时候到
SPRoleAssignmentCollection collRoleAssignments = item.RoleAssignments;
报错了,说拒绝访问,然后就说当前用户没有权限了,接着链接也没了
[/Quote]
啊 对 你把list的权限打破了 还不拷贝原来的 就全没了呗
huxuanchenxy 2010-01-28
  • 打赏
  • 举报
回复
我现在怎么任何人(除了moss管理员)都没有权限访问那个日历了?连日历的链接用一般用户登录也看不到了,这是为什么?难道是这句话:
web.Lists[item.ParentList.ID].BreakRoleInheritance(false);
我前面调试的时候到
SPRoleAssignmentCollection collRoleAssignments = item.RoleAssignments;
报错了,说拒绝访问,然后就说当前用户没有权限了,接着链接也没了
cshadow 2010-01-28
  • 打赏
  • 举报
回复
或者你在网上找一个'jquery.js'引用下,例如<script type='text/javascript' src='jquery.js'></script>
Jinglecat 2010-01-28
  • 打赏
  • 举报
回复
能不能帮我看一下
item.BreakRoleInheritance(false);
这个为什么报错吗?说拒绝访问,说我没有特权访问此资源,我不是ad管理员有关系吗?

========

这里是验证当前执行代码的用户(不一定是登录用户)是否有 Manage List Permission 的权限

用 SPSecurity.RunWithElevatedPrivileges 运行会提升到以该站点的 App Pool ID 身份运行,这个账户对于 SP Site 相当于 Supper Admin
cshadow 2010-01-28
  • 打赏
  • 举报
回复
LZ,$这个东西是jquery的东西啊,要include jquery 类库。。。
Jinglecat 2010-01-28
  • 打赏
  • 举报
回复
加上 SPSecurity.RunWithElevatedPrivileges 并且重新 OpenWeb 注意下面修改的地方

base.ItemAdded(properties);
SPListItem item = properties.ListItem;
SPSecurity.RunWithElevatedPrivileges(delegate() {
using(SPSite site = new SPSite(item.ParentList.ParentWeb.Site.ID)) {
using(SPWeb web = site.OpenWeb(item.ParentList.ParentWeb.ID))
// using (SPWeb web = item.ParentList.ParentWeb)
{
web.Lists[item.ParentList.ID].BreakRoleInheritance(false);
//item.BreakRoleInheritance(false);
SPRoleAssignment oRoleAssignment = new SPRoleAssignment(properties.UserLoginName, "", properties.UserDisplayName, "");
SPRoleDefinitionCollection collRoleDefinitions = web.RoleDefinitions;
SPRoleDefinitionBindingCollection collRoleDefinitionBindings = oRoleAssignment.RoleDefinitionBindings;
SPRoleAssignmentCollection collRoleAssignments = item.RoleAssignments;
collRoleDefinitionBindings.Add(collRoleDefinitions[0]);
collRoleAssignments.Add(oRoleAssignment);
web.Lists[item.ParentList.ID];
// item.Update();
}
Justin-Liu 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 huxuanchenxy 的回复:]
我不是ad管理员有关系吗?
[/Quote]
有关系
huxuanchenxy 2010-01-28
  • 打赏
  • 举报
回复
我把上面那段js贴到displayform.aspx里

但是没有反应,别人还是能看到“编辑项目”“删除项目”

能不能帮我看一下
item.BreakRoleInheritance(false);
这个为什么报错吗?说拒绝访问,说我没有特权访问此资源,我不是ad管理员有关系吗?
加载更多回复(10)
下载代码方式:https://pan.quark.cn/s/dd3561eca308 在软件开发领域,面向对象编程(OOP)是一种普遍采纳的结构化方法,它使得开发者能够借助模拟现实环境的实体和关系来构建软件系统。在本案例,我们观察到的是一个关于借助抽象类来执行不同几何图形面积求解的实践应用。现在,让我们详细分析这一议题。 标题 "应用抽象类计算面积" 清晰地表明我们将要讨论一个抽象类,此类设定了一个用于测量图形面积的标准函数,但并未提供实际的执行过程。抽象类在诸如C#或Java等编程语言通常借助`abstract`修饰符进行声明,它们无法直接创建对象实例,仅能作为其他类的基础模板。 描述部分提及的"图形界面应用"暗示这是一个基于视觉用户界面(GUI)的系统,可能运用了.NET Framework的Windows Forms或WPF技术,或者是Java平台的Swing或JavaFX框架。在这样环境下,用户能够通过视觉元素与这些几何体进行互动,例如输入相关尺寸并观看到计算得出的面积值。 抽象类“几何体”内嵌了“计算面积”这一抽象函数。在代码层面,这可以被表述为: ```csharp public abstract class GeometricShape { public abstract double CalculateArea(); } ``` 随后,有三个派生类:圆(Circle)、矩形(Rectangle)和三角形(Triangle),它们各自提供了这个抽象函数的具体实现。比如,圆的面积是通过π乘以半径的平方得到的,矩形的面积是长和宽的乘积,而三角形的面积可能是底乘以高再除以2的结果。这些类将提供具体实现来计算它们各自的面积: ```csharp p...
内容概要:本文系统研究了移相控制全桥LLC谐振变换器的工作特性,深入分析其在不同工作模式下的运行机理与性能表现,重点探讨了软开关实现、高效率能量转换及宽范围电压调节等关键技术优势。通过Simulink搭建精确的仿真模型,对谐振腔参数、开关频率、电压增益、系统效率等关键指标进行仿真分析,验证了理论设计的正确性。同时,详细研究了移相控制策略对系统动态响应、稳定性和轻载/重载工况适应性的影响,揭示了控制参数与电路参数之间的耦合关系,为高频高效电源设计提供了理论依据和实践指导。; 适合人群:具备电力电子技术、模拟电路及自动控制理论基础,从事开关电源、新能源变换器、电动汽车充电模块或高频电源系统研发的工程师及高校研究生。; 使用场景及目标:①掌握全桥LLC谐振变换器的拓扑结构、工作原理与关键参数设计方法;②理解移相控制在实现零电压开通(ZVS)和零电流关断(ZCS)的作用机制;③通过Simulink仿真掌握变换器建模、参数优化与性能评估流程,服务于实际产品开发与学术课题研究。; 阅读建议:建议读者结合提供的Simulink仿真模型进行同步操作,重点关注谐振网络(Lr, Lm, Cr)参数与移相角之间的匹配设计,深入理解软开关条件的形成过程,并通过调整负载和输入电压进行多工况仿真,以全面掌握系统动态特性。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
企业开发 SharePoint
社区管理员
  • SharePoint社区
  • 霖雨 - LinyuLoveTJ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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