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

下载本文档

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

文档简介

Shiro高频面试题及详细答案(实战向)一、基础认知类1、简单介绍一下Shiro是什么?它的核心作用是什么?Shiro是一款轻量级的Java安全权限框架,相比于SpringSecurity,它更加轻便、上手简单、依赖少,不强制绑定Spring环境,普通Java项目也能使用。它的核心作用主要是做系统的认证、授权、会话管理、加密,帮我们快速实现登录校验、权限控制、角色拦截、密码加密、会话过期等安全功能,不用自己手写复杂的权限逻辑。2、Shiro和SpringSecurity的区别?项目中为什么选Shiro?核心区别:Shiro轻量、独立、适配所有Java项目,配置简单,学习成本低;SpringSecurity重度绑定Spring生态,功能更全面,但配置繁琐、上手难度高。Shiro自带会话管理,可脱离Web容器;SpringSecurity依赖Web容器会话,原生无独立会话管理。SpringSecurity对OAuth2、微服务、分布式安全支持更好,企业级大型微服务项目用的更多;Shiro更适合传统单体项目、中小型后台系统。选型原因:中小型单体项目、后台管理系统,权限逻辑简单,优先用Shiro,开发效率更高、维护成本更低,足够满足日常权限管控需求。3、Shiro的四大核心功能是什么?Authentication(认证):校验用户身份,也就是登录验证,判断用户是谁。Authorization(授权):权限校验,判断登录用户能做什么、能访问哪些资源。SessionManagement(会话管理):管理用户会话,支持普通Web会话、离线会话、分布式会话,可自定义会话过期时间。Cryptography(加密):提供密码加密、加盐、哈希算法,避免明文存储密码,支持MD5、SHA等常用加密方式。二、核心架构与流程类4、Shiro核心五大组件是什么?各自作用?Subject:主体,代表当前操作用户,所有的认证、授权操作都由Subject发起,是开发者直接操作的入口,封装了用户的所有请求行为。SecurityManager:安全管理器,Shiro的核心中枢,统筹所有安全操作,管理Subject、认证、授权、会话、缓存等所有功能,相当于整个框架的总指挥。Realm:域,Shiro连接数据源的桥梁,负责从数据库、配置文件中获取用户信息、角色、权限数据,完成认证和授权的数据查询,相当于权限数据的DAO层。SessionManager:会话管理器,负责创建、维护、销毁用户会话,控制会话超时、离线登录、多端登录等逻辑。CacheManager:缓存管理器,缓存用户权限、角色信息,避免每次请求都查询数据库,提升系统性能。5、Shiro完整的登录认证流程?详细说一遍前端传入用户名、密码,封装成UsernamePasswordToken令牌对象。获取当前Subject,调用subject.login(token)发起登录请求。Subject会将登录请求交给底层的SecurityManager处理。SecurityManager调用Authenticator认证器,执行认证逻辑。Authenticator调用Realm的认证方法,从数据库查询当前用户名对应的用户信息、加密密码。对比前端传入的密码(加密后)和数据库存储的加盐加密密码是否一致。一致则认证成功,创建会话,保存用户登录状态;不一致则抛出对应异常(账号不存在、密码错误、账号锁定等)。认证成功后,后续请求可通过Subject获取当前登录用户信息。6、Realm的作用?可以自定义Realm吗?为什么需要自定义?Realm是Shiro获取权限数据的核心组件,默认自带的Realm只能读取配置文件中的固定用户和权限,无法对接数据库。实际开发中必须自定义Realm,重写认证和授权两个方法,手动从数据库查询用户、角色、权限数据,实现动态的登录校验和权限控制,适配业务系统的数据库权限设计。7、Shiro中Subject、SecurityManager、Realm三者的关系Subject是用户操作入口,开发者只需要操作Subject即可完成登录、权限判断;Subject本身不处理任何核心逻辑,所有请求都会委托给SecurityManager;SecurityManager作为核心控制器,最终通过Realm从数据源获取数据,完成认证授权。简单来说:Subject干活,SecurityManager调度,Realm提供数据。三、认证与授权核心问题8、Shiro认证中常见的异常有哪些?分别代表什么?UnknownAccountException:账号不存在,数据库查不到对应用户名。IncorrectCredentialsException:密码错误,账号匹配但密码校验失败。LockedAccountException:账号被锁定,后台禁用或冻结用户。ExpiredCredentialsException:凭证过期,密码过期或会话失效。AuthenticationException:认证通用异常,是所有认证异常的父类。9、Shiro授权的两种方式是什么?开发中常用两种授权方式,配合使用:代码式授权:在代码中手动判断权限/角色,灵活适配复杂业务逻辑。

示例:subject.hasRole("admin")、subject.isPermitted("sys:user:add")

注解式授权:在控制器、方法上添加注解,统一拦截校验,简洁高效。

常用注解:@RequiresRole(需要对应角色)、@RequiresPermissions(需要对应权限)、@RequiresAuthentication(需要登录)

