当前位置: 首页 > news >正文

校友网站建设东莞桥头网站设计

校友网站建设,东莞桥头网站设计,手机网站加速器,html导航栏模板角色和权限的关联关系在前面文章中有讲解,见[golang gin框架] 14.Gin 商城项目-RBAC管理之角色和权限关联,角色授权,在这里通过微服务来实现角色对权限的授权操作,这里要实现的有两个功能,一个是进入授权,另一个是,授权提交操作,页面如下: 一.实现后台权限管理Rbac之角色权限关… 角色和权限的关联关系在前面文章中有讲解,见[golang gin框架] 14.Gin 商城项目-RBAC管理之角色和权限关联,角色授权,在这里通过微服务来实现角色对权限的授权操作,这里要实现的有两个功能,一个是进入授权,另一个是,授权提交操作,页面如下: 一.实现后台权限管理Rbac之角色权限关联微服务服务端功能 这里需要在proto/rbacRole.proto中增加两个方法:授权操作 Auth(), 执行授权操作DoAuth(),具体参考[golang gin框架] 14.Gin 商城项目-RBAC管理_角色权限管理之增加授权方法,原始代码如下: //授权 func (con RoleController) Auth(c *gin.Context) {//获取idid, err : models.Int(c.Query(id))if err ! nil {con.Error(c, 传入数据错误, /admin/role)return}role : models.Role{Id: id}models.DB.Find(role)//获取所有权限列表accessList : []models.Access{}models.DB.Where(module_id ?, 0).Preload(AccessItem).Find(accessList)//获取当前角色拥有的权限,并把权限id放在一个map对象中roleAccess : []models.RoleAccess{}models.DB.Where(role_id ?, id).Find(roleAccess)roleAccessMap : make(map[int]int)for _, v : range roleAccess {roleAccessMap[v.AccessId] v.AccessId}//循环遍历所有权限数据,判断当前权限的id是否在角色权限的map对象中,如果是的话给当前数据加入checked属性for i : 0; i len(accessList); i { //循环权限列表if _, ok : roleAccessMap[accessList[i].Id]; ok { // 判断当前权限是否在角色权限的map对象中accessList[i].Checked true}for j : 0; j len(accessList[i].AccessItem); j { // 判断当前权限的子栏位是否在角色权限的map中if _, ok : roleAccessMap[accessList[i].AccessItem[j].Id]; ok { // 判断当前权限是否在角色权限的map对象中accessList[i].AccessItem[j].Checked true}}}c.HTML(http.StatusOK, admin/role/auth.html, gin.H{roleId: id,accessList: accessList,}) }//授权提交 func (con RoleController) DoAuth(c *gin.Context) {//获取提交的表单数据roleId, err : models.Int(c.PostForm(role_id))if err ! nil {con.Error(c, 传入数据错误, /admin/role)return}//获取表单提交的权限id切片accessIds : c.PostFormArray(access_node[])//先删除当前角色对应的权限roleAccess : models.RoleAccess{}models.DB.Where(role_id ?, roleId).Delete(roleAccess)//循环遍历accessIds,增加当前角色对应的权限for _, v : range accessIds {roleAccess.RoleId roleIdaccessId, _ : models.Int(v)roleAccess.AccessId accessIdmodels.DB.Create(roleAccess)}con.Success(c, 角色授权成功, /admin/role) } 1.在proto/rbacRole.proto下增加Auth(),DoAuth()方法相关代码 参考上述方法,在角色微服务的proto中的service RbacRole中增加Auth(),DoAuth()相关方法代码,代码如下: //角色管理 service RbacRole {//获取角色rpc方法: 请求参数RoleGetRequest, 响应参数RoleGetResponserpc RoleGet(RoleGetRequest) returns (RoleGetResponse) {}//增加角色rpc方法: 请求参数RoleAddRequest, 响应参数RoleAddResponserpc RoleAdd(RoleAddRequest) returns (RoleAddResponse) {}//编辑角色rpc方法: 请求参数RoleEditRequest, 响应参数RoleEditResponserpc RoleEdit(RoleEditRequest) returns (RoleEditResponse) {}//删除角色rpc方法: 请求参数RoleDeleteRequest, 响应参数RoleDeleteResponserpc RoleDelete(RoleDeleteRequest) returns (RoleDeleteResponse) {}//授权rpc RoleAuth(RoleAuthRequest) returns (RoleAuthResponse) {}//授权提交rpc RoleDoAuth(RoleDoAuthRequest) returns (RoleDoAuthResponse) {} } 这里需要实现角色授权请求方法RoleAuthRequest(),角色授权请求响应方法RoleAuthResponse(),通过上述Auth()方法可以确定:RoleAuthRequest()请求中需要传递一个角色id roleId,响应方法中返回权限切片,需要构建一个message AccessModel,代码如下: //权限相关模型:参考models/access.go message AccessModel{int64 id1;string moduleName 2;string actionName3;int64 type4;string url5;int64 moduleId6;int64 sort 7;string description8;int64 status9;int64 addTime10;bool checked11;repeated AccessModel accessItem12; }//角色授权参数 message RoleAuthRequest{int64 roleId1; } //角色授权响应参数 message RoleAuthResponse{repeated AccessModel accessList1; }而实现角色授权提交请求方法RoleDoAuthRequest(),角色授权提交请求响应方法RoleDoAuthResponse(),通过上述Auth()方法可以确定:RoleDoAuthRequest请求中需要传递角色id roleId以及角色对应的权限id切片,响应方法中返回是否操作完成,代码如下: //角色授权提交参数 message RoleDoAuthRequest{int64 roleId1;repeated string accessIds2; }//角色授权提交响应参数 message RoleDoAuthResponse{bool success1;string message2; } 完整代码如下: syntax proto3;package rbac;option go_package ./proto/rbacRole;//角色管理 service RbacRole {//获取角色rpc方法: 请求参数RoleGetRequest, 响应参数RoleGetResponserpc RoleGet(RoleGetRequest) returns (RoleGetResponse) {}//增加角色rpc方法: 请求参数RoleAddRequest, 响应参数RoleAddResponserpc RoleAdd(RoleAddRequest) returns (RoleAddResponse) {}//编辑角色rpc方法: 请求参数RoleEditRequest, 响应参数RoleEditResponserpc RoleEdit(RoleEditRequest) returns (RoleEditResponse) {}//删除角色rpc方法: 请求参数RoleDeleteRequest, 响应参数RoleDeleteResponserpc RoleDelete(RoleDeleteRequest) returns (RoleDeleteResponse) {}//授权rpc RoleAuth(RoleAuthRequest) returns (RoleAuthResponse) {}//授权提交rpc RoleDoAuth(RoleDoAuthRequest) returns (RoleDoAuthResponse) {} }//角色相关model message RoleModel{int64 id1;string title2;string description3;int64 status4;int64 addTime 5; }//权限相关模型:参考models/access.go message AccessModel{int64 id1;string moduleName 2;string actionName3;int64 type4;string url5;int64 moduleId6;int64 sort 7;string description8;int64 status9;int64 addTime10;bool checked11;repeated AccessModel accessItem12; }//获取角色请求参数 message RoleGetRequest{//角色idint64 id 1; }//获取角色响应参数 message RoleGetResponse{//角色model切片repeated RoleModel roleList1; }//增加角色请求参数 message RoleAddRequest{//角色名称string title1;//说明string description2;//状态int64 status3;//增加时间int64 addTime 4; }//增加角色响应参数 message RoleAddResponse{//是否增加成功bool success1;//返回状态说明string message2; }//编辑角色请求参数 message RoleEditRequest{//角色idint64 id1;//角色名称string title2;//说明string description3;//状态int64 status4;//增加时间int64 addTime 5; }//编辑角色响应参数 message RoleEditResponse{ //是否编辑成功bool success1;//返回状态说明string message2; }//删除角色请求参数 message RoleDeleteRequest{//角色idint64 id1; }//删除角色响应参数 message RoleDeleteResponse{ //是否删除成功bool success1;//返回状态说明string message2; }//角色授权参数 message RoleAuthRequest{int64 roleId1; } //角色授权响应参数 message RoleAuthResponse{repeated AccessModel accessList1; }//角色授权提交参数 message RoleDoAuthRequest{int64 roleId1;repeated string accessIds2; }//角色授权提交响应参数 message RoleDoAuthResponse{bool success1;string message2; } 2.编译一下rbacRole.proto 因为修改了rbacRole.proto,那么就需要再次使用命令protoc --proto_path. --micro_out. --go_out:. proto/rbacRole.proto在在server/rbac下运行,重新编译,生成role相关pb.go,pb.micro.go文件 3.在handler/rbacRole.go文件中,实现新增的Auth(),DoAuth()方法 在实现之前,需要在models下引入角色-权限关联模型:RoleAcces.go模型: package models//角色-权限 关联表type RoleAccess struct {AccessId intRoleId int }func (RoleAccess) TableName() string {return role_access }然后才实现Auth(),DoAuth()方法,参考[golang gin框架] 14.Gin 商城项目-RBAC管理_角色权限关联 中的Auth(),DoAuth方法,并抽离其中的代码,在handler/rbacRole.go中实现方法中对应的逻辑,代码如下: //授权 func (e *RbacRole) RoleAuth(ctx context.Context, req *pb.RoleAuthRequest, res *pb.RoleAuthResponse) error {//1、获取角色id req.RoleId//获取所有权限列表accessList : []models.Access{}models.DB.Where(module_id ?, 0).Preload(AccessItem).Find(accessList)//获取当前角色拥有的权限,并把权限id放在一个map对象中roleAccess : []models.RoleAccess{}models.DB.Where(role_id ?, req.RoleId).Find(roleAccess)roleAccessMap : make(map[int]int)for _, v : range roleAccess {roleAccessMap[v.AccessId] v.AccessId}//循环遍历所有权限数据,判断当前权限的id是否在角色权限的map对象中,如果是的话给当前数据加入checked属性for i : 0; i len(accessList); i { //循环权限列表if _, ok : roleAccessMap[int(accessList[i].Id)]; ok { // 判断当前权限是否在角色权限的map对象中, 需要进行类型转换accessList[i].Checked true}for j : 0; j len(accessList[i].AccessItem); j { // 判断当前权限的子栏位是否在角色权限的map中if _, ok : roleAccessMap[int(accessList[i].AccessItem[j].Id)]; ok { // 判断当前权限是否在角色权限的map对象中accessList[i].AccessItem[j].Checked true}}}//处理数据:进行类型转换匹配操作var tempList []*pb.AccessModelfor _, v : range accessList {var tempItemList []*pb.AccessModelfor _, k : range v.AccessItem {tempItemList append(tempItemList, pb.AccessModel{Id: int64(k.Id),ModuleName: k.ModuleName,ActionName: k.ActionName,Type: int64(k.Type),Url: k.Url,ModuleId: int64(k.ModuleId),Sort: int64(k.Sort),Description: k.Description,Status: int64(k.Status),Checked: k.Checked,AddTime: int64(k.AddTime),})}tempList append(tempList, pb.AccessModel{Id: int64(v.Id),ModuleName: v.ModuleName,ActionName: v.ActionName,Type: int64(v.Type),Url: v.Url,ModuleId: int64(v.ModuleId),Sort: int64(v.Sort),Description: v.Description,Status: int64(v.Status),AddTime: int64(v.AddTime),Checked: v.Checked,AccessItem: tempItemList,})}res.AccessList tempListreturn nil }//执行授权 func (e *RbacRole) RoleDoAuth(ctx context.Context, req *pb.RoleDoAuthRequest, res *pb.RoleDoAuthResponse) error {//先删除当前角色对应的权限roleAccess : models.RoleAccess{}models.DB.Where(role_id ?, req.RoleId).Delete(roleAccess)//循环遍历accessIds,增加当前角色对应的权限for _, v : range req.AccessIds {roleAccess.RoleId int(req.RoleId)accessId, _ :strconv.Atoi(v)roleAccess.AccessId accessIdmodels.DB.Create(roleAccess)}res.Success trueres.Message 授权成功return nil }4.实现后台权限管理Rbac之角色权限关联微服务客户端调用功能 因为修改了rbacRole.proto文件,并重新编译了,故要复制server/rbac/proto文件夹下rbacRole.go以及rbacRole文件夹到client项目中的proto文件夹下 然后在controllers/admin/roleController.go中实现Auth(),DoAuth()调用角色-权限关联微服务方法,需要先删除Auth(),DoAuth()中旧的代码,然后增加新的角色-权限关联微服务方法,旧的方法见文章开头代码,新代码如下: //授权 func (con RoleController) Auth(c *gin.Context) {//获取idid, err : models.Int(c.Query(id))if err ! nil {con.Error(c, 传入数据错误, /admin/role)return}role : models.Role{Id: id}models.DB.Find(role)//调用微服务获取角色授权相关数据rbacClient : pbRbac.NewRbacRoleService(rbac, models.RbacClient)res, _ : rbacClient.RoleAuth(context.Background(), pbRbac.RoleAuthRequest{RoleId: int64(id),})c.HTML(http.StatusOK, admin/role/auth.html, gin.H{roleId: id,accessList: res.AccessList,}) }//授权提交 func (con RoleController) DoAuth(c *gin.Context) {//获取提交的表单数据roleId, err : models.Int(c.PostForm(role_id))if err ! nil {con.Error(c, 传入数据错误, /admin/role)return}//获取表单提交的权限id切片accessIds : c.PostFormArray(access_node[])//调用微服务执行授权rbacClient : pbRbac.NewRbacRoleService(rbac, models.RbacClient)res, _ : rbacClient.RoleDoAuth(context.Background(), pbRbac.RoleDoAuthRequest{RoleId: int64(roleId),AccessIds: accessIds,})if res.Success {con.Success(c, 角色授权成功, /admin/role)return}con.Error(c, 授权失败, /admin/role/auth?idmodels.String(roleId)) }完整的roleController.go代码如下: package adminimport (contextgithub.com/gin-gonic/gingoshop/modelspbRbac goshop/proto/rbacRolenet/httpstrings )type RoleController struct {BaseController }//角色列表 func (con RoleController) Index(c *gin.Context) {//调用Rbac微服务rbacClient : pbRbac.NewRbacRoleService(rbac, models.RbacClient)res, _ : rbacClient.RoleGet(context.Background(), pbRbac.RoleGetRequest{})c.HTML(http.StatusOK, admin/role/index.html, gin.H{roleList: res.RoleList,}) }//新增角色 func (con RoleController) Add(c *gin.Context) {c.HTML(http.StatusOK, admin/role/add.html, gin.H{}) }//新增角色:提交 func (con RoleController) DoAdd(c *gin.Context) {//获取表单的提交数据//strings.Trim(str, cutset), 去除字符串两边的cutset字符title : strings.Trim(c.PostForm(title), ) // 去除字符串两边的空格description : strings.Trim(c.PostForm(description), )//判断角色名称是否为空if title {con.Error(c, 角色名称不能为空, /admin/role/add)return}//调用微服务,实现角色的添加rbacClient : pbRbac.NewRbacRoleService(rbac, models.RbacClient)res, _ : rbacClient.RoleAdd(context.Background(), pbRbac.RoleAddRequest{Title: title,Description: description,AddTime: models.GetUnix(),Status: 1,})if !res.Success {con.Error(c, 增加角色失败 请重试, /admin/role/add)} else {con.Success(c, 增加角色成功, /admin/role)} }//编辑角色 func (con RoleController) Edit(c *gin.Context) {//获取角色idid, err : models.Int(c.Query(id))if err ! nil {con.Error(c, 传入数据错误, /admin/role)} else {//调用微服务,获取角色信息rbacClient : pbRbac.NewRbacRoleService(rbac, models.RbacClient)res, _ : rbacClient.RoleGet(context.Background(), pbRbac.RoleGetRequest{Id: int64(id),})c.HTML(http.StatusOK, admin/role/edit.html, gin.H{role: res.RoleList[0],})} }//编辑角色:提交 func (con RoleController) DoEdit(c *gin.Context) {//获取提交的表单数据id, err : models.Int(c.PostForm(id))if err ! nil {con.Error(c, 传入数据错误, /admin/role)return}//获取表单的提交数据//strings.Trim(str, cutset), 去除字符串两边的cutset字符title : strings.Trim(c.PostForm(title), ) // 去除字符串两边的空格description : strings.Trim(c.PostForm(description), )//判断角色名称是否为空if title {con.Error(c, 角色名称不能为空, /admin/role/add)return}//调用微服务修改rbacClient : pbRbac.NewRbacRoleService(rbac, models.RbacClient)res, _ : rbacClient.RoleEdit(context.Background(), pbRbac.RoleEditRequest{Id: int64(id),Title: title,Description: description,})if !res.Success {con.Error(c, 修改数据失败, /admin/role/edit?idmodels.String(id))return}con.Success(c, 修改数据成功, /admin/role) }//删除角色 func (con RoleController) Delete(c *gin.Context) {//获取提交的表单数据id, err : models.Int(c.Query(id))if err ! nil {con.Error(c, 传入数据错误, /admin/role)return}rbacClient : pbRbac.NewRbacRoleService(rbac, models.RbacClient)res, _ : rbacClient.RoleDelete(context.Background(), pbRbac.RoleDeleteRequest{Id: int64(id),})if res.Success {con.Success(c, 删除数据成功, /admin/role)return}con.Error(c, 删除数据失败, /admin/role) }//授权 func (con RoleController) Auth(c *gin.Context) {//获取idid, err : models.Int(c.Query(id))if err ! nil {con.Error(c, 传入数据错误, /admin/role)return}role : models.Role{Id: id}models.DB.Find(role)//调用微服务获取角色授权相关数据rbacClient : pbRbac.NewRbacRoleService(rbac, models.RbacClient)res, _ : rbacClient.RoleAuth(context.Background(), pbRbac.RoleAuthRequest{RoleId: int64(id),})c.HTML(http.StatusOK, admin/role/auth.html, gin.H{roleId: id,accessList: res.AccessList,}) }//授权提交 func (con RoleController) DoAuth(c *gin.Context) {//获取提交的表单数据roleId, err : models.Int(c.PostForm(role_id))if err ! nil {con.Error(c, 传入数据错误, /admin/role)return}//获取表单提交的权限id切片accessIds : c.PostFormArray(access_node[])//调用微服务执行授权rbacClient : pbRbac.NewRbacRoleService(rbac, models.RbacClient)res, _ : rbacClient.RoleDoAuth(context.Background(), pbRbac.RoleDoAuthRequest{RoleId: int64(roleId),AccessIds: accessIds,})if res.Success {con.Success(c, 角色授权成功, /admin/role)return}con.Error(c, 授权失败, /admin/role/auth?idmodels.String(roleId)) }二.校验权限管理Rbac之角色权限关联微服务功能 参考[golang gin框架] 43.Gin商城项目-微服务实战之后台Rbac微服务之管理员的增删改查以及管理员和角色关联 1.先启动服务端 见[golang gin框架] 40.Gin商城项目-微服务实战之Captcha验证码微服务代码, 这里还要启动验证码captcha微服务服务端代码以及权限管理Rbac微服务(用户登录微服务服务端,角色管理微服务服务端,管理员管理微服务服务端)服务端才行 2.启动客户端 在项目根目录下运行 :go run main.go,启动项目 3.校验权限管理Rbac之角色权限关联微服务操作是否成功  访问后台登录页面,输入用户名,密码,验证码,登录到后台后,进入角色管理列表页面,对角色进行授权操作 好了,权限管理Rbac之角色权限关联微服务功能客户端操作完成,下面一节讲解:修改商城客户端调用微服务的权限验证以及Rbac微服务数据库抽离功能 [上一节][golang gin框架] 44.Gin商城项目-微服务实战之后台Rbac微服务之权限的增删改查微服务
http://www.dnsts.com.cn/news/62007.html

