前段时间一直忙于项目的开发一直没有更新博客,最近几天会把在项目中的一些心得写成博客跟大家一起分享。
OK下面进入今天的主体事前权限委托。
在这次的项目中首先就遇到了权限委托这个问题。权限委托一般可以分成事前和事后的两种委托方式,这里我只介绍事前的权限委托。因为事后的权限委托会比较难处理,不过要实现的话也是可以的只是相对事前的委托来说会比较繁琐一点。
先来讲讲事前委托的需求,A领导因出差需要把所有会经过他审批的流程权利移交给别人,等出差结束收回权限。
1.首先我们要建立一个列表库座位权限委托的记录
2.然后自己开发一个用户控件作为添加权限委托的入口,页面部署使用涂总的quickpart进行包装即可
用户控件支持当登陆用户不是管理员时权限委托人默认当前用户,如果是管理员可以指定权限委托人(这个设置的考虑是超级管理可以为出差但是忘记设置委托的人进行补录)。委托人还可以把不同的流程代理给不同的代理人,在流程名称中选择流程名称即可。
用户控件关键代码
2 {
3 SPSite RootSite = SPContext.Current.Site; ;
4 SPWeb webs = RootSite.OpenWeb( " /Workflow " );
5
6 string user = "" ;
7 if ( ! (SPContext.Current.Web.CurrentUser.Name == " 系统帐户 " ))
8 {
9 user = SPContext.Current.Web.CurrentUser.Name;
10 }
11 else
12 {
13 SPUserCollection users = webs.SiteUsers;
14 foreach (Microsoft.SharePoint.WebControls.PickerEntity pe in this .pedTrustor.ResolvedEntities)
15 {
16 string principalType = pe.EntityData[ " PrincipalType " ].ToString();
17 if (principalType == " User " )
18 {
19 string loginName = pe.Key;
20 foreach (SPUser u in users)
21 {
22 if (u.LoginName == loginName)
23 {
24 user = u.Name;
25 break ;
26 }
27 }
28 }
29 }
30 }
31 SPList list = webs.Lists[ " 权限委托登记表 " ];
32 SPQuery squery = new SPQuery();
33 string query = "" ;
34 query = string .Format( " <Where><And><Eq><FieldRef Name=' " + list.Fields[ " 权限委托人 " ].InternalName + " ' /><Value Type='User'>{0}</Value></Eq> "
35 + " <Eq><FieldRef Name=' " + list.Fields[ " 流程名称 " ].InternalName + " '/><Value Type='Text'>{1}</Value></Eq></And></Where> " , user, this .dropWorkflowType.SelectedItem.Text);
36 squery.Query = query;
37 SPListItemCollection items = list.GetItems(squery);
38 if (items.Count <= 0 )
39 {
40 SPListItem item = list.Items.Add();
41 item[ " 权限委托人 " ] = webs.EnsureUser(pedTrustor.CommaSeparatedAccounts);
42 item[ " 权限代理人 " ] = webs.EnsureUser(pedAgent.CommaSeparatedAccounts);
43 item[ " 委托开始时间 " ] = DateTime.Parse( this .WebCalendar1.Text).ToShortDateString();
44 item[ " 委托结束时间 " ] = DateTime.Parse( this .WebCalendar2.Text).ToShortDateString();
45 item[ " 权限委托是否有效 " ] = this .drpEnable.SelectedItem.Text;
46 item[ " 流程名称 " ] = this .dropWorkflowType.SelectedItem.Text;
47 item.Update();
48 return true ;
49 }
50 else
51 {
52 Page.ClientScript.RegisterStartupScript( this .GetType(), " isinput6 " , " <script>alert(\ " 此流程的权限委托人已存在!\ " );</script> " , false );
53 return false ;
54 }
55 }
3.入口和列表设置完后编写Eventhandler来执行设置,在MOSS中发起流程后会在工作流任务列表中创建一条数据指定分配对象这样任务就会发送给分配对象进行审批,OK那我们就对工作流任务列表进行操作把分配对象进行修改。
注意:光把分配对象替换成代理人是没有用的因为代理人针对该条数据本身是没有权限的需要另外赋权。
下面我们来看下Eventhanlder中的代码
2 {
3 this .DisableEventFiring();
4 string user = properties.ListItem[ " 分配对象 " ].ToString().Split( ' # ' )[ 1 ];
5 string workflowname = properties.ListItem[ " 工作流名称 " ].ToString();
6 string siteurl = properties.OpenWeb().Site.Url;
7 using (SPSite site = new SPSite(siteurl))
8 {
9 using (SPWeb web = site.OpenWeb( " /workflow " ))
10 {
11 SPList list = web.Lists[ " 权限委托登记表 " ];
12 SPQuery squery = new SPQuery();
13 string query = "" ;
14 query = string .Format( " <Where><And><Eq><FieldRef Name=' " + list.Fields[ " 权限委托人 " ].InternalName + " ' /><Value Type='User'>{0}</Value></Eq> "
15 + " <Eq><FieldRef Name=' " + list.Fields[ " 流程名称 " ].InternalName + " '/><Value Type='Text'>{1}</Value></Eq></And></Where> " , user, workflowname);
16 squery.Query = query;
17 SPListItemCollection items = list.GetItems(squery);
18 if (items.Count > 0 )
19 {
20 SPListItem item = items[ 0 ];
21 if (item[ " 权限委托是否有效 " ].ToString().Trim() == " 有效 " )
22 {
23 properties.ListItem[ " 分配对象 " ] = item[ " 权限代理人 " ];
24 string dai = item[ " 权限代理人 " ].ToString().Split( ' # ' )[ 1 ];
25 SPRoleAssignment sra = new SPRoleAssignment((web.EnsureUser(dai)));
26 SPRoleDefinition srd = web.RoleDefinitions[ " 参与讨论 " ];
27 sra.RoleDefinitionBindings.Add(srd);
28 properties.ListItem.RoleAssignments.Add(sra);
29 this .DisableEventFiring();
30 properties.ListItem.Update();
31 }
32 else
33 {
34 return ;
35 }
36 }
37 }
38 }
39 this .EnableEventFiring();
40 }
其实代码很简单就是把分配对象替换成代理人并给代理人赋权就OK了。我没有把事件触发写在adding事件里,感兴趣的朋友可以试试把触发代码写的adding事件中的效果是什么。