10、自定义Realm中doGetAuthenticationInfo和doGetAuthorizationInfo分别什么时候执行?doGetAuthenticationInfo(认证方法):用户登录时执行,只执行一次,用于校验账号密码,返回用户安全信息。doGetAuthorizationInfo(授权方法):用户访问需要权限/角色的接口时执行,默认每次权限校验都会执行;开启缓存后,只会在缓存失效、权限更新时执行,用于查询用户角色、权限集合。四、密码加密与安全11、Shiro密码加密怎么做?为什么要加盐加密?Shiro推荐使用MD5加盐+多次哈希的加密方式,不使用明文存储密码。实现方式:配置HashedCredentialsMatcher,指定加密算法为MD5,设置哈希次数,注册到自定义Realm中。用户注册时,随机生成盐值,对密码加密后,将密文和盐值一起存入数据库。加盐的目的:避免相同密码生成相同密文,防止彩虹表破解,提升密码安全性。如果不加盐,所有用户相同密码加密结果一致,极易被破解。12、Shiro密码加密登录校验原理?用户登录时,前端传递明文密码,Shiro会自动获取数据库存储的盐值,按照配置的算法和哈希次数,对前端密码进行加密,再和数据库中的密文对比,一致则认证成功,无需开发者手动加密对比。五、会话与缓存13、Shiro的Session和Web原生Session有什么区别?Web原生Session依赖Tomcat等Web容器,只能在Web项目使用,无法脱离容器运行。Shiro自带独立的Session管理,属于框架级会话,不依赖Web容器,普通Java项目、后台定时任务都能使用。Shiro会话支持自定义超时时间、会话持久化、分布式会话,扩展性更强。14、为什么要开启Shiro权限缓存?缓存失效场景有哪些?默认情况下,用户每次访问权限接口都会执行授权方法、查询数据库,频繁请求会造成数据库压力过大。开启缓存后,会将用户的角色、权限信息缓存到内存或Redis,大幅提升接口响应速度,减少数据库查询。缓存失效场景:用户退出登录、会话过期、手动清空缓存、后台修改用户角色/权限、重启项目。15、Shiro如何实现分布式会话?传统Shiro会话是单机内存会话,多服务器部署时会出现登录失效、权限丢失问题。分布式场景下,需要自定义SessionDAO,将会话信息持久化到Redis,所有服务节点共享Redis中的会话数据,实现分布式会话统一管理,同时搭配Redis缓存权限信息,保证多节点权限一致。六、过滤器与拦截规则16、Shiro常用的默认过滤器有哪些?作用分别是什么?anon:匿名访问,无需登录、无需权限,所有人可直接访问(如登录页、静态资源)。authc:必须登录认证后才能访问,未登录直接拦截跳转登录页。perms:需要指定权限才能访问,例如perms["sys:user:list"]。roles:需要指定角色才能访问,例如roles["admin"]。user:必须是已登录或记住我的用户可访问。logout:拦截退出登录请求,自动完成会话销毁、退出登录。17、Shiro过滤器配置顺序有要求吗?有严格顺序,遵循先匹配先生效原则。必须将匿名放行的接口配置在前面,需要认证授权的接口放在后面,否则会出现放行失效、错误拦截的问题。通常配置顺序:静态资源放行>登录接口放行>权限接口拦截>所有接口统一拦截。七、实战问题与坑点(高频面试)18、Shiro注解权限不生效是什么原因?怎么解决?这是开发中最常见的问题,核心原因是Shiro注解依赖AOP动态代理,常见故障点:没有开启Shiro注解支持,未配置DefaultAdvisorAutoProxyCreator。方法内部自调用,A类方法调用本类带注解的B方法,不会触发代理拦截,注解失效。注解加在私有方法上,AOP无法代理私有方法,拦截失效。解决方案:开启注解代理、保证注解加在public方法上、避免本类自调用。19、用户修改权限/角色后,为什么需要重新登录才生效?如何实现实时生效?因为用户登录后,权限信息已被缓存,不会主动刷新,修改数据库权限后,缓存数据还是旧的,所以需要重新登录清空缓存。实时生效方案:后台修改用户权限后,手动清空该用户的权限缓存,清空后下次请求会重新查询数据库、加载最新权限,无需重新登录。20、Shiro如何实现记住我功能?原理是什么?开启ShiroRememberMe功能后,用户勾选记住我登录,Shiro会生成加密的RememberMe令牌,存入浏览器Cookie。会话过期后,再次访问系统,会通过Cookie令牌自动识别用户,完成免密登录。注意:记住我属于免登录状态,不属于完整认证状态,高敏感接口仍需要二次认证,保证安全。21、Shiro登录后会话过期时间怎么配置?默认多久?Shiro默认会话过期时间是30分钟,可通过SessionManager自定义全局过期时间,也可单独配置记住我的过期时间。支持监听会话过期事件,实现用户下线提醒、强制踢人等功能。22、Shiro如何实现账号强制下线、单点登录?强制下线:通过会话ID获取当前用户会话,手动销毁会话、清空权限缓存,用户立刻失效,需要重新登录。单点登录:同一账号只允许一处登录,新设备登录时,查询该账号已存在的会话,主动销毁旧会话,实现挤下线效果,保证账号唯一在线。八、进阶面试题23、Shiro的身份认证和授权的底层设计思想整体采用委托模式+责任链模式。所有用户操作委托给SecurityManager,过滤器采用责任链依次拦截请求,层层校验匿名、登录、权限、角色,全部通过才允许访问接口,分层解耦,扩展性极强。24、Shiro和JWT如何整合?整合思路是什么?传统Shiro基于会话登录,前后端分离项目无会话,需要结合JWT实现无状态登录。整合思路:用户登录成功后,后端生成JWT令牌返回前端。前端所有请求携带Token,自定义JWT过滤器替代原生会话过滤器。过滤器拦截请

温馨提示

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

评论

0/150

提交评论