SharePoint工作流开发点滴(6) - “我的任务不给你看”

一直以来都被MOSS的工作流权限问题所困扰.
我们虽然将任务分配给了某人,但事实上,所有在任务列表中有编辑权限的用户都可以编辑该任务.
而我们并不希望用户能够看到不属于自己的任务.

我曾经尝试过采用以下两种方法解决这一问题,未果.

1.更改任务列表的视图.

  1. 通常我们会把工作流任务分配给某人或者某组,所以我的想法是将任务列表的"我的任务"视图和"按我的用户组"视图合并为一个新的"所有我的任务"视图;
  2. 设置"所有我的任务"视图为默认视图;
  3. 删除其余视图;
  4. 取消用户创建视图的权限;

看起来不错,但是我连第一步都没能实现.

2.定制一个EventHandler

记得园子里的一个朋友写过一篇通过开发EventHandler来控制工作流权限的文章.
思路是为任务列表定制一个EventHandler,使任务列表在增加项目时可以自动更改该项目的权限.
通过定制EventHandler确实可以实现任务的权限分配,但是会引发另外的问题,譬如说,我的工作流中用OnTaskChanged活动来捕捉任务的变更.但是因为在任务创建之后EventHandler马上对其进行权限修改,所以导致工作流会发生一个小小的错误.
不过奇怪的是,虽然在文档库中显示该工作流发生了错误,但事实上流转还是正常的.

我一直固执的认为任务列表的权限应该是在MOSS中配置,而不应该在工作流内部做判断,后来,我终于发现我错了.
我们使用CreateTask活动来创建任务,CreateTask活动有一个HybridDictionary类型的属性叫做SpecialPermissions.
这个属性表示该任务的"特别权限",如果指定了"特别权限",那么创建的任务就不再继承任务列表的权限了.所以我们可以在创建任务之前为其指定这个"特别权限".

1.新建一个全局的Contact对象用来存储分配对象

Contact assignee = default(Contact);

2.在onWorkflowActivated的Invoked事件中从初始化表单中获取assignee对象

assignee = Contact.FromName(init.contact[0].DisplayName, workflowProperties.Web);

3.在属性面板中将createTask的SpecialPermissions属性绑定到新的specialPermissions对象

4.编写createTask的MethodInvoking方法

private void createTask1_MethodInvoking(object sender, EventArgs e)
{
    taskId 
= Guid.NewGuid();
    taskProperties.AssignedTo 
= assignee.LoginName; 
    //判断分配对象是否用户
    if (assignee.IsSPUser)
    {
        //为其添加"参与讨论"的权限.
        specialPermissions.Add(assignee.LoginName, SPRoleType.Contributor);
    }
    //判断分配对象是否用户组
    if(assignee.IsCollection)
    {
        try
        {
            SPGroup group 
= workflowProperties.Web.Groups[assignee.DisplayName];
            //为组内每一个用户添加"参与讨论"的权限.
            foreach (SPUser user in group.Users)
            {
                specialPermissions.Add(user.LoginName, SPRoleType.Contributor);
            }
        }
        catch { }
    }
}

因为默认的"参与讨论"权限就可以编辑工作流任务,所以为任务指定了"特别权限"之后,该任务将对不在SpecialPermissions中的用户不可见,这正是我们所需要的.

posted @ 2007-08-21 01:38 Windie Chai(笑煞天) 阅读(4641) 评论(40)  编辑 收藏 所属分类: WorkflowSharePoint

  回复  引用    
#1楼 2007-08-21 08:15 | zzx [未注册用户]
谢谢,思路很棒。请问第一种方法为什么没能实现呢?
  回复  引用  查看    
#2楼 2007-08-21 08:43 | Allen Zhang      
嗯,很好.我们以前都是使用第一种实现的. 也有地方使用以下方法
使用webpart(具体名称想不起来了),可将列表类型为任务的,所有分配给我的任务显示出来.
将此webpart放到一个webpart page中,再用Iframe将page内容嵌入到我的网站主页(因为在我的网站中找不到这个部件,但在外面的网站中却有,呵呵).
  回复  引用  查看    
