专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

最火后台管理系统RuoYi项目探秘,之三

  上篇中,我们初步探究了RuoYi项目是如何进行登录信息传输、验证码校验、密码校验,以及密码存储安全性方案。我们了解到,整个的验证实现是围绕Shiro框架进行的,而数据的传输安全性,RuoYi是没有考虑的,如果我们做的是要求安全等级比较高的项目,需要考虑采用https协议,并对关键数据进行加密后传输,一般会使用非对称密码算法进行加解密。
  本篇,我们主要会针对Shiro框架做一个简单的扩展了解,然后再初窥RuoYi的菜单、权限功能。Shiro
  Shiro的官网为ApacheShiro,GitHub仓库为Shiro。
  Shiro的自我介绍为:ApacheShiro是一个功能强大且易于使用的Java安全框架,可执行身份验证、授权、加密和会话管理。使用Shiro易于理解的API,你可以快速轻松地保护任何应用程序从最小的移动应用程序到最大的web和企业应用程序。
  Shiro高层架构,如下图:
  Shiro有三个主要概念:Subject、SecurityManager和Realms。这几个概念,我们在上篇中对RuoYi的登录分析中已有所接触。
  三大概念,官方大体的介绍如下:Subject:本质上是当前执行用户的特定于安全的视图,它代表的可以是人,也可以表示第三方服务、守护程序帐户、cronjob或任何类似的东西。SecurityManager:SecurityManager是Shiro架构的核心,它充当了一种保护伞对象,协调其内部安全组件,这些组件共同形成一个对象图。然而,一旦为一个应用程序配置了SecurityManager及其内部对象图,它通常就不存在了,应用程序开发人员几乎所有的时间都在使用SubjectAPI。Realms:Realms充当Shiro和应用程序安全数据之间的桥梁或连接器。当需要与安全相关数据(如用户帐户)进行实际交互以执行身份验证(登录)和授权(访问控制)时,Shiro会从为应用程序配置的一个或多个Realms中查找许多这些内容。从这个意义上讲,Realm本质上是一个特定于安全的DAO。
  从以上的概念描述中,可以看出来,Subject代表认证相关的人或者应用;SecurityManager是用于认证的核心及桥梁;Realms则代表用于认证的相关数据及认证方法的提供者。
  再看一下Shiro的详细架构,如下图:
  这张图可以看到更多关于SecurityManager的组成部分,以及常见的Realms的认证数据来源,详细我们不再展开。RuoYi里的Shiro
  RuoYi项目里对接使用Shiro的代码,放在项目ruoyiframework中,包为com。ruoyi。framework。shiro。其中涉及定义的Realms实现类UserRealm,将类继承自AuthorizingRealm,AuthorizingRealm是一个抽象类,其中抽象方法为:RetrievestheAuthorizationInfoforthegivenprincipalsfromtheunderlyingdatastore。Whenreturninganinstancefromthismethod,youmightwanttoconsiderusinganinstanceof{linkorg。apache。shiro。authz。SimpleAuthorizationInfoSimpleAuthorizationInfo},asitissuitableinmostcases。paramprincipalstheprimaryidentifyingprincipalsoftheAuthorizationInfothatshouldberetrieved。returntheAuthorizationInfoassociatedwiththisprincipals。seeorg。apache。shiro。authz。SimpleAuthorizationInfoprotectedabstractAuthorizationInfodoGetAuthorizationInfo(PrincipalCollectionprincipals);复制代码
  同时,AuthorizingRealm还继续自AuthenticatingRealm,它也是一个抽象类,其抽象方法为:Retrievesauthenticationdatafromanimplementationspecificdatasource(RDBMS,LDAP,etc)forthegivenauthenticationtoken。pFormostdatasources,thismeansjustpullingauthenticationdataforanassociatedsubjectuserandnothingmoreandlettingShirodotherest。Butinsomesystems,thismethodcouldactuallyperformEISspecificloginlogicinadditiontojustretrievingdataitisuptotheRealmimplementation。pA{codenull}returnvaluemeansthatnoaccountcouldbeassociatedwiththespecifiedtoken。paramtokentheauthenticationtokencontainingtheusersprincipalandcredentials。returnan{linkAuthenticationInfo}objectcontainingaccountdataresultingfromtheauthenticationONLYifthelookupissuccessful(i。e。accountexistsandisvalid,etc。)throwsAuthenticationExceptionifthereisanerroracquiringdataorperformingrealmspecificauthenticationlogicforthespecifiedtttokenttprotectedabstractAuthenticationInfodoGetAuthenticationInfo(AuthenticationTokentoken)throwsAuthenticationException;复制代码
  UserRealm对两个抽象方法的实现分别如下:授权OverrideprotectedAuthorizationInfodoGetAuthorizationInfo(PrincipalCollectionarg0){SysUseruserShiroUtils。getSysUser();角色列表SetStringrolesnewHashSetString();功能列表SetStringmenusnewHashSetString();SimpleAuthorizationInfoinfonewSimpleAuthorizationInfo();管理员拥有所有权限if(user。isAdmin()){info。addRole(admin);info。addStringPermission(::);}else{rolesroleService。selectRoleKeys(user。getUserId());menusmenuService。selectPermsByUserId(user。getUserId());角色加入AuthorizationInfo认证对象info。setRoles(roles);权限加入AuthorizationInfo认证对象info。setStringPermissions(menus);}returninfo;}复制代码登录认证OverrideprotectedAuthenticationInfodoGetAuthenticationInfo(AuthenticationTokentoken)throwsAuthenticationException{UsernamePasswordTokenupToken(UsernamePasswordToken)token;StringusernameupToken。getUsername();Stringpassword;if(upToken。getPassword()!null){passwordnewString(upToken。getPassword());}SysUserusernull;try{userloginService。login(username,password);}catch(CaptchaExceptione){thrownewAuthenticationException(e。getMessage(),e);}catch(UserNotExistsExceptione){thrownewUnknownAccountException(e。getMessage(),e);}catch(UserPasswordNotMatchExceptione){thrownewIncorrectCredentialsException(e。getMessage(),e);}catch(UserPasswordRetryLimitExceedExceptione){thrownewExcessiveAttemptsException(e。getMessage(),e);}catch(UserBlockedExceptione){thrownewLockedAccountException(e。getMessage(),e);}catch(RoleBlockedExceptione){thrownewLockedAccountException(e。getMessage(),e);}catch(Exceptione){log。info(对用户〔username〕进行登录验证。。验证未通过{},e。getMessage());thrownewAuthenticationException(e。getMessage(),e);}SimpleAuthenticationInfoinfonewSimpleAuthenticationInfo(user,password,getName());returninfo;}复制代码
  可以看到,doGetAuthorizationInfo(PrincipalCollectionarg0)代码就是获得一个SysUser对象,并给定相应的菜单和用户角色。也就是说用户和权限和菜单绑定都是在这里完成的,而其中最核心的用户数据是从从而来呢?继续看以下核心的一句代码,并跟踪进去:SysUseruserShiroUtils。getSysUser();复制代码publicstaticSysUsergetSysUser(){SysUserusernull;ObjectobjgetSubject()。getPrincipal();if(StringUtils。isNotNull(obj)){usernewSysUser();BeanUtils。copyBeanProp(user,obj);}returnuser;}复制代码
  可以看到,用户信息来源于getPrincipal(),而它来自于getProject(),继续跟进,可以找到:publicclassShiroUtils{publicstaticSubjectgetSubject(){returnSecurityUtils。getSubject();}。。。复制代码
  跟进,找到SecurityUtils类里的代码实现:publicstaticSubjectgetSubject(){SubjectsubjectThreadContext。getSubject();if(subjectnull){subject(newSubject。Builder())。buildSubject();ThreadContext。bind(subject);}returnsubject;}复制代码
  此处逻辑为:从ThreadContext。getSubject()中获取Subject,如果其为null则直接构建一个对象,并存入ThreadContext中。进入buildSubject()的逻辑,代码如下:publicSubjectbuildSubject(){returnthis。securityManager。createSubject(this。subjectContext);}复制代码
  我们再跟进UserRealm另一个实现的方法doGetAuthenticationInfo(AuthenticationTokentoken),可以看到此方法实现了真正的登录认证,将待认证信息与认证源的数据进行认证对比,确认用户是否可以认证通过。
  这个时候我们重新回到RuoYi业务中的登录方法ajaxLogin,观察登录业务到底是怎么通过Shiro框架实现的:UsernamePasswordTokentokennewUsernamePasswordToken(username,password,rememberMe);SubjectsubjectSecurityUtils。getSubject();try{subject。login(token);returnsuccess();}复制代码
  这里可以很清晰的看到,此处使用了上文提到的方法SecurityUtils。getSubject()来生成Subject,然后对生成的Subject对象执行登录操作。那此处逻辑就很清晰了:在项目初始化配置时,SecurityManager就已经与UserRealm提前绑定,当用户触发到登录时,代码中使用SecurityManager生成了一个Subject对象,再通过Subject定义的login方法进行了登录操作,而login方法的调用,最终会运行到我们上面分析到的UserRealm中的doGetAuthenticationInfo(AuthenticationTokentoken)方法,最终登录成功的话,Shiro框架会为Subject对象添加认证用户的相关信息。
  通过以上的代码梳理和分析,我们能比较清晰地体会到Shiro三大核心概念的用途。Realm就是用来比较认证信息是否合法的,核心就是提供认证源用于对比;SecurityManager与Realm提前绑定,提供认证API给业务使用,业务Subject的login方法,实现最终通过SecurityManger调用Realm中的认证方法进行登录,并赋予Subject对象相关数据,最终可通过SecurityManager获得用户相关数据对象Subject,并能从Subject中获取自己需要的各种用户信息。初见RBAC
  在上面登录逻辑中,我们看到在UserRealm中登录成功后,对用户进行菜单和权限的绑定操作。但比较奇怪的是这段代码,让人感觉疑惑:rolesroleService。selectRoleKeys(user。getUserId());menusmenuService。selectPermsByUserId(user。getUserId());角色加入AuthorizationInfo认证对象info。setRoles(roles);权限加入AuthorizationInfo认证对象info。setStringPermissions(menus);复制代码
  我们很明显的可以看到info对象的两个方法为setRoles()(设置角色)、SetStringPermissions()(设置权限),但作者在这处对设置权限函数添加的数据,命名为menus(菜单)。我们只能有一个初步猜测:RuoYi系统中,是否没有针对API级别的权限控制,而只是针对菜单级进行了控制呢?
  另外,SysRole都有些什么属性,又是怎么对用户操作进行权限控制的呢?菜单是什么样的数据结构,又是怎么进行访问控制的呢?这些RBAC相关疑问的解答,我们将在下篇展开。小结
  (读太多文字人会太累,所以本篇在RBAC准备展开时戛然而止)本篇我们简单的扩展了一下Shiro框架的相关知识,并结合Shiro框架简单分析了RuoYi项目如何对接使用的Shiro框架。
  另外,我们还在对接代码中发现了RBAC比较核心的权限、菜单等数据。RBAC神秘的面纱才刚揭开,我们下一篇继续。本篇就到这里,比心,。
  作者:阿呜的边城
  链接:https:juejin。cnpost7166035690801594381

咖啡之翼尹峰,从美女老板变成求职者,背后原因是什么?咖啡之翼创始人尹峰之所以到非你莫属节目去求职,首先是因为她的咖啡之翼终止挂牌,宣告创业失败。其次,她想换个身份,不是以老板而是以求职者身份去参加节目,衡量下自己在职场的价值所在。再刘强东强奸案再次反转,女方承认自愿发生关系,并索赔五百万要和解6月26日,刘强东一案出现巨大反转。该案24日举行听证会,大量与案件相关的视频也首次被媒体曝光。刘静尧曾多次表示发生性关系是双方自愿的,该消息引起热议。刘强东案例反转!女方多次承认黑帮大佬和我的365日的续集来了,却拍成了MV,玩高雅玩砸了2020年的波兰电影黑帮大佬出续集了黑帮大佬和我的365日2。第一部恶评如潮,没想到看了第二部后,观众都觉得第一部真香!第一部结尾,劳拉遭遇意外,我们不知道她是否还活着。但在第二部一刀切的蛇精脸明星怎样了?后遗症不少,年纪越大越明显前些年的娱乐圈,蛇精脸盛行。不少明星为了出挑的颜值,美美的出镜,选择了一刀切的动脸术。当时所谓的一刀切,就是削骨。将下颌多余的骨头去掉,小方脸顿时变成蛇精脸。女星中的代表,是杨幂。当年今日系列7月27日中学语文课文散步作者莫怀戚逝世012014年7月27日中国作家莫怀戚逝世著名作家中学语文课文散步作者莫怀戚先生于7月27日15点45分,因病在家中去世。莫怀戚先生是重庆人,毕业于四川大学中文系,中国当代作家,中美国不断打压中国企业,华为才是最大赢家最近几年,美企给了中国企业不少下马威,一方面是掌握核心科技有恃无恐,而另一方面则是在挑战行业规则,美企不仅响应政府号召,更是认同美国破坏市场秩序的可恶行径,哪怕是连自己的生意都不做华为总裁任正非14年闪亮的基建工程兵军旅生涯大学毕业的任正非,在同时代年轻人中算是比较出色的。他理工基础雄厚,掌握了数门外语,而且文科实用水平颇高,对毛泽东思想有着自己深刻的理解。这些能力集于一身,即便放在今天,也不失为高级华为通告陈春花的后续身为北大教授,学历涉嫌造假?前一段时间,知名管理学者陈春花教授,因华为在心声社区的一则通告而上了热搜。一看通告的内容,措辞极为犀利,华为郑重声明华为不了解她,她也不可能了解华为。这起事件的来由呢?主要是网上很牛皮吹大了!国企员工朋友圈炫富后续来了,官方连夜公布调查结果要问现在什么岗位竞争最激烈,可能人们第一印象就是铁饭碗,尤其是现在就业大环境不乐观,能有份安稳有保障的工作不容易,所以铁饭碗竞争愈发激烈。在众多铁饭碗岗位中,公务员和事业编考试难度一味药治疗荨麻疹我小时候经常起荨麻疹,碰一下,划一下就起,高出皮肤,红,痒。我还记得自己去医院拿药,接诊的是内科主任,边给我看边给同事做思想工作,我那时候小,估计现在就在心里骂了看个病三心二意,庸三年前,精神受刺激,确诊乳腺癌三年前,我父亲去世,我精神受刺激,确诊了乳腺癌。妈妈10年前就去世了,父亲突然的离世,让我心里空落落的,心里一下子就没有了主心骨,爸爸在的时候,我每年回国看望爸爸,吃家乡菜,陪爸爸
1936年,女子丈夫失踪,80岁改嫁拾荒大爷,新婚夜发现他竟是原配她叫李德芳,80岁被儿子赶出家门,走投无路之时,遇到了82岁的邱大明。本以为就是一段普通的夕阳情,可就在新婚之夜,李德芳无意发现,邱大明竟是自己失散半个世纪的原配丈夫。她又气又喜,汉朝历史上第二个皇帝,仁慈有爱,是个好人,却不是一个好皇帝汉朝历史上第一个皇帝是刘邦,第二个皇帝是刘盈,也就是后世所说的汉惠帝。汉惠帝图片来自于影视根据史记记载,惠帝是一个很仁慈的人,心地很善良,也很有上进心。当初,惠帝的母亲吕雉想要杀赵中国古代就有秘书?历史上那些美貌与智慧并存的秘书都有谁?秘书一词,具有悠久的历史,可以说有了领导,就有了秘书。秘书并不是现代才出现的产物,具备现代秘书性质的岗位早在中国古代就出现了。秘书的主要职责就是给领导当副手,处理的事务很繁杂。而古秦朝在大一统之后,秦代郡县制是如何形成的?秦帝国作为中国古代第一个大一统的中央集权制国家,实现了中国古代政治制度的第一次大转折。不仅打破了商周以来封建制与宗法制的统治地位,形成了主有专己之威,臣无百年之柄的政治格局,更是以深度台积电3nm晶圆厂在美国正式启动的历史意义问芯Voice举世关注!台积电位于美国亚利桑那州的12寸晶圆厂不但于今日举行移机典礼(FirstToolIn),更官宣该厂房的制程技术提升至3nm和4nm节点,分别在2024年和2美国硅谷裁员何时休?冬天已经来了,我们都在期待春天文嬉笑怒骂A博士许多人认为,每一轮经济危机之后,都会出现反弹。他们认为这次硅谷科技巨头转舵后,也许不久就会迎来元宇宙人工智能等创新业务的春天。许多被裁的员工就是满怀着这样的期待希望美国有特斯拉,中国有比亚迪,那日本有什么可匹敌的新能源车企?汽车产业作为制造业中最为重要的产业之一,全球年产值超过3万亿美元。近年来,随着汽车产业向着电动化和智能化方向发展,全球汽车产业发生了翻天覆地的变化,涌现出一批造车新势力,这对传统汽地球最著名全身照今天50岁,美国宇航员直至去世仍在争夺著作权极目新闻记者宋清影据CNN12月7日报道,人类史上最著名的地球全身照拍摄于50年前的今天。1972年12月7日,阿波罗17号宇航员捕捉到了一张独一无二的地球画面,这张标志性照片被称苹果将自助维修服务扩展至美国以外地区苹果在今年4月份宣布在美国正式推出自助维修服务,让用户可以透过SelfServiceRepairStore自助维修服务的网站,订购不同的零件让用户自行对iPhone等装置进行维修。美国的200多年建国史,就是一部印第安人的血泪史印地安人,是美洲大陆的土著居民,但是,这些世代生活在美洲的黄色人种,却被后来者欧洲白人的长期殖民和残忍屠杀之下,几乎近于灭绝。美国兴起于印第安人世代生息的北美大陆上。当初这群美国开附靓照卡戴珊家族的发家史美国顶级网红家族成长历程头号有新人卡戴珊家族大家肯定很熟悉,总是有不断的绯闻,她们家族是如何发家成名的呢?卡戴珊家族的成员有父亲罗伯特卡戴珊母亲克里斯汀玛丽霍顿继父布鲁斯詹纳老大考特尼卡戴珊老二金卡戴珊老
友情链接:快好知快生活快百科快传网中准网文好找聚热点快软网