beego项目中sso系统与权限系统的接入

最近在项目中需要在后端项目中接入sso系统和权限系统。之前在学习Java时其实也学习过,过了一个寒假就什么都不记得了。

SSO接入

现在sso系统已经很强大,前端完成主要功能,而后端实现对应的接口api/loginapi/logout即可实现前后端的接入。这里只记录基本的逻辑顺序

  1. 前端打开页面时,前端框架自动调用sso系统,执行登录操作
  2. sso登录成功后,前端会调用后端的login接口,传入从前端获得的serviceticket
  3. login函数会以serviceticket,再次向sso系统接口执行一次服务登录校验
  4. 校验成功,接口会传回登录用户的信息,包装成UserInfo的结构体
  5. login函数生成一个随机值作为sessionId,将UserInfo序列化为json串,
  6. 接下来这里有两种处理方式,一种是将用户信息缓存到redis中,即sessionId=session,另一种是将用户Json串执行对称加密转换为token,这两种处理的结果最终都保存到控制器的cookie中,即c.Ctx.SetCookie
  7. 向其他接口发送操作时,都需要判断一下是否是已登录
    路由注册时,采用NSBefore提供一个前置过滤器
		beego.NSBefore(auth.CheckSSO),
		beego.NSNamespace("/login",
			beego.NSInclude(
				&sso.LoginController{},
			),
		),

这样所有的请求进来后都会执行一下这个过滤器。简单梳理一下这个过滤器的执行过程。
8. CheckSSO. 获得当前请求的URL路径,根据URL路径不同可以采用不同的操作,比如对于login这个api可以不用要求必须登录。
9. 从Cookie中拿到sessionId和token,根据这两个参数可以从redis中读取或者是解密出用户信息,拿到userInfo。如果拿到的用户信息为空,说明没有登录,则返回错误信息,前端跳转到登录界面。如果拿到用户信息,则保存到context中,供后面操作中使用。

func CheckSSO(ctx *context.Context) {
	urlPath := ctx.Input.Context.Request.URL.Path
	
	sessionId := ctx.GetCookie(constants.SessionIdName)
	accessToken := ctx.GetCookie(constants.AccessTokenName)
	user, _ := GetUserInfo(sessionId, accessToken)
    ..........
	根据URL和user信息进行分别处理
	..........
	}
}

权限系统接入

这里的权限系统是一个公共的系统,对外提供接口,在系统中创建资源后,设置不同的成员的角色,包括master,developer,guest,这些角色对应不同的权限,可以自己进行设置。权限系统提供的是http接口,只要将系统,人员信息,资源信息等以http请求的方式发送到权限系统,能够返回对应的角色,从而执行权限设置。总的来说还是比较方便的,这里就主要分享一下做法。

反思

以上开发的功能模块其实都是整合现有的系统,难度绝对算不上难。但是实际编写代码时还是会出很多错,主要的问题还是自己编码的规范性和合理性。在编码时考虑接口的使用场景,未来拓展等,以及减少调用函数时的重复操作,尽量实现起来简洁优雅,这些都是以后要慢慢学习,在实际开发中一直注意的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值