#3楼 [楼主]2007-08-21 08:54 | 笑煞天      
@zzx
我查看了"我的任务"和"按我的用户组"的配置,尝试综合起来,却总是可耻的失败.

@Allen Zhang
不知道如何合并这两个视图?望赐教.

  回复  引用  查看    
#4楼 2007-08-21 08:56 | 金色海洋(jyk)      
收藏
  回复  引用    
#5楼 2007-08-21 08:59 | szbaby [未注册用户]
我的流程不會做!
大哥看了你的文章,心中有些想法.
但是,我現在要做的是如何来控制流程。以前遗留的是用ASP来面向流程的思路来实现整个流程。
现在我用.NET来改写。整个数据库结构,流程控制已经无法更改.请问我如何着手,因为我没有头绪。难道我就要一一在程序中判断不成。
我思路很混乱
能不能帮帮我?改变 IF{} ELSE {} !!!!!!
  回复  引用  查看    
#6楼 2007-08-21 09:16 | AA()      
笑大哥,多弄点 关于流程的出来 Show 。
  回复  引用    
#7楼 2007-08-21 09:53 | niels [未注册用户]
MOSS没有听说过,能介绍一下吗?'<br>
  回复  引用  查看    
#8楼 [楼主]2007-08-21 10:32 | 笑煞天      
@szbaby
不着急,慢慢来.
@AA()
一定努力.
@niels
这个啊,有点复杂的说,MOSS = Microsoft Office Sharepoint Server 2007,搜一下便知如何.
  回复  引用  查看    
#9楼 2007-08-21 15:39 | Burnett      
其实MOSS的权限问题影响范围真的很大,比如如果对数据的控制只能精确到条目级而不是属性级,那么就有必要让给视图增加权限上的控制,我不知道为什么MOSS并没有这么做。
还有MOSS的对象模型,也是按照权限来执行调用的,如果当前登陆的用户并不具备执行某些方法的权限的时候(比如取某个List的Item出来),是不存在例外情况的,比如我不想把数据的全部给某个用户看,但是我自己设定了条件来规定用户可以看到哪些数据,哪些不能,这样的话,除非直接读数据库,否则还是受到了权限的控制。
总而言之,MOSS的权限只是固定了一条故事主线,没有太多的例外让我们使用,希望下一版可以有所改进。
  回复  引用    
#10楼 2007-08-22 10:21 | shar [未注册用户]
MOSS的权限问题确实让人很困扰,希望下个版本一定要改进!
  回复  引用  查看    
#11楼 2007-08-22 22:59 | 笑煞天      
@Burnett
@shar
那我们就一起期待年底的SP1吧.
  回复  引用    
#12楼 2007-08-24 09:34 | lw [未注册用户]
第一种方法我有办法实现,通过sharepoint designer修改任务的视图文件,可以让用户看到自己的任务和用户组的任务.

用sharepoint designer打开列表的一个视图,找到从"Query&gt;"开头到"&lt;/Query"结尾的中间一段代码,用下面的代码替换就可以用户看到自己的任务和用户组的任务.

替换的代码如下:



<Where>
<And>
<Or>
<Membership Type=\"CurrentUserGroups\">
<FieldRef Name=\"AssignedTo\"/>
</Membership>
<Eq>
<FieldRef Name=\"AssignedTo\"></FieldRef>
<Value Type=\"Integer\">
<UserID/>
</Value>
</Eq>
</Or>
<Eq>
<FieldRef Name='Completed'/>
<Value Type='Text'>0</Value>
</Eq>
</And>
</Where>

