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

最火后台管理系统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

中国最大沙漠中唯一的小镇,生活着2万人,方圆300里被黄沙覆塔克拉玛干沙漠是我国最大的沙漠,总面积达33万平方公里。这里荒凉缺水、没有绿植和耕地,遍地都被黄沙覆盖。然而,在这片人类禁区的中心位置,竟然存在着一座2万人口的城镇,这座小镇叫……湖北咸安200余青年朋友浪漫相约大幕樱花谷樱花妖妖,芳华灼灼。3月19日,丝丝小雨,伴着春天的香风,让仙雾萦绕的咸安区大幕山东源花谷愰如人间仙境,诗意盎然。6辆大巴载200余青年朋友快乐相聚大幕山巅,一场由区妇联承办的……雅莹属于什么档次(阿玛施与雅莹哪个高档)一流市场,二流产品,三流品牌。文丨华商韬略杨倩在中国一二线城市的任何一个繁华商圈,还能坚守的国货服装,真的不多了。中国是最大的时尚消费国,也是最大生产国,但却……由承天寺塔所思在西塔附近等公交的时候,抬头看到了西塔,也就是承天寺塔,再看寺门内一片红彤彤的,好奇之下买了10块钱的门票想进去看看。承天寺东门东望承天寺塔承天寺是银川市一座……夏邑是哪里的(夏邑什么意思)年龄大了之后,过生日叫过寿,过生日的人叫寿星,蛋糕上也要写上大大的寿字。长寿,是很多人心中的美好愿景。河南有7个国字号的长寿之乡,其中4个在商丘,分别是永城、夏邑、宁陵和……dnf搬砖哪里最赚(2019dnf搬砖哪里最赚钱)一、老牌砖厂风暴航路作为百级版本久经不衰的老牌砖厂,风暴航路因为其门槛低(一身百级传说,简单附魔即可轻松通关),地图丰富不单调,且能产出团本门票堇青石,深受广大搬砖玩家的……s3在哪里(北汽幻速s5obd接口在哪里)OBD是汽车与我们沟通的重要媒介。纵观汽车的发展史,汽车维修都是一项特别有技术含量的工作,对汽车的维修都是需要依靠老师傅们经验,根据汽车的异响、震动或者其他征兆,来进行维……中华十大名山普陀山游玩建议普陀山,位于浙江省舟山市普陀区,是我国佛教四大名山之一,也是中国海上佛教圣地。普陀山既有悠久的佛教文化,又有丰富的海岛风光,素有海天佛国、南海圣境之称。舟舢普陀山被大海怀抱,金……露娜是哪里的(露娜属于)文天云解说原创,盗载必究在高端局里有一个英雄是很多人都害怕的存在,她可以打出很秀的操作候,还能够做到无限越塔强杀,很多时候敌方都拿她没有办法,因为操作上限高,所以她也经常……安卓系统是哪里的(安卓和苹果系统是哪个国家的)功能机时代手机巨头就两家,摩托罗拉和诺基亚,其中诺基亚是芬兰的。同期在国内售卖的手机中,销量较大的非国产手机还有德国西门子背景的明基西门子,日本索尼和瑞典爱立信背景的索尼爱立信……哪里是阴茎(哪里是尿道口)无论是未知的黑洞、远处的洞窟还是身上的洞,都带有致命的吸引力,而人类对于未知的洞穴总是带着天生的探索欲。今天亮亮想带大家盘点一下关于人体黑洞奥秘之那些被塞进人体身上的洞的……天门是哪里(天门在头部什么位置)西游世界中有一个有趣的现象,孙悟空无论上天还是下界,从来只走南天门,而从不走北天门。当年,孙悟空从灵台方寸山学艺归来,大闹龙宫地府,玉帝本打算派兵镇压,但在太白金星的建议……
别找了,阳了以后吃什么,有这篇就够了这几天陆陆续续身边的人都感染了,此时此刻的我瑟瑟发抖,也不知道什么时候可能就阳了,有些人可能感染后食欲不振,这篇就跟大家说说吃什么比较好【感染前期】症状:嗓子疼、发……卫冕冠军法国队公布世界杯大名单本泽马姆巴佩领衔中新网11月10日电当地时间9日,法国足协公布了国家队卡塔尔世界杯阵容。作为卫冕冠军,法国队本次名单中共有25名队员,由本泽马、姆巴佩领衔。本次,法国队与澳大利亚、丹麦、突尼斯……生活烦了吗?从被窝里挣扎着起床的冬天是令人痛苦的,接下来还要小跑着去车站追赶公交车,在拥挤的人潮中提前赶往下车口处,以便不错过上班的站点。终于要到公司了,电梯口处被挤得水泄不通,直到……把糯米粉倒进开水里,简单一做,实在太香了,出锅大人小孩抢着吃三餐美味,四季幸福,大家好!糯米粉在我们生活中非常常见,它可以制作成各种各样的美食。而且糯米粉含有丰富的蛋白质和维生素等营养,可以补中益气强健脾胃。今天,我要给大家分享一个用糯……卡贴iPhone13只要2800元!价格如此便宜,有哪些缺点网友在某鱼看上一台美版卡贴iPhone13,价格只要2800元。问我为什么如此便宜?卡贴机是什么意思,有什么优缺点!卡贴机其实就是有锁机(网络锁),是国外运营商的定制机。……绿色十年张宏双碳进程中煤炭产业必须自我革命作为我国主体能源,过去十年间,煤炭行业的潮起潮落与经济社会发展同频共振。中国煤炭工业协会纪委书记、副秘书长张宏告诉贝壳财经记者,这十年,我国推动煤炭供给侧结构性改革取得显……智光电气公司储能系统已实现在发电侧电网侧和用户侧实际投运e公司讯,智光电气在机构调研时表示,(1)储能规模化发展作为公司的发展重点,目前公司的储能系统已经实现了在发电侧、电网侧和用户侧的实际投运。在技术研发方面公司与中国华能清能院、……财政部提前下达2023年城乡居民基本养老保险补助经费1510财政部近日向各省、自治区、直辖市、计划单列市、新疆生产建设兵团下达2023年城乡居民基本养老保险补助经费预算,以提高预算完整性,加快支出进度。财政部7日公布的数据显示,提……张掖丹霞,七彩世界文席波经过500多公里的长途跋涉,傍晚时分终于到达张掖丹霞景区。尽管旅途疲惫,刚进入景区就开始下雨,但丹霞地貌奇异的景观、壮丽的景色和其璀璨的色彩震撼了我们的心,冒……Java面试技术问答宝典(27)JSP常用的指令有哪些?我们参加Java培训学习都是希望能够毕业后找到满意的工作,然而培训机构只是推荐就业,我们仍然需要进行面试,提高面试技术问答的正确率有助于增加面试官的满意度。本系列全面汇总了企业……全民体育英超热刺绝杀头名出线,利物浦复仇那不勒斯欧洲大联盟的夏季转会窗口已经关闭。然而,着眼于一月,有很多关于谁将搬到哪里的流言蜚语。转会谈话带给你所有最新的流言蜚语,来来去去,当然,完成交易!头条新闻:阿森纳、切尔西追踪扎……冰雪冷资源为经济复苏注入热动力绘画刘琪文字张苇柠从山脚仰望,不同雪道在山腰依次排开,来自全国各地的滑雪爱好者从山上翩然滑下,在白色雪道留下优美弧线。这个雪场是新疆首家5S滑雪场,这里的玄奘道、艾文道等……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网