应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

给女朋友讲某宝是如何设计用户权限管理的(一)

  一、概述
  java应用系统设计过程中,用户认证、用户授权、鉴权是绕不过去的话题。
  如果这个权限管理的设计,没有做到与业务系统的隔离,拓展性不够强,很容易就会拖后腿。
  这个问题应该做过开发的同学都会有所体会。
  现在网络上的各种关于权限管理的框架比较主流的有ApacheShiro,SpringSecurity,SaToken(新兴起的一个优秀框架)。
  这里会有同学说,既然已经有这么多的成熟优秀的权限管理框架,为什么还有再给大家介绍这种实现思路。
  在本人工作和学习的过程中,经常会使用这些优秀的权限管理框架。
  但是,一旦是这些三方框架出现的异常和问题,想要排查,就比较麻烦。要么就是靠着百度大家的经验。要么就是猛扒代码,一点点去排查。
  三方框架对于我们使用者来说,就像是一个黑盒。这一点一直让我觉得有点不顺畅。
  同学们,谁不想要一个自己知根知底的的权限管理框架呢。
  喜欢的朋友可以关注一下
  二、框架使用体验
  2。1项目初始化配置
  Springboot老三样。添加pom依赖修改配置文件编写组件代码
  引入pom依赖:!引入鉴权框架客户端dependencygroupIdcom。lhit。securitygroupIdsecurityclientartifactIdversion0。0。1SNAPSHOTversiondependency!引入鉴权框架服务端dependencygroupIdcom。lhit。securitygroupIdsecurityserverartifactIdversion0。0。1SNAPSHOTversiondependency
  修改配置文件:lhit:security:serverurlofcheckurl:securitycheckurl不配置默认就是这个路径serverurlofcheckpermscode:securitycheckpermscode不配置默认就是这个路径serverurlofcheckstaticrespath:securitycheckstaticrespath不配置默认就是这个路径serverurloftokentoauthority:securitytokentoauthority不配置默认就是这个路径useCloud:false不配置默认为true回去注册中心查找授权中心服务tokenkey:LHTOKEN请求头中token的keyexpire:9999999
  2。2用户登录
  自定义一个凭证类GetterSetterNoArgsConstructorAllArgsConstructorpublicclassUsernamePasswordVerificationimplementsSecurityVoucher{用户名NotBlank(message未上传username)ApiModelProperty(valueusername)privateStringusername;NotBlank(message密码不能为空)ApiModelProperty(value密码)privateStringpassword;}
  自定义一个凭证类认证器:
  这个认证器很简单就是默认admin密码123456然后给与了固定的角色和全部的资源。实际应用中应该从数据库中获取到用户的权限并组织返回的securityAuthority。ComponentpublicclassDefaultUsernamePasswordVoucherVoucherVerificationimplementsSecurityVoucherVerificationUsernamePasswordVerification{OverridepublicSecurityAuthorityverification(UsernamePasswordVerificationusernamePasswordVoucher)throwsException{if(usernamePasswordVoucher。getUsername()。equals(admin)usernamePasswordVoucher。getPassword()。equals(123456)){SecurityAuthoritysecurityAuthoritynewSecurityAuthority();securityAuthority。setSecurityUser(newSecurityUser(1,admin));securityAuthority。setSecurityRoleList(Lists。newArrayList(newSecurityRole(0L,roleNo,管理员)));securityAuthority。setSecurityResList(Lists。newArrayList(SecurityRes。allCodeRes(),SecurityRes。allUrlRes()));returnsecurityAuthority;}throwCommonException。create(ServerResponse。createByError(用户名或密码错误,默认admin123456));}}
  开放认证接口:Slf4jApi(tags认证接口)RestControllerRequestMapping(security)publicclassAuthorizeController{AutowiredprivateSecurityServersecurityServer;PostMapping(loginusernamepassword)ApiOperation(系统用户登录)ApiImplicitParams({ApiImplicitParam(paramTypebody,dataTypeUsernamePasswordVerification,dataTypeClassUsernamePasswordVerification。class,nameparam,value参数)})publicServerResponsesysUserLoginByUsernamePassword(ValidatedRequestBodyUsernamePasswordVerificationparam)throwsException{log。info();log。info(进入系统用户登录接口:LoginAuthenticationControllersysUserLoginByUsernamePassword);AuthenticationVoauthorizesecurityServer。authorize(param);returnServerResponse。createBySuccess(登录成功,authorize);}GetMapping(logout)ApiOperation(用户退出)ApiImplicitParams({ApiImplicitParam(paramTypeheader,dataTypestring,nameLHTOKEN,value用户token),})publicServerResponselogout(RequestHeader(valueLHTOKEN,defaultValue)Stringtoken)throwsException{log。info();log。info(进入获取当前用户信息接口:SysUserControllerlogout);securityServer。tokenDestroy(newTokenParam(token));returnServerResponse。createBySuccess(退出成功);}获取当前用户信息GetMapping(currentuserprems)ApiOperation(获取当前用户权限信息)ApiImplicitParams({ApiImplicitParam(paramTypeheader,dataTypestring,nameLHTOKEN,value用户token),})TokenToAuthority这个注解将请求同中的token信息转换为securityAuthority参数,到当前方法中。publicServerResponseSecurityAuthoritygetUesrPremsInfo(ApiIgnoreSecurityAuthoritysecurityAuthority)throwsException{log。info();log。info(进入获取当前用户信息接口:SysUserCurrentUserControllergetUesrInfo);returnServerResponse。createBySuccess(获取成功,securityAuthority);}}
  2。3权限验证
  路由级别鉴权:
  不用做其他额外的配置只需要打上HasUrl就会获取到Controller层的当前url地址,并校验用户是否有访问该url的权限。
  并将解析后的用户信息放到方法的SecurityAuthority参数中
  在第一步用户登录时,默认给了SecurityRes。allUrlRes(),则配置了的url访问权限。删除用户DeleteMapping(delete{userId})ApiOperation(删除用户)ApiImplicitParams({ApiImplicitParam(paramTypeheader,dataTypestring,nameLHTOKEN,value用户token),ApiImplicitParam(paramTypepath,dataTypeLong,dataTypeClassLong。class,nameuserId,value用户id)})HasUrlpublicServerResponsedelUser(PathVariable(valueuserId)LonguserId,ApiIgnoreSecurityAuthoritysecurityAuthority)throwsException{log。info();log。info(进入删除用户接口:SysUserAdminControllerdelUser);sysUserService。delUser(userId,getCurrentSysUser(securityAuthority));returnServerResponse。createBySuccess(删除成功);}
  方法级别鉴权Slf4jService(sysUserService)publicclassSysUserServiceImplimplementsSysUserService{删除用户OverrideTransactional(rollbackForException。class)HasPermsCode(permsCodeuser:delete)该数据会校验springMVC上下文中token是否有访问该资源的权限publicvoiddelUser(LonguserId,SysUsersysUser)throwsException{log。info(开始删除用户);SysUsercheckUsersysUserDao。getById(userId);if(checkUsernull){throwCommonException。create(ServerResponse。createByError(用户信息不存在));}try{删除用户checkUser。setDelFlag(true);checkUser。setUpdateBy(sysUser。getId());checkUser。setUpdateTime(newDate());sysUserDao。updateById(checkUser);log。info(完成删除用户);}catch(Exceptione){throwCommonException。create(e,ServerResponse。createByError(删除用户失败,请联系管理员));}}}
  验证用户是否登录Slf4jApi(tags认证接口)RestControllerRequestMapping(security)publicclassAuthorizeController{获取当前用户信息GetMapping(currentuserprems)ApiOperation(获取当前用户权限信息)ApiImplicitParams({ApiImplicitParam(paramTypeheader,dataTypestring,nameLHTOKEN,value用户token),})TokenToAuthority这个注解将请求同中的token信息转换为securityAuthority参数,到当前方法中。如果转换失败抛出401异常publicServerResponseSecurityAuthoritygetUesrPremsInfo(ApiIgnoreSecurityAuthoritysecurityAuthority)throwsException{log。info();log。info(进入获取当前用户信息接口:SysUserCurrentUserControllergetUesrInfo);returnServerResponse。createBySuccess(获取成功,securityAuthority);}}
  三、时间地点人物
  想要描述一个事情,都是将时间地点人物介绍完,才能吧事情描述清楚。
  介绍这个设计思路也需要介绍前提:什么时候用这个框架框架能提供哪些能力框架应该有哪些抽象组件
  3。1什么时候用这个框架
  显然,如果系统需要提供用户认证、用户授权、用户鉴权的时候,就需要有一个权限管理的模块。
  整个流程应该是:
  用户认证颁发token(用户授权)用户鉴权token回收
  3。2框架要提供哪些能力首先可以对系统用户进行认证。可以将生成用户口令给客户端,并可以管理该口令。用户携带口令访问资源是可以判断用户是否有权限来访问这个资源。
  以上能力老生常谈就是最基础的权限管理。
  3。3框架应该有哪些抽象组件
  这个问题是面向对象开发的java程序员必须要好好思考的问题,就是当你接到一个需求时,如何以面向对象的思维来分析和设计程序来完成需求。
  3。3。1用户认证
  用户认证,最最常见的场景就是用户名密码登录。
  在这个场景中可能存在:
  用户名密码、用户名密码验证码、手机号验证码、邮箱验证码。。。。。。这么多的登录方式。
  而通常来验证这些登录信息是否合法,一般都是要去数据库中读取用户的注册信息来完成认证。
  这个场景下可以抽象出来的类有:
  1。凭证类:用户名密码、用户名密码验证码、手机号验证码、邮箱验证码。。。。。。
  2。凭证类验证器:用来验证用户上传的凭证是否是合法的。
  3。3。2用户授权
  当用户完成认证凭证验证后,服务器应该返回一个用户的口令(token),给用户使用。
  并且用户的token应该可以关联并携带出用户绑定的所有资源权限,和角色、部门、岗位等等信息。
  用户的资源又分为:
  静态资源:
  菜单、按钮等静态资源
  文档、图片等静态资源
  动态资源:
  对某种资源的CURD权限:如是否可以对sysuser表数据进行CURD。
  这个场景下可以抽象出来的类:Token生成器:用来生成用户token。用户权限描述类:存放用户基本信息、用户拥有的资源权限、用户的角色信息、用户的其他信息(例如:岗位、部门等)角色:典型的RBAC设计,角色代表权限的集合。岗位:从另外一种维度给用户打标签,来区分用户的权限。部门:从另外一种维度给用户打标签,来区分用户的权限。
  其中的岗位和部门,有些权限管理框架中没有,有的或许有一个,这里不纠结这个问题,无论是部门还是岗位,其实都是提供了一种权限判断的维度,类型给用户打上一种标签。
  3。3。3token管理
  生成用户token后,所有的token需要管理起来。可以用来统计和维护。
  所以需要将上一步获取到的用户权限描述类的信息与token建立一种映射关系。从而可以通过token获取到用户的各种信息。
  这个场景可以抽象出来的类:
  Token管理类:用来管理所有生成的token。并建立用户信息与token的关联关系。
  3。3。4用户鉴权
  当用户通过用户认证和用户授权后,就获取到了他的token口令。
  每次用户来访问服务资源时,都需要携带token,当服务器收到请求后,需要通过token获取到用户的所有的权限信息,来判断用户是否可以访问当前资源。
  这个场景似乎没有可以抽离出来的类,而是我们要找到一种用户鉴权的方案。
  这里,根据以往的经验,基于Spring的AOP切面编程应该是对使用者最友好的方式
  所以这里总结下我们需要鉴权的类型:用户身份验证:token是否对应着一个有效的用户身份。就是用户是不是已经登录。URL基本的鉴权:对于java开发来说就是Controller层开放的接口释放可访问。方法级别鉴权:对于java开发者来说,就对应着某个类的某个方法该用户是否可以访问,这里可以参考shiro的授权码user:delete表示是否可以删除用户。静态资源鉴权:用户是否可以访问系统中的静态资源。比如一张图片的下载地址。
  喜欢的朋友可以关注一下
  四、小结
  上面铺垫了那么些,其实只是想让大家能跟笔者有一个相同的认知。用户认证:就是用户登录。用户授权:就是为用户颁发一个可以表达他拥有的角色和自有的口令。用户鉴权:就是判断用户有没有权限来访问当前的资源。
  先梳理下上面总结出来的类。
  凭证类、凭证类验证器、token生成器、token管理器。
  以及,基于AOP实现的用户鉴权方案。
  大致思路:
  未完待续
  敬请关注下一篇