相关文章:

  • 电子商务网站建设与管理设计报告政务门户网站建设方案
  • 自己做购物网站需要什么中山市企业网站seo营销工具
  • 购物网站主页模版多终端网站
  • 北京网站设计十年乐云seo有效的网络营销方式
  • 上海装修公司排名前十强是哪十家东营seo网站推广
  • 做视频网站要什么软件网页设计的流行趋势有哪些
  • 常州天启建设公司网站租用服务器做视频网站
  • 那些网站可以做海报wordpress4.94版
  • 河南城市建设招标类网站做网站坂田
  • 1688网站建设方案书模板基于分布式控件的网站开发框架
  • 邢台城乡规划局建设工程网站咖啡seo是什么意思
  • 外贸网站海外推广3个必去网站网站默认后台
  • wordpress文件上传位置修改湛江seo网站推广
  • 开发建设网站的实施过程是一个网站建设 专家
  • 网站建设合作报道网页是不是网站
  • 哪里有网站建设中心广西建设工程质量监督网站
  • 做酒店工作去哪个招聘网站好vs做网站
  • 网站服务是指在线定制家具
  • 网站建设系统设计天津市网站建设天津商城建设
  • 网站切换上海城隍庙门票多少钱
  • 菏泽市城乡和建设局网站广东新闻联播2020
  • 怎么样给公司做网站网站登录界面模板
  • 网站建设怎么分类瑶海合肥网站建设
  • 黄浦区网站建设徐州建设工程招投标官方网站
  • 怎么做网站备案连接如何建立公司自己的网站
  • 个人网站首页怎么做wordpress 文章不同背景图片
  • 下载搭建网站软件下载wordpress模版
  • 网站建设有什么需求分析科技类网站
  • 广东省做农业网站公司怎么再各网站上做宣传
  • 网站建设 设计方案 百度文库广告关键词有哪些类型