其实网站源码分享如何增加授权的问题并不复杂,但是又很多的朋友都不太了解怎样给网站源码加授权,因此呢,今天小编就来为大家分享网站源码分享如何增加授权的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!
精品专栏
《GitHub:中文详细注释的开源项目》
摘要:原创出处http://www.iocoder.cn/Apollo/portal-associate-namespace/「芋道源码」欢迎转载,保留摘要,谢谢!
1.概述2.Portal侧3.AdminService侧666.彩蛋
1.概述
老艿艿:本系列假定胖友已经阅读过《Apollo官方wiki文档》,特别是《Apollo官方wiki文档——核心概念之“Namespace”》。
本文分享Portal关联Namespace的流程,整个过程涉及Portal、AdminService,如下图所示:
流程
老艿艿:因为Portal是管理后台,所以从代码实现上,和业务系统非常相像。也因此,本文会略显啰嗦。
2.Portal侧
2.1NamespaceController
在apollo-portal项目中,com.ctrip.framework.apollo.portal.controller.NamespaceController,提供AppNamespace和Namespace的API。
在关联Namespace的界面中,点击【提交】按钮,调用创建Namespace的API。
关联Namespace
公用类型的Namespace的名字是全局唯一,所以关联时,只需要查看名字即可。
appId)”)\n9:@RequestMapping(value=”/apps/{appId}/namespaces”,method=RequestMethod.POST)\n10:publicResponseEntity<Void>createNamespace(@PathVariableStringappId,\n11:@RequestBodyList<NamespaceCreationModel>models){\n12://校验`models`非空\n13:checkModel(!CollectionUtils.isEmpty(models));\n14://初始化Namespace的Role们\n15:StringnamespaceName=models.get(0).getNamespace().getNamespaceName();\n16:Stringoperator=userInfoHolder.getUser().getUserId();\n17:roleInitializationService.initNamespaceRoles(appId,namespaceName,operator);\n18://循环`models`,创建Namespace对象\n19:for(NamespaceCreationModelmodel:models){\n20:NamespaceDTOnamespace=model.getNamespace();\n21://校验相关参数非空\n22:RequestPrecondition.checkArgumentsNotEmpty(model.getEnv(),namespace.getAppId(),namespace.getClusterName(),namespace.getNamespaceName());\n23://创建Namespace对象\n24:try{\n25:namespaceService.createNamespace(Env.valueOf(model.getEnv()),namespace);\n26:}catch(Exceptione){\n27:logger.error(“createnamespacefail.”,e);\n28:Tracer.logError(String.format(“createnamespacefail.(env=%snamespace=%s)”,model.getEnv(),namespace.getNamespaceName()),e);\n29:}\n30:}\n31://授予NamespaceRole给当前管理员\n32:assignNamespaceRoleToOperator(appId,namespaceName);\n33:returnResponseEntity.ok().build();\n34:}\n
POST`/apps/{appId}/namespaces`接口,RequestBody传递JSON对象。@PreAuthorize(…)注解,调用PermissionValidatorcheckArgumentsNotEmpty(String…args)方法,校验NamespaceDTO的envappIdclusterNamenamespaceName非空。第25行:调用NamespaceServicecreateNamespace(Envenv,NamespaceDTOnamespace)方法,保存Namespace对象到AdminService中。代码如下:
1:@Autowired\n2:privateUserInfoHolderuserInfoHolder;\n3:@Autowired\n4:privateAdminServiceAPI.NamespaceAPInamespaceAPI;\n5:\n6:publicNamespaceDTOcreateNamespace(Envenv,NamespaceDTOnamespace){\n7://设置NamespaceDTO的创建和修改人为当前管理员\n8:if(StringUtils.isEmpty(namespace.getDataChangeCreatedBy())){\n9:namespace.setDataChangeCreatedBy(userInfoHolder.getUser().getUserId());\n10:}\n11:namespace.setDataChangeLastModifiedBy(userInfoHolder.getUser().getUserId());\n12://创建Namespace到AdminService\n13:NamespaceDTOcreatedNamespace=namespaceAPI.createNamespace(env,namespace);\n14://【TODO6001】Tracer日志\n15:Tracer.logEvent(TracerEventType.CREATE_NAMESPACE,String.format(“%s+%s+%s+%s”,namespace.getAppId(),env,namespace.getClusterName(),namespace.getNamespaceName()));\n16:returncreatedNamespace;\n17:}\n
第7至11行:设置NamespaceDTO的创建和修改人。第13行:调用NamespaceAPIcreate(appId,clusterName,NamespaceDTO)方法,创建Namespace。代码如下:
1:@RestController\n2:publicclassNamespaceController{\n3:\n4:@Autowired\n5:privateNamespaceServicenamespaceService;\n6:\n7:/**\n8:*创建Namespace\n9:*\n10:*@paramappIdApp编号\n11:*@paramclusterNameCluster名字\n12:*@paramdtoNamespaceDTO对象\n13:*@return创建成功的NamespaceDTO对象\n14:*/\n15:@RequestMapping(path=”/apps/{appId}/clusters/{clusterName}/namespaces”,method=RequestMethod.POST)\n16:publicNamespaceDTOcreate(@PathVariable(“appId”)StringappId,\n17:@PathVariable(“clusterName”)StringclusterName,@RequestBodyNamespaceDTOdto){\n18://校验NamespaceDTO的`namespaceName`格式正确。\n19:if(!InputValidator.isValidClusterNamespace(dto.getNamespaceName())){\n20:thrownewBadRequestException(String.format(“Namespace格式错误:%s”,InputValidator.INVALID_CLUSTER_NAMESPACE_MESSAGE));\n21:}\n22://将NamespaceDTO转换成Namespace对象\n23:Namespaceentity=BeanUtils.transfrom(Namespace.class,dto);\n24://判断`name`在Cluster下是否已经存在对应的Namespace对象。若已经存在,抛出BadRequestException异常。\n25:NamespacemanagedEntity=namespaceService.findOne(appId,clusterName,entity.getNamespaceName());\n26:if(managedEntity!=null){\n27:thrownewBadRequestException(“namespacealreadyexist.”);\n28:}\n29://保存Namespace对象\n30:entity=namespaceService.save(entity);\n31://将保存的Namespace对象转换成NamespaceDTO\n32:dto=BeanUtils.transfrom(NamespaceDTO.class,entity);\n33:returndto;\n34:}\n35:\n36://…省略其他接口和属性\n37:}\n
POST`/apps/{appId}/clusters/{clusterName}/namespaces`接口,RequestBody传递JSON对象。第18至21行:调用InputValidatortransfrom(Classclazz,Objectsrc)方法,将NamespaceDTO转换成Namespace对象。第20至23行:调用NamespaceServicesave(Namespace)方法,保存Namespace对象到数据库。第30至32行:调用BeanUtils#transfrom(Classclazz,Objectsrc)方法,将保存的Namespace对象,转换成NamespaceDTO返回。
3.2NamespaceService
在《Apollo源码解析——Portal创建Namespace》的「4.4NamespaceService」,已经详细解析。
3.3NamespaceRepository
在《Apollo源码解析——Portal创建Namespace》的「4.5NamespaceRepository」,已经详细解析。
666.彩蛋
有点水更,写的自己都不好意思了。
有一点需要补充,公用类型和关联类型的判定,差异点仅仅是Namespace和其对应的AppNamespace的appId是否一致。
若一致,就是公用类型。若不同,就是关联类型。
着意味着什么?如果我们在一个应用下给的ClusterA和B创建了一个名为ns的公用类型的AppNamespace,那么在ClusterA和B都会生成对应的Namespace。
如果此处删除了B的Namespace,则在B下面就不存在该Namespace。
如果我们再通过关联的方式,添加了ns,生成的Namespace是公用类型,而不是关联类型。
一定要注意!!!
关于网站源码分享如何增加授权,怎样给网站源码加授权的介绍到此结束,希望对大家有所帮助。