暴雪OWAB点模式的地图可能以新面貌回归《守望先锋:归来》在上线之初删除了很多《守望先锋》中的地图,包括巴黎、沃斯卡亚工业区、月球基地等,虽然这些地图都可以在自定义或街机模式中使用,但一些玩家希望他们能重新加入到快速……故宫要开分院,地址选在了这刚刚过去的春节假期,故宫是热门旅游打卡地之一。令人期待的是,成立近百年的故宫博物院很快就要有分院了!就在不久前,立项筹备已近十年之久的故宫博物院北院区正式破土动工。项目位……90后口罩猎人林栋揣着50元,获50亿订单人生就像走钢丝2019年疫情爆发,防疫物资极度紧缺。人人必备的口罩和它的核心原料熔喷布,市场价格更是一路飙涨。2020年初,新冠肺炎疫情肆虐,全国上下都在抗击疫情。而在这个特殊的时期,……关于空的理解作者徐敬东能量到底是空的还是实的?怎么界定它?一颗原子的原子核里是质子和中子,电子在外面飞速旋转,按照这个比例来讲,原子核小得不得了,但那个电子却大得不得了我听过一……没白挨骂,邓超这次拍挺好看邓超的《中国乒乓之绝地反击》之前,心里挺拿不准的。毕竟已经看过他导演的前几部电影。这种不确定性引发的担忧,直到我走进电影院时仍未消退。结果却令人意外。……体坛连连看丨梅西世界杯后首次接受专访拜仁租借坎塞洛杜兰特透露体坛连连看,每日体育新闻早知道!这是小编为你搜罗的今天的体坛最新资讯。梅西世界杯后首次接受专访:决赛前夜我和安东内拉聊天没谈比赛北京时间1月30日,梅西世界杯……默克生命科学什么是无铜点击化学?无铜点击化学是点击化学的一种替代方法,可在较低的活性能垒下进行,且没有细胞毒性过渡金属催化剂。由于没有外源金属催化剂,这些反应适用于生物正交化学或生物正交点击化学的体内应用。更……CAPEX好于预期AIGC拉动算力,中兴通讯成长性有望更乐观(报告出品方分析师:浙商证券张建民汪洁)1超越期发展新阶段1。1ICT全球领军企业中兴通讯是全球TOP4的通信设备提供商之一。中兴通讯成立于1985年,是全球……热搜上爆火的鸡翅男孩事件,打脸了多少自我感动的父母?前段时间,有一位妈妈在网上哭诉:我的儿子不懂得心疼我。视频中,这位妈妈和两个孩子正在吃晚饭,名叫淘淘(化名)的六七岁小男孩抱怨道:妈妈天天在家什么也不干,好懒……试驾导致行人1死1伤,蔚来是否承担赔偿责任?头条创作挑战赛蔚来试驾车冲进人行道致一死一伤试驾协议2月3日晚上8时许,一女子试驾蔚来汽车时,突然冲向人行道撞上一对母子,导致母亲不幸身亡,儿子重伤。肇事司机……剧版平原上的摩西,那些拍得很好,但观众却没看懂的情节01文五栋二楼写于2023。02。14来都来了,那就坐下喝杯茶。不必去理会,你是被哪个标题给搞进来的。都是机器人根据算法自己搞的标题。甩锅ChatGPT厚厚。真正……5200万的耻辱!当利物浦迫切需要重构中场之时,他却将免费离原本纳比凯塔被视为利物浦中场的未来,但不曾想这位5200万英镑转会而来的几内亚国脚,将以一种近乎耻辱的方式,自由离开安菲尔德。纳比凯塔,是我们现在谈论利物浦中场问题的很好……
从稳坐首发,到被弃用!和湖人渐行渐远,你辜负了詹姆斯的信任NBA新赛季正式开打之前,洛杉矶湖人的新赛季首发阵容一度备受关注,由于这是一支全新的球队,除了安东尼戴维斯、勒布朗詹姆斯和霍顿塔克外,其他球员此前均效力于其他球队,所以谁能搭档……孩子的作文,离不开积累和练习,用对方法,提高写作文的能力文弥小木之前学校组织过一次家长会,会上有一位做学生阅读的老师分享内容。虽然到最后,他卖的是自己开发的课程,但是那一次的分享,也还是得到了一些启发。那位老师有分享一些……PC单机游戏推荐在逐光之旅中遨游深海由微光工作室制作的横版平台跳跃游戏《逐光之旅》在NintendoSwitch和PC单机平台发售已有一段时间,作为一款国产独立游戏,可以说是一款上乘之作,无论是画面、音乐还是游戏……自驾西藏,是租车划算还是开自己的车划算?一次性给你算清楚大家好,我是小李。自驾西藏是租车合算还是开自己的车合算?这个问题很多朋友纠结,纠结的主要原因就在于租车不用担心车损,万一路上坏了也不是自己的车,但是租车需要付出一定的租车费而且……除甲醛二手烟味,空气净化器净化如何?自记事情以来,鼻子就比较敏感,闻到不喜欢的异味,喉咙也比较容易发炎,尤其是患了鼻炎之后,对空气质量的感受感觉比空气质量检测仪很敏感。沉闷不清新的空气,呼吸会压抑,遇到雾霾天气,……曾多次给奥多姆机会,一向心软的科勒为何却不愿意和TT复合?科勒在卡戴珊家族内,算不上最顶级的名媛,脸蛋没有妹妹詹娜精致,身材一度十分臃肿,漂亮国前扛把子曾经还嘲讽科勒,称她像是一头肥猪。不过一千个人眼中有一千个哈姆雷特,每个人的审美都……节节草是什么?如果常用节节草泡脚,或可以解决很多问题节节草在农村非常常见,这种草的生命力比较顽强,虽然是衍生的,但是节节草属于一种草药,它还可以治疗多种疾病。节节草其实是非常容易辨认的,因为这种植物非常有特点,整周没有一片……二十四节气传统养生历立冬养生编者按二十四节气是指我国农历中表示季节变迁的24个特定节令,是中国历法的独特创造,2016年11月30日,二十四节气被正式列入联合国教科文组织人类非物质文化遗产代表作名录……女排3人晒雪景!郎平已是过去式,李盈莹正当时,刘晏含边缘化正值立冬时节,寒潮的突然来袭,令多地都下起了大雪,这不,身处于北京的郎平以及身处天津的李盈莹和刘晏含,皆是更新动态,晒出了立冬时节的大雪美景,引得不少南方球迷羡慕。而对于……女神魏秋月为爱抢到丈夫,胜日本情敌被质疑与队友不睦近日,前女排国手魏秋月度过了自己的33岁生日,她也在个人社交媒体上晒出了一组照片,还配文道:谢谢大家的祝福,许愿喽!愿我健步如飞;愿我爱的人,爱我的人健康快乐。从这些照片……史上真正的渣男不是陈世美,而是家暴男萧军中国史上最有名的渣男代表莫过于陈世美,说他抛妻弃子。但是,翻开中国文坛的花名册,这样的人属实不少,其中鲁迅的弟子萧军绝对榜上有名,抛妻弃子的事一样也没少干。而且还干了很多次!萧……陈亚男飘了,和大衣哥儿子朱单伟分手后,还能够飘得到多高多远当初陈亚男为什么嫁给没有什么文化,长相平平,不善言辞的大衣哥儿子朱单伟,估计个中原因只有她自己知道。朱单伟当时十九岁,陈亚男二十一,由于朱单伟没有达到法定结婚年龄,办不了……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网