探索与发现

研究java技术

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  83 随笔 :: 0 文章 :: 109 评论 :: 0 Trackbacks

基于Sharepoint做一个客户管理的系统,由于客户方对权限的要求非常严格,所以不得不自己去定义网站的权限,好在Sharepoint提供的权限系统比较完善,我们所创建的权限包括从创建SPWeb到创建SPListItem均实现了一遍,也算是顺利的解决了问题。项目做到第一阶段,谈谈自己的一些认识。

 

在开始之前先明确几个类或者定义:

Sharepoint权限系统采用 权限——角色 ——对象——关联 的概念,即:对于一个对象(如:SPWeb,SPList,SPListItem),可以通过添加某个已经包含了角色(SPRoleDefinition)的关联(SPRoleAssignment)而更改该对象的权限,而角色(SPRoleDefinition)则是提前通过SPWeb.RoleDefinitions添加到网站内的,注意:只有SPWeb有此属性可以添加角色定义,其他对象如SPSiteSPListSPListItem均不能添加角色定义,当然他们也不需要。

 

相关类:

 

用户或用户组:SPPrincipal 扩展了两个子类:SPUserSPGroup

权限基类:SPBasePermissions,通过或计算合成一个自定义的权限,注意:需要编辑权限的前提是有查看权限;

角色类:SPRoleDefinition,采用web.RoleDefinitions.Add(definition)的方式添加角色;

关联类:对于某个SPPrincipal添加一个SPRoleDefinition的角色,然后再将该关联添加到对象上去,注意:在未将该关联添加到对象上时,该关联都无效。

 

首先定义自己的权限系统,我定义了四个级别的角色,本别具有权限:查看、新建、编辑、删除,这四个权限要远低于Sharepoint本身的权限,这里以新建角色为例说明: 同时定义了负责向网站添加角色Register类,每一个角色都会对应一个Register类,是为了方便权限的扩展,采用依赖倒置。

为对象分配权限:参数SPListItem 也可以是 SPWebSPList,权限的分配一般是在对象刚刚创建后来实现,如

SPWebTemplate template = web.Site.GetCustomWebTemplates((uint)web.Locale.LCID)[WebTemplate];

SPWeb newWeb = RootSPWeb.Webs.Add(rurl, customerName, string.Empty, (uint)2052, template, true, false);

此时就应该对该newWeb做权限操作。而SPListItem的操作一般是在SPItemEventReceiver的ItemAdded事件中去实现


private void RoleAssignment(SPListItem item, SPPrincipal groupOrUser, SPRoleDefinition role)
        {
        
if (!item.HasUniqueRoleAssignments)
        {
            item.BreakRoleInheritance(
true);//true则断开并继承原有权限,false则断开不继承原有权限
        }
        
            
            
this.DisableEventFiring();

            item.Web.AllowUnsafeUpdates 
= true;

            SPRoleAssignment assignment 
= new SPRoleAssignment(groupOrUser);
            assignment.RoleDefinitionBindings.Add(role);
            item.RoleAssignments.Add(assignment);

            item.Update();

            
this.EnableEventFiring();
        }

 


//角色基类:实际上基类提供了查看的权限,因此在查看中不需要扩展
public abstract class BasePermissionRole
    {
        
private string roleName;
        
public virtual string RoleName
        {
            
get
            {
                
return roleName;
            }
            
set
            {
                roleName 
= value;
            }
        }

        
private string roleDescription;
        
public virtual string RoleDescription
        {
            
get
            {
                
return roleDescription;
            }
            
set
            {
                roleDescription 
= value;
            }
        }

        
public abstract SPBasePermissions ComposePermission();

        
protected virtual SPBasePermissions ComposeViewPermission()
        {
        
//对应Sharepoint下的34个基本权限
            return SPBasePermissions.ViewListItems | SPBasePermissions.ViewVersions |
                   SPBasePermissions.ViewFormPages 
| SPBasePermissions.ViewPages |
                   SPBasePermissions.OpenItems 
| SPBasePermissions.CreateAlerts |
                   SPBasePermissions.BrowseUserInfo 
| SPBasePermissions.UseRemoteAPIs |
                   SPBasePermissions.UseClientIntegration 
| SPBasePermissions.Open;
        }

        
public abstract BaseRoleRegister CreateRegister();//通过依赖倒置以及单件实现角色注册
    }
//新建角色,override基类的ComposePermission()方法,并在View的基础上扩展
public class AddPermissionRole : BasePermissionRole
    {
        
public AddPermissionRole()
        {
            
this.RoleName = "新建"
            
this.RoleDescription = "向列表中添加项目,向文档库中添加文档,以及添加 Web 讨论评论";
        }

        
public override string RoleName
        {
            
get
            {
                
return base.RoleName;
            }
            
set
            {
                
base.RoleName = value;
            }
        }

        
public override SPBasePermissions ComposePermission()
        {
            
return base.ComposeViewPermission() | SPBasePermissions.AddListItems;
        }

        
public override BaseRoleRegister CreateRegister()
        {
            
return new AddRoleRegister(this);
        }
    }

//注册基类:
public class BaseRoleRegister
    {
        
public BaseRoleRegister(BasePermissionRole role)
        {
            
this.Permission = role;
        }

        
protected BasePermissionRole Permission;

        
public virtual SPRoleDefinition ExecuteRegister(SPWeb web)
        {
            
foreach (SPRoleDefinition rd in web.RoleDefinitions)
            {
                
if (rd.Name == this.Permission.RoleName)
                    
return rd;
            }

            SPRoleDefinition definition 
= new SPRoleDefinition();
            definition.Name 
= this.Permission.RoleName;
            definition.BasePermissions 
= this.Permission.ComposePermission();
            definition.Description 
= this.Permission.RoleDescription;

            web.RoleDefinitions.BreakInheritance(
truetrue);
            web.RoleDefinitions.Add(definition);
            web.Update();

            
return web.RoleDefinitions[this.Permission.RoleName];
        }
    }

//新建角色的注册类:
public class ApproveRoleRegister : BaseRoleRegister
    {
        
public ApproveRoleRegister(BasePermissionRole role)
            : 
base(role)
        { }

    }
posted on 2009-05-13 06:59 蜘蛛 阅读(1080) 评论(0)  编辑  收藏 所属分类: 日常琐事

只有注册用户登录后才能发表评论。


网站导航: