|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
就安全性而言,net网页编程已经远远低于VB.NET,更无法与安全性著称的C#相比。先容
WindowsSharePointServices3.0和MicrosoftOfficeSharePointServer2007撑持丰厚的平安模子,同意办理员把特定平安对象(好比站点、列表、库、文件夹乃至自力的文档和条目)的权限分派给用户和用户组,来把持对站点和内容的会见。
但是,在某些情况下,必要对列表和文档库中独自的列举行平安把持。今朝,SharePoint没无为列或视图的平安把持供应内置撑持。一个必要这类功效的典范场景就是,在一个包括了大批雇员或客户的信息的列表傍边,某些特定的列(薪资、人为发放日期、提升时机等等)最好只被这个流派里的特定用户组检察到。
为了满意这些场景的请求,本文形貌了一个使用SharePoint扩大性和内置条目级别平安性的办法,同意在自界说字段范例上完成列基础权限把持。这是经由过程利用一个查询字段作为列来完成的,在这类体例的面前实践上严密联系关系着别的一个列表,个中包括了平安值和只为具有无效权限的用户前往这些值的办法。
其了局就是,在视图形式中经受权的用户将看到平安列的内容,就像它是一个一般列一样;相反,未经受权的用户就基本看不到这个列的内容。在中显现了分歧的举动。相似的,只要经受权的用户可以以新建和编纂形式会见平安列的内容。
<br>
:经受权和未经受权用户检察平安列的效果
列级平安性:办理计划架构
为了计划自界说列级平安性办理计划,需办理以下成绩:
- 以平安的体例存储数据,而不会表露平安数据给未经受权的用户
- 只向取得受权的用户出现平安数据
- 只同意取得受权的用户编纂平安数据
为懂得决这些成绩,我们决意利用自界说字段范例(CustomFieldType)用于数据的出现和处置,并利用条目级别平安性(ItemLevelSecurity)的功效用于数据存储。
自界说字段范例同内容范例(ContentTypes)和列表窗体(ListForms)是WindowsSharePointServices的次要扩大机制,同意自界说数据的会见、出现和处置。你能在WindowsSharePointServices3.0SDK中浏览关于自界说字段范例的内容。
我们的自界说字段范例的次要脚色是包管只要具有准确受权的用户才干检察或编纂数据。我们完成了一个名为SecureColumn的自界说字段范例,能用于任何SharePoint列表中。
关于存储数据,我们思索过的一种选择是在独自的数据库中利用独自的数据表。这关于为了其他目而利用独自数据库的情形来讲,是一种较好的SharePoint完成选择。但是,思索到年夜部分SharePoint办理计划都未利用非SharePoint数据库,以是针对这篇文章和示例,我们决意利用SharePoint列表(List)作为存储机制,而不引进对独自数据库的依附。
利用SharePoint列表作为平安数据的后端存储体例,可以为每条必要举行平安把持的数据创立一个列表条目(ListItem)。为了供应得当的平安包管级别,条目级别平安(Item-LevelSecurity)特征也要被利用到。我们在这里答应,列级平安性应当和内置的SharePoint条目级别平安性一样平安。
关于完成决议,要侧重注重的一点就是,利用SharePoint列表和查询(Lookup)列功效一样具有一些固有的限定。这些限定是:在十分年夜的列表中举行查找会影响到功能,而且查询列也不克不及间接会见位于分歧站点汇合(SiteCollection)中的列表。
完成细节
为了完成列级平安性,必要几个自界说组件:
- 数据存储列表(DataStorageList)
- 自界说字段范例,包含自界说字段和编纂器控件
- 部署办理计划包(DeploymentSolutionPackage)
这些组件如所形貌的那样,协同事情在一同,以同意用户创立、检察和编纂存储在平安列中的数据。
<br>
完成提要
关于这个示例完成,一个独自的数据存储列表(DataStorageList)用于保留这个站点会合的一切数据。如许可让这个办理计划更复杂,更容易保护。不外一个弱点就是,一切的平安字段都依附于单一的存储点。在十分复杂的办理计划中,这大概会引发功能成绩。假如呈现这类情形,那末示例办理计划也可以扩大成为每一个平安字段创立一个新的数据存储列表。
数据存储列表
固然利用SharePoint列表作为平安数据的存储体例带来了良多优点,如条目级别平安性和完全的API撑持。但也必要面临几个应战:
- 可见性——一般的SharePoint列表关于一切具有会见权限的用户来讲都是可见的。
- 可伸缩性——假如在体系中,单一列表用于存储来自一切平安列的数据,那末在列表中的条目数目大概会十分伟大而超越了SharePoint倡议的限定,功能大概会呈现分明的下落。
- 权限保护——假如条目级别平安性用于包管每一个条目标平安性,那末更新列的权限大概会变得十分坚苦。
- 创立——当用户增加一个新列时,其实不必定意味着列表已存在了。
这些应战中的每个都必要用尺度的SharePoint列表功效或经由过程增加自界说字段范例中的自界说代码来办理。
为懂得决可见性的成绩,我们创立了“目次”列表。这相似于创立尺度SharePoint完成中的那些体系列表。目次列表包含:Web部件库、站点模板库和母版页库。别的,SPList对象的以下属性也举行了设置以进一步埋没列表:
- Hidden——设置该值为False将从一切尺度UI元素中删除列表。
- NoCrawl——设置该值为True将包管SharePointcrawl引擎不包含列表中的数据。
- OnQuickLaunch——设置该值为False将包管列表不会被增加到疾速启动导航栏中。
为懂得决可伸缩性和权限保护成绩,我们决意不利用立体表,而是转而创立一个两级文件夹布局来分组这些条目。这个文件夹布局的第一级和给定的平安列所属的列表绝对应。第二级和平安列自己绝对应。终极,在一个独自文件夹中,条目数目就不会凌驾给定平安列所属列表的条目数目,即便关于那种包括了多个平安列的列表也是云云。这类体例可以办理可扩大性的成绩。具有如许的文件夹布局,我们就能够利用第二级文件夹的权限来暗示和给定的平安列联系关系的权限。如许也往除为每一个自力条目保护权限的必要。
<br>
:文件夹布局
最初一个成绩是创立出的这个列表应当能作为自界说字段范例的一部分被容易地处置。为了到达这个目标,假设当新字段创立的时分不存在这个列表,我们就用代码来创立它。
自界说字段范例
在下面的办理计划架构一节提到,数据不是真实的存储在这个列表中,而是经由过程增加到SharePoint列表中的平安列在逻辑上的暗示。实践情形是,把数据平安地存储在自力的、专门的SharePoint列表中,就是我们提到的数据存储列表(这个列表具有一个叫做_SecureFieldStorage的外部称号,而且具有叫做_SecureFieldStorage的站点绝对URL)。猎取存储在这个自力的数据存储列表中的数据,并把其显现在宿主列表的高低文中,则是自界说字段范例的次要用途。
当我们在研讨怎样完成这个功效的时分,我们但愿让我们的自界说字段范例从基本的SPField类承继以免从零入手下手。我们应尽量天时用SharePoint现有的功效。假如我们思索把一些可用的SharePoint现有的字段范例用作我们自界说字段范例的基类时,查询字段范例(SPFieldLookup)会是最好的选择。
关于查询字段,我们盘算利用的次要特征是指向其他SharePoint列表中的字段,并基于特定的列表条目编号猎取这个字段的值,这就是我们所必要的功效。并且,利用查询字段功效同意充实使用外部完成的一些长处——它们得利于SQLJoin的功效,在供应很好的伸缩性的同时还能具有很好的平安性。
固然查询字段范例的中心功效为我们所需功效供应了很好的初步,不外在尺度查询字段特征和我们的需求之间还存在良多不婚配的中央。这就是我们的自界说代码的用武的地方——用于扩大SPLookupField:
- 用户必定不克不及改动联系关系到查询列的列表。
- 用户必需可以设定甚么权限可以在和这个列联系关系的数据上设置。
- 当新列创立的时分,它应当能主动地把相干的列表和列设置到我们自界说的数据存储列表上。
- 假如自界说数据存储列表不存在,那末它应当能被主动地创立。
- 当显现这个字段的值时,值不该该出现为一个指向相干列表条目标超链接。
- 当处于编纂或新建形式的时分,这个字段应当出现为一个尺度的文本列表,且任何改动都应当能耐久保留到方针列表中。
- 当处于编纂或新建形式的时分,假如用户不具有得当的权限,那末这个字段的数据值应当被埋没。
自界说范例XML
任何自界说字段范例完成的一个主要组件就是自界说fldtypes.xml文件。在我们的这个例子中,这个文件被定制为指向我们的自界说字段范例类:- <FieldName="FieldTypeClass">SecureField.SecureField,SecureField,Version=1.0.0.0,Culture=neutral,PublicKeyToken=48a15d1316dd0f7dField>
复制代码 我们也包括了一个自界说显现形式。这个显现形式接纳以下体例被辨认,而且包管它不会被出现为超链接,它默许用于Lookup列。- <LookupColumnHTMLEncode="TRUE""AutoHyperLink="FALSE""/>
复制代码 我们仅仅界说的别的一个是设定一个自界说字段编纂器控件。- <FieldName="FieldEditorUserControl">/_controltemplates/SecureFieldEditor.ascxField>
复制代码 自界说字段范例类
自界说字段范例类包括了我们自界说的中心查询字段功效的次要代码。这些功效包含:
- 创立数据存储列表
- 创立数据存储列表了局
- 在数据存储列表上设置权限
- 联系关系我们的自界说字段控件
- 当字段被删除的时分,扫除数据存储列表
这个类从SPFieldLookup承继,偏重写了Update办法以便在平安列被创立或编纂的任什么时候候,面前的数据存储列表都能被创立并以得当的权限举行设置。- publicoverridevoidUpdate(){SPSecurity.RunWithElevatedPrivileges(EnsureSecureFieldStorageListExists);SPWebweb=SPContext.Current.Site.RootWeb;this.LookupWebId=web.ID;this.LookupField=secureFieldStorageFieldName;this.LookupList=web.Lists[secureFieldStorageListName].ID.ToString();RetrieveCustomProperties();SPSecurity.RunWithElevatedPrivileges(ApplyPermissions);base.Update();}
复制代码 一切这些举措都在严厉权限的级别中实行。这就包管尺度用户不会创立一个具有毛病的新平安列。
别的,为了到达这类定制的效果,我们也必要重写FieldRenderingControl属性以便我们的自界说字段控件能被利用。- publicoverrideBaseFieldControlFieldRenderingControl{get{BaseFieldControlcontrol=newSecuredFieldControl();control.FieldName=this.InternalName;returncontrol;}}
复制代码 最初必要定制的是重写OnDeleting办法以包管我们能在列被删除的时分分明任何相干的数据。- publicoverridevoidOnDeleting(){base.OnDeleting();SPSecurity.RunWithElevatedPrivileges(removeFieldFolder);}
复制代码 自界说字段编纂器控件
除中心的字段范例类以外,还必要一个自界说字段编纂器控件,才干让用户设置平安列上的权限。权限不但能在列被增加到列表的时分设置,也能够以后随时更新。这个功效是用一个包括了SharePointPeopleEditor控件的用户控件来完成的。这个控件能让用户搜刮和选择平安主体。- <sharepoint:PeopleEditorID="AllowedPrincipalsPeoplePicker"runat="server"AutoPostBack="false"PlaceButtonsUnderEntityEditor="true"SelectionSet="SPGroup"MultiSelect="true"/>
复制代码 为了设置并猎取平安字段范例的信息,用户控件的后置代码类完成了IFieldEditor接口。出格地,InitializeWithField办法用于从字段中猎取任何现有的平安设置。- if(Page.IsPostBack)return;//InitializethepeoplepickercontrolusingcommaseparatedaccountlistfromthesecurefieldSecureFieldsecureField=(SecureField)field;if(secureField!=null&&secureField.AllowedPrincipals!=null){StringBuilderaccounts=newStringBuilder();foreach(objectentityinsecureField.AllowedPrincipals){accounts.Append((entityasPickerEntity).Key);accounts.Append(",");}this.AllowedPrincipalsPeoplePicker.CommaSeparatedAccounts=accounts.ToString();this.AllowedPrincipalsPeoplePicker.Validate();}
复制代码 别的,OnSaveChange办法会用于更新字段平安设置。- AllowedPrincipalsPeoplePicker.Validate();SecureFieldsecureField=(SecureField)field;secureField.AllowedPrincipals=AllowedPrincipalsPeoplePicker.ResolvedEntities;secureField.SaveCustomProperties();
复制代码 自界说字段控件
自界说字段范例的最初一部分是自界说字段控件,它完成了创立和保护存储在数据存储列表中的数据的逻辑。为了到达这个目标,且仍旧坚持现存查询字段的功效,我们让自界说类从LookupField类承继。在字段处于显现形式的时分,这个基类处置一切的功效。但是,在新建和编纂形式下,我们要修正一些中央让这个控件切合我们的必要。今朝,我们利用基类的ControlMode属性断定字段控件处于甚么形式下。
当字段控件处于新建或编纂形式下,必要对默许的功效举行几个改动以完成以下举动:
- 假如用户不具有这个列的权限,那末埋没控件。
- 显现文本框,并用任何存储在背景列表条目中确当前值来添补它。
- 当值被变动时,创立和更新背景列表条目标值。
为了把持控件的可见性,最好的办法是重写Visible属性。在属性getter的完成中,我们要反省用户是不是有权对数据举行会见,并在不克不及会见的时分前往False。
为了给能够输出或编纂数据的用户显现文本框,我们可使用现存具有id为TextField的SharePoint模板。这个模板一样也被尺度文本字段利用。为了完成这个功效,我们只需复杂地重写DefaultTemplateName属性的Get办法,完成代码以下:- //IfthemodeisDisplaydefaulttoLookupFieldfunctionalityif(ControlMode==SPControlMode.Display||ControlMode==SPControlMode.Invalid){returnbase.DefaultTemplateName;}return@"TextField";
复制代码 为了完成创立或更新数据存储列表的余下功效,我们必要重写Value属性的Get和Set办法。Get办法将被SharePoint框架用于更新字段值。我们关于这个逻辑的自界说,是基于用户输出的值创立或编纂位于数据存储列表中的背景条目。为了不没有权限的用户编纂列表,在需要时,该功效将运转在对照严厉的平安级别下。我们也完成了包管用户不会对不克不及编纂的字段举行编纂的逻辑。在代码中,我们援用了多个帮助办法。这些办法的代码在本节的最初也能找到。- <LookupColumnHTMLEncode="TRUE""AutoHyperLink="FALSE""/>0
复制代码 Value属性的Set办法用于为以后列表条目设置字段的值。我们针对这个功效的定制必要从数据存储列表中猎取以后值,并显现到文本框中。它也完成了包管数据平安性的功效。- <LookupColumnHTMLEncode="TRUE""AutoHyperLink="FALSE""/>1
复制代码 接上去的办法是我们之前用到的一些帮助办法。- <LookupColumnHTMLEncode="TRUE""AutoHyperLink="FALSE""/>2
复制代码 部署
关于扩大SharePoint中心功效的年夜部分自界说开辟,SharePointSolution包是最好的部署工具。这个框架同意我们创立部署安装包,以中央的、分歧的和可检测的体例部署到服务器聚集中的一切服务器上。我们所完成的自界说平安功效包括了一个程序集,一个XML设置文件和一个控件模板文件,和一个巨细适中的Solution包。
终极办理计划
把这些组件相互分离,用户就能够利用如所示的尺度SharePoint界面来增加平安列了。
<br>
:创立平安列
作为增加列的一部分,用户可以选择哪些用户和用户组可以对这个列举行会见。这一功效利用了尺度的SharePoint“PeoplePicker”控件,如所示。
<br>
:为平安列设置权限
一旦列增加好,而且设置了具有响应的会见权限的用户,那末列就能够利用尺度的SharePoint新建和编纂窗体来增加数据了,如所示。
<br>
:编纂平安列的值
对这个列不具有权限的用户就不同意编纂或检察这个列傍边的数据。从中能够看到。
<br>
:当用户不具有编纂平安列的权限时编纂形式的显现效果
当这个列增加到SharePoint中的一个视图中时,只要具有该权限的用户可以会见。能够从和中看到。
<br>
:具有平安列权限的用户检察列表的效果
<br>
:不具有平安列权限的用户检察列表的效果
结论
本文展现了怎样扩大SharePoint以包括列级别平安性的功效,并在SharePoint外部保留一切数据。在本文中被考证的对策可以让这个功效无缝地附加就任何SharePoint情况中。别的,我们也在MSDNCodeGallery上公布了一个能够运转的例子的完全的源代码及部署文件。
只管我们信任本文所演示的体例能充实地包管可伸缩性,而且是平安的,但我们没有举行普遍的测试;而且我们十分但愿,假如微软能在将来的SharePoint版本中包括内置的列基础平安性功效,那末它将会比我们的示例具有更好的UI、更好的功能和可伸缩性,并且它也能够有售后撑持,而关于这一点,很明显我们的示例没法做到。
在我们的例子中未被办理但已失掉考证的其他事变另有:
- 当父对象被删除的时分,要扫除平安纪录
- 让用户可使用除文本外的别的数据范例
- 把列的编纂权限从检察权限平分离出来
应当思索一下在数据表视图中,怎样改良列的功效。
分外资本
要懂得更多信息,能够检察以下资本:
- CustomFieldTypes
- Users,Groups,andAuthorization
- Plansiteandcontentsecurity(WindowsSharePointServices)
- Plansiteandcontentsecurity(OfficeSharePointServer)
- MicrosoftOfficeDeveloperCenter
来自:http://www.infoq.com/cn/articles/Dressel-Gogolowicz-wss-security一般的指的.net就是跟net网页编程相对的那种,主要是做企业级应用的。你如果想学这个,主要就是学C#和数据库。(ASP.NET好像很重要的,应该也要学的,ASP.NET上好像可以结合VB和C#等多种语言,但是微软主推C#) |
|