高级自定义 > 业务逻辑自定义 > 自定义安全标签 > 设置自定义安全标签
  
设置自定义安全标签
以下各节应与安全标签配置步骤结合使用。可以完成任一或所有自定义。
* 
使用自定义安全标签时,如果用户可以手动输入值 (例如使用配置自定义安全标签时默认提供的文本字段),则 PTC 建议向用户界面添加验证。建议使用自定义转换器类对值进行验证,以防止用户在用户界面中输入无效值或在导入文件中指定无效值时,系统将非预期值存储在数据库中。
启用自定义安全标签
要启用自定义安全标签,必须完成以下步骤。有关上述每个步骤的详细信息,请参阅安全标签配置步骤
1. Define Security Labels - Required
将以下各行添加到 <Windchill>\wtcustom\wt\access\accessModelRB.rbinfo 文件中,并确保除 <DISPLAY_NAME> 或 <LONG_DESCRIPTION> 之外不包含任何空格:
WCTYPE|wt.access.SecurityLabeled~SCA|<SECURITY_LABEL>.value=<DISPLAY_NAME>
WCTYPE|wt.access.SecurityLabeled~SCA|<SECURITY_LABEL>.dataType=java.lang.String
WCTYPE|wt.access.SecurityLabeled~SCA|<SECURITY_LABEL>.serverFunction=
com.ptc.core.foundation.security.server.impl.SACFSecurityLabel
WCTYPE|wt.access.SecurityLabeled~SCA|<SECURITY_LABEL>.serverFunction.arg1=
PID{<SECURITY_LABEL>}
WCTYPE|wt.access.SecurityLabeled~SCA|<SECURITY_LABEL>.longDescription=
<LONG_DESCRIPTION>
其中:
<SECURITY_LABEL> 是自定义安全标签名称。此值应仅使用字母数字字符和下划线字符。字符串 WCTYPE|wt.access.SecurityLabeled~SCA|<SECURITY_LABEL> 是此配置步骤中将要指定给自定义安全标签的 SecurityLabelResourceKey 元素的值。然而,<SECURITY_LABEL> 值不需要与为安全标签配置文件中的 CustomSecurityLabel 元素指定的 name 属性相匹配,这是在本指南中使用的惯例。
* 
安全标签名称作为服务器计算属性 (SCA) 进行存储。每个 SCA 必须具有唯一名称。逻辑属性报告会提供一个包含当前所有 SCA 的列表。您可以从 <Windchill>\netmarkets\jsp\lwcType\logicalAttributesReport.jsp 中访问此报告。
由于要显示在用户界面中,因此 <DISPLAY_NAME> 是自定义安全标签的名称。
<LONG_DESCRIPTION> 是自定义安全标签的详细说明。详细说明显示在自动生成的自定义安全标签说明中,通过单击“安全标签”表格中的“查看安全标签信息”图标 可以访问该说明。
* 
由于自定义安全标签值未预先定义,所以在自定义安全标签的信息页面上没有可显示的详细说明。有关自定义安全标签值的任何信息均可包括在自定义安全标签的详细说明中。
例如,将以下行添加到文件的结尾以配置示例自定义安全标签:
WCTYPE|wt.access.SecurityLabeled~SCA|THIRD_PARTY_PROPRIETARY.value=
Third Party Proprietary
WCTYPE|wt.access.SecurityLabeled~SCA|THIRD_PARTY_PROPRIETARY.dataType=
java.lang.String
WCTYPE|wt.access.SecurityLabeled~SCA|THIRD_PARTY_PROPRIETARY.serverFunction=
com.ptc.core.foundation.security.server.impl.SACFSecurityLabel
WCTYPE|wt.access.SecurityLabeled~SCA|
THIRD_PARTY_PROPRIETARY.serverFunction.arg1=
PID{THIRD_PARTY_PROPRIETARY}
WCTYPE|wt.access.SecurityLabeled~SCA|THIRD_PARTY_PROPRIETARY.longDescription=
The "Third Party Proprietary" label indicates the business object's level of third party corporate sensitivity.
* 
请勿删除或修改以下列内容开头的现有行:
WCTYPE|wt.access.SecurityLabeled~SCA|ALL_SECURITY_LABELS
WCTYPE|wt.access.SecurityLabeled~SCA|ALL_STANDARD_SECURITY_LABELS
WCTYPE|wt.access.SecurityLabeled~SCA|ALL_CUSTOM_SECURITY_LABELS
2. Create a Custom Java Evaluator Class - Optional
有关此步骤的详细信息,请参阅“创建自定义 Java 评估器类”一节。
3. Create a Custom Java Translator Class - Optional
有关此步骤的详细信息,请参阅“创建自定义 Java 转换器类”一节。
4. Edit the Security Labels Configuration File - Required
有关此步骤的详细信息,请参阅“编辑自定义安全标签的安全标签配置文件”一节。
5. Edit LogicalAttributesSite.xml - Required
有关此步骤的详细信息,请参阅安全标签配置步骤中的编辑 LogicalAttributesSite.xml
6. Specify Attribute Handler for Label Attribute - Required
在 Windchill shell 中,为每个自定义安全标签运行以下命令:
xconfmanager -s wt.services/svc/default/com.ptc.core.command.
server.delegate.io.AbstractAttributeHandler/ <CUSTOM_SECURITY_LABEL>/wt.access.SecurityLabeled/
0=com.ptc.core.command.server.delegate.io.
SecurityLabelAttributeHandler/
singleton -t codebase/com/ptc/core/foundation/
FoundationAttributeHandler.properties -p
其中 <CUSTOM_SECURITY_LABEL> 是在 securityLabelsConfiguration.xml 文件中指定的自定义安全标签名称。
例如,将针对示例自定义安全标签运行以下命令:
xconfmanager -s wt.services/svc/default/com.ptc.core.command. server.delegate.io.AbstractAttributeHandler/THIRD_PARTY_PROPRIETARY /wt.access.SecurityLabeled/0=com.ptc.core.command.server.delegate .io.SecurityLabelAttributeHandler/singleton -t codebase/com/ ptc/core/foundation/FoundationAttributeHandler.properties -p
7. Restart Windchill method servers.
* 
要启用对象初始化规则、协议、审计以及自定义安全标签的订阅,需要进行附加配置,但对于标准和自定义安全标签,这些步骤是相同的。
有关启用这些附加功能的信息,请参阅安全标签配置步骤
创建自定义 Java 评估器类
* 
如果在确定参与者是否受安全标签值限制或者在确定参与者是否能够修改安全标签值时需要进行自定义评估,则需要自定义 Java 评估器类。
自定义 Java 评估器类可用于确定参与者是否受指定的安全标签值限制,以及确定参与者是否能够修改该安全标签值。为此,此类必须扩展 wt.access.UnrestrictedPrincipalEvaluator 类。
wt.access.UnrestrictedPrincipalEvaluator 类包含四种方法。根据默认行为是否足够,可以覆盖任一方法:
boolean isRestrictedBySecurityLabelValue(WTPrincipal principal, String label_name, String label_value) - 通过评估参与者、安全标签和安全标签值来确定参与者是否受安全标签值的限制。
如果未覆盖此方法,则其默认行为会评估安全标签配置文件中提供的 UFID,以确定该参与者是否是由 UFID 所指定公司或组的成员指定的用户。要在覆盖的方法中获取默认返回值,请在类中包括一个 super.isRestrictedBySecurityLabelValue(principal, label_name, label_value) 调用。
boolean isRestrictedBySecurityLabelValue(WTPrincipal principal, SecurityLabeled object, String label_name, String label_value) - 通过评估参与者、对象、安全标签和安全标签值来确定参与者是否受安全标签值的限制。该对象可以是 AccessControlSurrogateAccessControlSurrogate 作为可持续对象的替代,包含 Windchill 需要确定访问权限的所有属性,而无需拥有完整的可持续对象。有关 AccessControlSurrogate 的详细信息,请参阅“处理 AccessControlSurrogate”一节。
如果未覆盖此方法,则其默认行为是调用布尔型 isRestrictedBySecurityLabelValue(WTPrincipal principal, String label_name, String label_value) 方法。
boolean isAllowedToModifySecurityLabelValue(WTPrincipal principal, SecurityLabeled object, String label_name, String label_value) - 确定是否允许参与者通过评估参与者、安全标签、安全标签值和对象来修改安全标签值。
如果未覆盖此方法,则其默认行为会评估安全标签配置文件中提供的 UFID,以确定该参与者是否是由 UFID 所指定公司或组的成员指定的用户。要在覆盖的方法中获取默认返回值,请在类中包括一个 super.isAllowedToModifySecurityLabelValue(principal, object, label_name, label_value) 调用。
WTKeyedHashMap isAllowedToModifySecurityLabelValues(WTPrincipal principal, WTKeyedMap objects_to_security_labels_map) - 确定是否允许参与者修改对象集合的指定安全标签/值对。为每个指定的标签、值和对象组合返回一个单独的布尔型结果。
如果未覆盖此方法,则其默认行为是为每个对象的每个标签/值对调用单值评估器 isAllowedToModifySecurityLabelValue。例如,如果评估需要针对每个评估单独查询外部系统,则可能会导致性能问题。因此,自定义评估器可能会使用更有效的实现来覆盖此方法 - 例如,将合并外部系统调用或缓存结果以避免重复评估。
自定义 Java 评估器类的示例可在 <Windchill>\prog_examples\access 目录中找到。有关用例和设置 Windchill 以使用示例的详细信息,请参阅 Javadoc 中有关每个已实现方法的自定义 Java 评估器类的信息。
有关使用类文件的详细信息,请参阅管理自定义
处理 AccessControlSurrogate
调用 Windchill 访问控制服务方法来评估用户对信息的访问权限时,可能会为这些方法指定一个可持续对象或 wt.access.AccessControlSurrogateAccessControlSurrogate 作为可持续对象的替代,用于评估在执行数据库查询时所返回的信息的访问权限,而不是完全可持续对象。替代项包含其所代表的类中的属性,并包括进行访问控制决策所需的所有可能属性。
可以为 wt.access.UnrestrictedPrincipalEvaluator 类所定义的布尔型 isRestrictedBySecurityLabelValue(WTPrincipal principal, SecurityLabeled object, String label_name, String label_value) 方法提供一个 AccessControlSurrogate 对象。如果在自定义 Java 评估器类中覆盖此方法,则在尝试检查各种属性之前,您的自定义代码应检查该对象是否为 AccessControlSurrogate 实例。
wt.fc.ObjectIdentifier 方法 getId() 可用于获取所表示的可持续对象的唯一标识符。ObjectIdentifier 中的类名称为 wt.access.AccessControlSurrogate。替代项具有 getTargetClassName 方法,可用于获取所表示的可持续对象的类名称。例如:
Class targetClass = Object.class;
if (object instanceof AccessControlSurrogate) {
try {
targetClass = Class.forName(((AccessControlSurrogate)
object).getTargetClassName());
}
catch (ClassNotFoundException cnfe) {
...
}
long id = PersistenceHelper.getObjectIdentifier(object).getId();
}
AccessControlSurrogate 上提供的属性取决于所表示的可持续对象的类型以及您的系统上是否启用了协议。
以下属性可用,并且已支持 API 对其进行访问:
如果 wt.admin.DomainAdministered 接口是目标类的超接口,则 wt.admin.DomainAdministeredHelper 方法 getAdminDomainRef(DomainAdministered obj) 可用于获取对象的域参考。
如果 wt.lifecycle.LifeCycleManaged 接口是目标类的超接口,则其 getState() 方法可用于获取对象的生命周期状态。
如果 wt.access.SecurityLabeled 接口是目标类的超接口,则 wt.access.AccessControlManager 方法 getSecurityLabels(SecurityLabeled object) 可用于获取对象的安全标签及其值的映射。
如果在您的系统上启用了协议,另外 SecurityLabeled 接口是目标类的超接口:
如果 wt.inf.container.WTContained 接口是目标类的超接口,则 wt.inf.container.WTContainerHelper 方法 getContainer(WTContained contained) 可用于获取对象的上下文。
如果 wt.vc.Iterated 接口是目标类的超接口,则其 getMasterReference() 方法可用于获取小版本主值的 ObjectReference。此外,wt.vc.VersionControlHelper 方法 getBranchIdentifier(Iterated iteration) 还可用于获取小版本的分支 id
如果 wt.vc.wip.Workable 接口是目标类的超接口,则可使用 wt.vc.wip.WorkInProgressHelper 方法 getState(Workable object) 来获取对象及其 API 的正在进行的状态 (例如,isCheckedOut(Workable object), isReservedWorkingCopy(Workable object)isPrivateWorkingCopy(Workable object) 可用于评估状态)
创建自定义 Java 转换器类
对于自定义安全标签,可使用自定义 Java 转换器类将安全标签值的内部表单转换为安全标签值的外部表单,或再转换回来。为此,此类必须扩展 wt.access.CustomSecurityLabelValueTranslator 类。 内部表单在访问评估期间由 Windchill 使用,并存储在数据库中。外部表单为 Windchill 接口中显示的内容,以及用户在指定安全标签值时所输入的内容。如果未定义任何转换器类,则外部表单与内部表单相同,并且是数据库中存储的内容。
对于可包括在内部表单中的内容,有一些限制。等于 (=) 和逗号 (,) 字符不能存储在数据库中。如果用户输入的安全标签值将使用上述任一字符,则必须使用转换器类将其从内部名称中移除。同样,字符串 NULL 不能存储在数据库中。使用自定义 Java 转换器类还允许您使用更长的安全标签值名称。在数据库中,安全标签属性限制为 4000 个字符,因此,过长的安全标签值可能会导致存储问题。通过指定自定义转换器类,可以使用外部表单设置 Windchill 用户界面中的描述性标签值,而使用内部表单将不太易于使用的值存储在数据库中。自定义转换器类也可用于验证自定义安全标签值,尤其是在没有用户界面来验证用户指定的标签值的情况下。
wt.access.CustomSecurityLabelValueTranslator 类包含两种方法:
getExternalValue - 返回与给定内部值关联的外部值。
getInternalValue - 返回与给定外部值关联的内部值。
下面的简单示例移除受限制的逗号字符 (,),并将其替换为不受限制的加号字符 (+)。此示例假设外部值一定不包含加号字符 (+)。
public class CustomTranslator implements CustomSecurityLabelValueTranslator {
public String getExternalValue(String label_name, String internal_value)
throws WTException {
return internal_value.replace("+", ",");
}
public String getInternalValue(String label_name, String external_value)
throws WTException {
return external_value.replace(",", "+");
}
}
当给定相同的输入时,每种方法必须始终返回相同的值。如果预计内部值会随着时间的推移而更改,请考虑在字符串中设置一个版本号。例如,如果自定义安全标签表示您所共事的第三方公司,则可能需要针对每个第三方公司添加其将来可能设立办事处的国家。最初,外部值可以是“公司 A”,其内部值为 "1:A"。将来,如果需要表示公司 A 的办公地点,则外部值可能会更改为“公司 A (美国)”和“公司 A (UK)”。相应的内部值可能会更改为 "2:A-US" 和 "2:A-UK"。版本号可用于指示自定义转换器类将如何单独转换每个版本,因为数据库可能同时存储了两个版本。
有关使用类文件的详细信息,请参阅管理自定义
编辑自定义安全标签的安全标签配置文件
此信息与安全标签配置步骤编辑安全标签配置文件 - 必需步骤相关。
* 
有关如何使用自定义安全标签的示例,可在 <Windchill>/conf/securityLabelsConfiguration_sample.xml 文件中找到。尽管示例配置文件包括与此文档中使用的示例配置相似的示例数据,但必须使用您系统中的实际值方可成功配置自定义安全标签。
安全标签示例配置一节提供了示例配置的说明。
要启用自定义安全标签,请为每个自定义安全标签添加一个 CustomSecurityLabel 元素及其子元素。完成后,保存并关闭此文件。
CustomSecurityLabel 元素
CustomSecurityLabel 元素中包含的内容有:用于定义自定义安全标签的数据、自定义安全标签值的授权参与者 (仅限不包括所有用户时)、与自定义安全标签值相关联的协议类型、用于处理自定义安全标签的应用程序和服务所使用的各种映射。配置的每个自定义安全标签都应具有一个 CustomSecurityLabel 元素。例如:
<CustomSecurityLabel name="THIRD_PARTY_PROPRIETARY" enabled="true">
<SecurityLabelResourceKey>WCTYPE|wt.access.SecurityLabeled~SCA|
THIRD_PARTY_PROPRIETARY</SecurityLabelResourceKey>
<CustomSecurityLabelValues>
<UnrestrictedPrincipal>
<ufid>cn=Employees,cn=Public,ou=people,cn=AdministrativeLdap,
cn=Windchill_10.1,o=ptc|Ldap.ptcnet.ptc.com|
Ldap.ptcnet.ptc.com</ufid>
<evaluatorClass>
com.ourcompany.CustomEvaluator
</evaluatorClass>
</UnrestrictedPrincipal>
<TranslatorClass>
com.ourcompany.CustomTranslator
</TranslatorClass>
</CustomSecurityLabelValues>
<SecurityLabelParameter>THIRD_PARTY_PROPRIETARY
</SecurityLabelParameter>
</CustomSecurityLabel>
CustomSecurityLabel 元素的 name 属性就是存储在数据库中用于此安全标签的字符串,在本例中是 THIRD_PARTY_PROPRIETARY。为使此自定义安全标签在您的 Windchill 解决方案中可用,enabled 属性必须设置为 true。此名称值通常不会显示在用户界面中;此安全标签的显示名称之前在 <Windchill>\wtcustom\wt\access\accessModelRB.rbinfo 文件中进行了定义。
* 
保持 CustomSecurityLabel 元素的名称属性和内部自定义标签值尽可能短。您可以使用 TranslatorClass 元素减小数据库中存储的内部值的大小。有关详细信息,请参阅“创建自定义 Java 转换器类”一节。
SecurityLabelResourceKey 元素表示标签的资源键,并且以下列格式指定:
WCTYPE|wt.access.SecurityLabeled~SCA|<SECURITY_LABEL>
其中,<SECURITY_LABEL>CustomSecurityLabel 元素上 name 属性的值。此资源键必须存在于之前编辑的 accessModelRB.rbinfo 资源文件中。
* 
即使全局禁用安全标签,配置文件中指定的安全标签资源键也必须存在于 accessModelRB.rbinfo 文件中,以便方法服务器能够启动。
有关禁用安全标签的详细信息,请参阅禁用安全标签和值
CustomSecurityLabelValues 元素可以具有单个 UnrestrictedPrincipal 子元素,它将指定此安全标签值的授权参与者。如果省略 UnrestrictedPrincipal 子元素,则所有用户都将获得对带有该自定义标签值的对象的访问权限。
UnrestrictedPrincipal 元素可含有 ufid 子元素。UFID (唯一联合标识符) 用于指定参与者,该参与者可以是用户、用户定义的组或组织。UnrestrictedPrincipal 元素还可以具有 evaluatorClass 子元素,它用于指定在“创建自定义 Java 评估器类”中所创建的评估器类。在 UnrestrictedPrincipal 元素下,ufid 子元素和 evaluatorClass 子元素既可以一同使用,也可以单独使用。有关分别使用 ufid 子元素、evaluatorClass 子元素或同时使用两者的差异,请参阅为自定义安全标签指定授权参与者
UnrestrictedPrincipal 元素可选择具有 AgreementType 子元素。协议可用于向此安全标签值的未授权参与者授予临时许可。AgreementType 元素的内容以下列格式指定:
<logicalTypeId><AGREEMENT_NAME></logicalTypeId>
其中,<AGREEMENT_NAME> 是协议类型或子类型的内部名称。
可选的 TranslatorClass 元素指定在“创建自定义 Java 转换器类”一节中创建的类。TranslatorClass 元素将安全标签值的内部名称转换为外部名称 (在 Windchill 中显示),然后重新转换为内部名称。如果未指定 TranslatorClass 元素,则自定义安全标签的内部值和外部值相同。
可选的 SecurityLabelParameter 元素包含由各种创作应用程序使用的参数名称,该名称作为文件属性而映射到此自定义安全标签。SecurityLabelParameter 始终是 CustomSecurityLabel 元素中的最后一个元素。参数名称必须遵循创作应用程序具有的任何参数名称限制。