&lt;Where&gt;&lt;And&gt;&lt;Or&gt;&lt;Membership Type="CurrentUserGroups"&gt;&lt;FieldRef Name="AssignedTo"/&gt;&lt;/Membership&gt;&lt;Eq&gt;&lt;FieldRef Name="AssignedTo"/&gt;&lt;Value Type="Integer"&gt;&lt;UserID Type="Integer"/&gt;&lt;/Value&gt;&lt;/Eq&gt;&lt;/Or&gt;&lt;Eq&gt;&lt;FieldRef Name="Completed"/&gt;&lt;Value Type="Text"&gt;0&lt;/Value&gt;&lt;/Eq&gt;&lt;/And&gt;&lt;/Where&gt;



&lt;Where&gt;&lt;Or&gt;&lt;Membership Type="CurrentUserGroups"&gt;&lt;FieldRef Name=&quot;Author&quot;/&gt;&lt;/Membership&gt;&lt;Eq&gt;&lt;FieldRef Name=&quot;Author&quot;/&gt;&lt;Value Type="Integer"&gt;&lt;UserID Type="Integer"/&gt;&lt;/Value&gt;&lt;/Eq&gt;&lt;/Or&gt;&lt;/Where&gt;

  回复  引用  查看    
#13楼 [楼主]2007-08-24 10:57 | 笑煞天      
@lw
谢谢不吝相告,回去试试这个方法.
之前是在MOSS里直接修改视图的,没有尝试用SPD.
  回复  引用    
#14楼 2007-08-24 21:14 | zzx [未注册用户]
"我的任务"视图可以理解,请问"按我的用户组"视图如何理解?谢谢!
  回复  引用  查看    
#15楼 2007-08-25 15:23 | 笑煞天      
@zzx
有很多情况,任务并不是指派给具体的某个人,而是某个用户组,比如HR,财务等等,这种情况下,用户在“按我的用户组”这个视图下就可以看到他所在用户组的任务。
  回复  引用    
#16楼 2007-08-27 11:49 | zzx [未注册用户]
谢谢笑煞天,那么“按我的用户组”视图能否在其它列表或文档库中使用呢?
  回复  引用  查看    
#17楼 [楼主]2007-08-27 18:16 | 笑煞天      
@zzx
这个还真没有试过,不过文档库默认是没有此视图的吧?而且文档库中应该也不会出现某个用户组的文档吧.
  回复  引用    
#18楼 2007-08-27 20:03 | zzx [未注册用户]
1.会有这样的需求:提交人所在的“用户组”成员应能看到本用户组其它成员提交的文档(如,提交人所在的用户组主管,应能看到本组成员提交的文档),但要求不能看到别的“用户组”提交的文档(如,财务组不能看到经营组)。
2.虽然可考虑为不同用户组建立文件夹,但文件夹是静态的,达不到用户组的动态要求。
3.既然文档库和其它除“任务”以外的列表不支持“我的用户组”视图,目前拟考虑将任务列表简化后,用附件方式提交文档,以实现第1条要求。
  回复  引用  查看    
#19楼 [楼主]2007-08-27 21:56 | 笑煞天      
@zzx
我觉得你这样的需求完全可以用建文档库的方式来解决。
确切的说,文档不象任务一样,有明确的分配对象,我们在新建或者上传一个文档的时候,并不需要指定他对谁可见,而任务不同,我们需要指定分配对象。
为不同用户组或部门建立不同的文档库或列表,单独设置这个文档库或列表的权限为对该用户组可见,这是很容易实现的。
  回复  引用    
#20楼 2007-08-28 08:56 | zzx [未注册用户]
@笑煞天
1. 个人在向部门提交类似工作总结的文档时,一般要求只能看到本人提交的文档(可考虑用“创建者=[本人]”的视图),但部门主管应可看到部门成员提交的所有文档(只能在其它地方另建“所有”视图了,否则个人也能看到)。
2.同样,部门在向公司提交部门工作总结时,一般要求只能看到本部门提交的文档,但公司主管部门可看到所有部门提交的文档。但与第1种方式略有不同,需使用[我的用户组视图]。因为,提交文档时可能是部门副职,但要求部门正职或其它本组成员也能看到,否则副职出差了就没辙了。
3.“为不同用户组或部门建立不同的文档库或列表”确实可“单独设置这个文档库或列表的权限为对该用户组可见”。但窃以为文档库或列表不宜多建,否则会给库的维护带来较大工作量(如栏、工作流等)。
4.另外,遗憾的是,文档库不像列表那样支持“项目级权限 ”和“我的用户组”视图,因此只好考虑用上贴的第3种方法了。
  回复  引用  查看    
