keystone中无论是创建用户、更新用户还是其它操作,在controller方法的入口处,一般首先对入参进行基本校验。
keystone封装了一个通用的类SchemaValidator,位于keystone\common\validation\validators模块中。
代码如下所示:
def create_user(self, request, user):
validation.lazy_validate(schema.user_create, user)
def lazy_validate(request_body_schema, resource_to_validate)
schema_validator = validattors.SchemaValidator(request_body_schema)
schema_validator.validate(resource_to_validate)
传入的参数:
schema.user_create
user_create = {
'type': 'object',
'properties': _user_properties, //表示待校验的property, 引用_user_properties(创建用户的json体中)
'required': ['name'],//json体中,必须包含那个(些)property
'minProperties': 1,//json体中,至少包含一个property
'options': {//不懂
'type': 'object'
},
'additionalProperties': True//是否允许有额外的property,如果为False则json体只能是_user_properties子集
}
_user_properties = {
'default_project_id': validation.nullable(parameter_types.id_string),//表示项目Id也可以为null
'domain_id': parameter_types.id_string,//string类型,最小长度1最大长度64,正则匹配
'enabled': parameter_types.boolean,//必须是bolean型
'name': _identity_name,//String类型,最小长度1,正则匹配
'password': {
'type': ['string', 'null']//String类型,或者为null
},
'options': ro.USER_OPTIONS_REGISTRY.json_schema
}
parameter_types.id_string:
id_string = {
'type': 'string',
'minLength': 1,
'maxLength': 64,
'pattern': '^[a-zA-Z0-9-]+$'
}
_identity_name = {
'type': 'string',
'minLength': 1,
'pattern': '[\S]+'
}
只支持对string、boolean类型的数值检查。如果是整型,json体中,value也需要写成字符串的形式。