Shiro框架高频面试题及详细答案(实战版)_第1页
Shiro框架高频面试题及详细答案(实战版)_第2页
Shiro框架高频面试题及详细答案(实战版)_第3页
Shiro框架高频面试题及详细答案(实战版)_第4页
Shiro框架高频面试题及详细答案(实战版)_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Shiro框架高频面试题及详细答案(实战版)一、基础认知类1、简单说说什么是Shiro?它的核心作用是什么?Shiro是一款开源的、轻量级Java安全权限框架,相比于SpringSecurity,它更轻量化、上手简单、依赖更少,不需要绑定Spring环境,普通Java项目、Web项目都能使用。它的核心作用主要聚焦于项目的认证、授权、会话管理、加密四大核心功能,能够快速帮我们实现系统的登录校验、权限控制、角色分配、密码加密存储等安全需求,规避原生开发中权限逻辑冗余、安全漏洞多的问题。2、Shiro和SpringSecurity的区别?项目中如何选择?两者都是Java主流安全框架,核心差异集中在轻量化、适配性和功能复杂度上:1)轻量化差异:Shiro非常轻量,独立运行,无过多依赖,代码简洁;SpringSecurity绑定Spring生态,依赖较多,配置相对繁琐。2)环境适配:Shiro支持普通Java项目、SSM、SpringBoot等所有Java项目;SpringSecurity仅适配Spring体系项目。3)功能强度:SpringSecurity功能更全面,自带OAuth2、单点登录、防护各类Web攻击等高级功能;Shiro主打基础安全权限,高级功能需要手动拓展。选型原则:小型项目、非Spring项目、追求开发效率、只需要基础权限登录功能,选Shiro;大型分布式项目、微服务项目、需要高级安全特性,选SpringSecurity。3、Shiro的四大核心功能是什么?分别解释一下这是Shiro最基础的核心知识点,四大功能简称Auth、Authz、Session、Crypt:1)认证(Authentication):也就是登录校验,验证用户输入的账号密码是否和数据库一致,确认用户身份是否合法。2)授权(Authorization):身份认证通过后,校验用户拥有哪些角色、哪些权限,控制用户能访问哪些接口、页面、操作。3)会话管理(SessionManagement):独立的会话管理机制,不依赖Web容器的Session,普通Java程序也能使用,支持会话创建、销毁、超时、离线等操作。4)加密(Cryptography):提供数据加密、解密功能,主要用于用户密码加密存储,支持MD5、SHA等单向加密,还自带盐值加密,避免密码明文存储。二、核心架构与流程类4、Shiro的核心架构组件有哪些?各自的作用?Shiro核心五大组件,所有权限流程都围绕这几个组件执行:1)Subject:主体,代表当前登录用户,是程序直接交互的对象。所有登录、权限校验、退出操作,都是通过Subject调用,底层逻辑由SecurityManager实现。2)SecurityManager:安全管理器,Shiro的核心核心,相当于中枢。管理所有Subject的生命周期,统筹认证、授权、会话、加密所有功能,所有安全操作的底层执行者。3)Realm:域,Shiro的数据来源。Shiro本身不存储用户、权限数据,所有用户信息、角色、权限都通过Realm从数据库查询,相当于Shiro和业务数据的桥梁。4)CacheManager:缓存管理器,用于缓存用户权限、角色数据,避免每次请求都查询数据库,提升系统性能。5)SessionManager:会话管理器,负责创建、管理、销毁用户会话,实现Shiro自定义会话,脱离Web容器依赖。5、详细说下Shiro的完整登录认证流程整体流程连贯清晰,是面试高频重点,实际执行步骤如下:1)前端传入用户名、密码,后端封装成UsernamePasswordToken令牌对象;2)获取当前Subject主体,调用subject.login(token)方法发起登录认证;3)Subject将登录请求委托给底层的SecurityManager安全管理器;4)SecurityManager调用内置的Authenticator认证器,执行认证逻辑;5)Authenticator调用Realm,从数据库中查询对应的用户信息、密码;6)Realm返回数据库中的用户信息,Shiro对比前端传入的密码和数据库加密密码是否一致;7)一致则认证成功,创建会话,保存用户登录状态;不一致则抛出对应异常(账号不存在、密码错误等);8)认证完成后,后续所有请求都可通过Subject校验登录状态和权限。6、Shiro中Realm的作用?常见的Realm类型有哪些?Realm是Shiro连接业务数据的核心,Shiro自身没有用户和权限数据,所有身份校验、权限校验的数据都由Realm提供。我们开发中主要是自定义Realm,重写认证和授权方法,对接数据库。Shiro自带的常用Realm:1)IniRealm:从ini配置文件读取用户权限数据,仅用于测试,正式项目不用;2)JdbcRealm:自带JDBC查询逻辑,可直接配置数据库连接,简单实现权限查询,灵活性差;3)自定义Realm:项目主流用法,继承AuthorizingRealm,重写doGetAuthenticationInfo(认证)、doGetAuthorizationInfo(授权)两个方法,灵活对接业务数据库。7、Shiro认证和授权的两个核心方法是什么?各自何时执行?自定义Realm中两个核心重写方法,分工明确:1)doGetAuthenticationInfo:认证方法,只在用户首次登录时执行。作用是根据用户名查询数据库用户信息,校验账号密码,返回认证信息。2)doGetAuthorizationInfo:授权方法,在用户访问需要权限的资源/接口时执行。作用是查询当前用户的角色、权限标识,返回给Shiro,用于权限校验。补充:授权方法不会每次请求都执行,权限数据会被缓存,只有缓存失效、刷新权限时才会重新执行。三、权限与注解类8、Shiro的权限控制方式有几种?项目中常用四种权限控制方式,适配不同场景:1)注解式权限控制:最常用,在Controller、Service方法上加注解,实现权限拦截,简洁高效;2)URL拦截配置:在Shiro过滤器中配置拦截路径,指定哪些路径需要登录、需要对应角色权限;3)页面标签控制:前端页面通过Shiro标签,控制按钮、菜单的显示隐藏;4)代码手动校验:通过Subject的hasRole、isPermitted等方法,在代码中手动判断权限。9、说说Shiro常用的权限注解及作用1)@RequiresAuthentication:要求用户必须登录认证后才能访问;2)@RequiresUser:要求用户是已登录状态(记住我登录的用户也可访问);3)@RequiresGuest:游客模式,必须未登录才能访问;4)@RequiresRoles(value={"admin"}):要求用户必须拥有指定角色,多个角色默认全部需要;5)@RequiresPermissions(value={"user:add"}):要求用户必须拥有指定权限标识,精准控制接口操作权限。10、Shiro角色权限和资源权限的区别?1)角色权限:粗粒度权限,比如admin、user、vip,是对用户身份的分组,控制整体访问范围;2)资源权限:细粒度权限,比如user:add、user:delete、order:query,精准控制具体的操作、接口、按钮;实际项目中一般搭配使用,先通过角色区分用户大类,再通过资源权限控制具体操作,避免权限过于粗放。四、会话与缓存类11、Shiro的Session和Web原生Session有什么区别?1)依赖不同:Web原生Session依赖Tomcat等Web容器,只有Web项目能用;ShiroSession是独立实现,无需依赖容器,普通Java项目也可使用;2)可控性不同:ShiroSession可以自定义会话超时时间、会话存储、会话销毁规则,灵活性更高;3)分布式适配:原生Session在分布式项目中存在共享问题,ShiroSession可以配合Redis实现会话共享,适配集群、微服务场景。12、为什么Shiro需要开启缓存?缓存的是什么数据?如果不开启缓存,用户每次访问需要权限的接口,都会触发Realm的授权方法,反复查询数据库获取角色和权限数据,频繁操作数据库会造成性能浪费。Shiro缓存的核心数据:用户的角色集合、权限标识集合、会话信息。开发中一般整合Redis实现Shiro缓存,设置缓存过期时间,兼顾性能和数据实时性。需要注意:修改用户权限、角色后,需要手动清空缓存,否则权限更新不生效。13、Shiro如何实现记住我功能?原理是什么?Shiro自带RememberMe功能,核心原理是:用户登录时勾选记住我,Shiro会将用户的登录信息加密后写入浏览器Cookie,同时设置Cookie过期时间。用户关闭浏览器再次访问时,无需重新登录,Shiro会读取Cookie信息,自动完成身份认证。需要区分:记住我属于匿名登录,能访问需要登录的资源,但无法访问需要强认证的资源(比如修改密码、支付等核心操作),安全性更高。五、加密与安全类14、Shiro密码加密的原理?为什么要加盐?Shiro默认使用MD5单向加密,MD5加密是不可逆的,无法通过密文还原明文,适合密码存储。单纯MD5加密存在漏洞,相同密码加密后的密文一致,容易被彩虹表破解。因此项目中必须加盐加密。加密流程:用户注册时,随机生成盐值,将【明文密码+盐值】进行多次MD5加密,最终将密文和盐值一起存入数据库;登录时,用前端输入的密码+数据库存储的盐值,再次加密,对比密文是否一致。加盐+多次加密,能彻底避免彩虹表破解,大幅提升密码安全性。15、Shiro常用的加密算法有哪些?如何配置加密规则?常用算法:MD5、SHA1、SHA256,项目中MD5使用最多,足够满足日常安全需求。配置方式:在Spring容器中注册HashedCredentialsMatcher,指定加密算法名称、加密次数,绑定到自定义Realm即可,全局统一密码校验规则。六、实战问题与优化类16、Shiro权限不生效、授权方法不执行是什么原因?实战中高频问题,核心原因主要有5点:1)未开启Shiro注解支持,缺少注解扫描配置,导致权限注解不拦截;2)权限数据被缓存,修改权限后未清空缓存,依然读取旧权限数据;3)Realm中返回的权限标识、角色名称和注解/配置中的名称大小写、字符不一致;4)请求路径被放行,未被Shiro过滤器拦截,直接绕过权限校验;5)用户登录状态失效,未正常登录,导致权限校验直接拦截失败。17、Shiro如何实现用户在线人数统计、强制下线功能?1)在线人数统计:通过Shiro的Session监听,监听会话创建、销毁事件,会话创建则在线人数+1,会话过期/销毁则-1,实时统计在线用户;2)强制下线:将所有在线用户的SessionID存入Redis缓存,需要强制下线时,根据用户ID找到对应Session,手动销毁Session,清空权限缓存,用户下次请求会直接退出登录。18、分布式项目中Shiro会遇到什么问题?如何解决?单体项目Shiro可直接使用,分布式/集群项目存在两个核心问题:1)会话不共享:不同服务器的Session相互独立,用户请求切换服务器会丢失登录状态;2)缓存不共享:权限缓存存在本地,不同节点缓存数据不一致,权限更新不同步;解决方案:自定义RedisSessionManager实现会话共享,自定义RedisCacheManager实现权限缓存共享,将Session和权限数据统一存储在Redis,所有服务节点共用一份数据,完美适配分布式场景。19、Shiro登录常见异常有哪些?分别代表什么意思?1)UnknownAccountException:账号不存在;2)IncorrectCredentialsException:密码错误;3)LockedAccountException:账号被锁定;4)ExcessiveAttemptsException:登录次数过多,账号被临时锁定;5)AuthenticationException:通用认证异常,所有登录失败的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论