#21楼 [楼主]2007-08-28 09:40 | 笑煞天      
@zzx
有道理,不过,为什么不把工作总结也做成工作流呢?主管干脆就不用去浏览文档库了嘛,看一些任务列表就知道有没有新的总结递上来,而且任务列表又可以方便的设置权限.
另,可否用EventHandler对文档库新增项目的权限进行限制?
  回复  引用    
#22楼 2007-08-28 12:46 | zzx [未注册用户]
@笑煞天
把文档做成工作流,也需要用户事先把文档上载到文档库里才成启动,这时就可能看到其它用户提交的文档了,某种情况下不满足需求。
同时,从内容管理或知识管理的角度,到文档库中查看内容是最常用的,通过任务列表查看文档主要适用于流程处理。
当然,咱们企业信息的开放性、公开性底,因此对权限要求过高,也算是中国特色吧。
另外,http://www.msotec.com/topic.aspx?topicid=825,可解决:将任务列表的"我的任务"视图和"按我的用户组"视图合并为一个新的"所有我的任务"视图 之问题了?
  回复  引用    
#23楼 2007-08-28 12:50 | zzx [未注册用户]
@笑煞天
呵呵,对不起,仔细一看就是你提出的解决方案,不好意思。
  回复  引用  查看    
#24楼 [楼主]2007-08-28 14:23 | 笑煞天      
@zzx
中国特色,呵呵.
  回复  引用    
#25楼 2007-08-30 13:42 | 朵朵 [未注册用户]
关于权限设定偶遇到了点问题:
1,希望申请者指定承认者,承认者指定下一个承认者。。。所有指定在流程中的人可以查看或者说填写文档(这个应该可以做到)
2,同时希望申请者在提交申请时可以指定个别人(没有特别固定于职位,部门,只是随意指定)有权限看到文档,但这些人不用做任何承认工作,只是被赋予权限

请问,2的这种情况有什么好的实现方法么?
  回复  引用  查看    
#26楼 [楼主]2007-08-30 18:01 | 笑煞天      
@朵朵
表单中再加一个Contact Selector,在工作流的代码中获取其中的人员,为其指定文档的权限,设置为只读.
这样应该可以吧.
  回复  引用    
#27楼 2007-08-31 08:22 | 朵朵 [未注册用户]
私試試、非常謝謝、会続観注支持BLOG的。
  回复  引用    
#28楼 2007-11-22 10:24 | 佳君 [未注册用户]
"在属性面板中将createTask的SpecialPermissions属性绑定到新的specialPermissions对象",这句话不理解,不知道怎么设SpecialPermissions属性,设什么值,新的specialPermissions对象在哪里设置,请指教,谢谢!
  回复  引用    
#29楼 2007-11-23 09:46 | 佳君 [未注册用户]
以上的例子对我来说实在是太有帮助了,具体的设置上还有些弄不清楚,请楼主能否分享下例子的Demo,非常感谢!
  回复  引用  查看    
#30楼 [楼主]2007-11-23 14:14 | 笑煞天      
@佳君
不好意思,Demo已丢失。
文章里已经包含了Demo中的关键代码。
  回复  引用    
#31楼 2007-11-25 19:35 | 佳君 [未注册用户]
谢谢,楼主指点!万分荣幸!
  回复  引用  查看    
#32楼 2007-11-28 15:47 | 陈典洪      
在WF的开发应用中,我遇到一个问题,希望向你请教一下,关于工作流任务的权限问题,《MOSS工作流Tips》之一 "我的任务不给你看" ,
你在任务权限上,分析得相当不错.并用CreateTask活动来创建任务,CreateTask活动有一个HybridDictionary类型的属性叫做SpecialPermissions,来解决权限问题.这让应用变得更简单。但这里我就遇到了一个问题:
我用CreateTask活动来创建任务时,如果没有被包函在whileActivate时,工作流的任务权限应用正常,但如果把createTask放到whileActivate里面时,SpecialPermissions就不工作了,这也使得任务的权限分配无效。请问一下,你这个问题有遇到过吗?有什么办法可以解决吗?

这个问题我测试许久,没有结果,后来我改用另一种方法,也就是你外面说的第一种方法,自定义任务的权限,把任务当成一个item级来看待,分配权限,虽然里面我做到了任务权限分配,但又出现一个问题,那就是在工作流审批时,出现了任务锁定,无法审批工作流错误,在些,我再多问一个问题,工作流任务列表里的任务是不是不能被修改的呢?我发觉我一修改到任务列表的东西,都会出现任务锁定问题,对此问题,有什么解决的办法吗?


  回复  引用  查看    
#33楼 [楼主]2007-11-29 23:19 | 笑煞天      
@陈典洪
没有在While中测试过,不过同样是循环,我在ConditionedGroupActivity中分配权限,一切正常.
  回复  引用  查看    
#34楼 2007-11-30 13:35 | 陈典洪      
我用
private void createTask1_MethodInvoking(object sender, EventArgs e)
{
this.TaskId1 = Guid.NewGuid(); //生成唯一任务ID
string AssignedUser = "MOSS\\edward";
TaskProperties1.AssignedTo = AssignedUser;

////为其添加"参与讨论"的权限.
this.createTask1.SpecialPermissions = new System.Collections.Specialized.HybridDictionary();
this.createTask1.SpecialPermissions.Add(AssignedUser, SPRoleType.Contributor);
}
实现不了任务权限在whileactivate跟conditionedActivityGroup,请博主给诊治一下,万分感谢~
  回复  引用    
#35楼 2008-06-21 10:42 | 俩个人的承诺 [未注册用户]
@笑大哥
你好,看了你的文章后,想问你一个问题:怎么样做才可以在工作流程当中自动分配审批任务给相关任务提交人的经理进行审批,这个经理人是依据提交人来进行动态分配的哦
  回复  引用  查看    
#36楼 [楼主]2008-06-21 23:56 | Windie Chai(笑煞天)      
@俩个人的承诺
既然你有办法动态分配经理,那么就应该有办法从代码中获取这个经理,不是吗?
  回复  引用  查看    
#37楼 2008-09-18 17:58 | 一瞬间      
煞天哥哥。问下,第二种方法不可见后,如果用url的话是否还是可以呢?
是做到页面级别的权限控制还是功能级别的权限控制?
谢谢。
另外,如果用第一种方法的话貌似就是页面级别了吧,如果知道地址的话还是可以查看进去编辑的。
  回复  引用  查看    
#38楼 [楼主]2008-09-18 21:42 | Windie Chai(笑煞天)      
@一瞬间
视图没有权限,你说对了。
EventHandler可以将权限细致到个人,但可能会有副作用,修改项的权限会引发项被修改的事件,如果工作流或其它EventHandler监听了此事件就会处理,但这可能不是我们想要的。
  回复  引用    
#39楼 2008-09-22 19:13 | MOSS123 [未注册用户]
在狀態機工作流中,SpecialPermissions 也不可用,無效果,樓主可有解決之道?
  回复  引用  查看    
#40楼 2008-09-27 16:15 | tonyjun      
--引用--------------------------------------------------
MOSS123: 在狀態機工作流中,SpecialPermissions 也不可用,無效果,樓主可有解決之道?
--------------------------------------------------------
状态机也可以的,新鲜出炉,刚写的
http://www.cnblogs.com/tonyjun/archive/2008/09/27/1300605.html

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-07-20 23:15 编辑过


相关链接: