开发者学堂课程【Java 面试疑难点串讲 3:开发工具及框架:ShiroRealm】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/26/detail/558
ShiroRealm
ShiroRealm 机制
Realm 是几乎所有的认证授权框架都具备的一个概念,那么所谓的 Realm 本身有两层含义:
进行用户的认证处理:主要是进行用户名或密码的判断,同时还可以判断出该用户是否被锁定;
用户的授权处理:进行角色或权限认证,而且这里面的认证所需要的就是根据用户名查询角色或权限的标记。于是在 Realm 里面就有一个容易混淆的概念了:Shiro中的 Session 与 HttpSession 的关系是什么?
如果说你现在使用的不是 WEB 程序,而是一个 Java 程序,那么 Shiro 中的认证与授权依然有效。
所以就可以得出一个结论: Shiro 有一套自己维护的 “Session” 机制(不等同于HttpSession)
如果要是在 WEB 中应用,实际上就表示该 ShiroSession 要结合 HttpSession 一起使用,也就是说在 ShiroSession 中保存的内容在 WEB 容器里面实质上是保存在了HttpSession 里面。
理解为 HttpSession 中存在有一个指定的 Shiro 属性。但是 Shiro 在设计的时候又考虑到了用户的使用习惯,所以对于一些用户的身份信息,那么会将这些身份的信息保存在 Session 里面,用户也可以直接利用 session 属性获得相关的身份信息。
不过对于授权处理需要有一些特殊的处理方式
授权的操作在实际检测之中有两类:
实时授权检测:
你现在修改了一个用户的角色或权限之后该配置立即生效,而且立即影响到已登录的用户;但是这样的操作需要频繁进行数据库的查询处理,所以一般不建议使用;
非实时授权检测:
因为用户的角色和权限几乎很少会被改动,所以这样频繁的进行数据库的查询性能会变差,正是因为如此,在实际的开发之中,会考虑在用户第一次使用角色和权限的时候会将数据信息查询出来,如果是单节点会将授权信息保存在内存里面(EHCache),如果是分布式集群,会将这些信息保存在 Redis 里面。
总之就一个原则:不要在每一次进行用户授权检测的时候重复查询数据库即可。
总结:
ShiroRealm 有一套自己的 Session,在 WEB 中该 Session 会在 HttpSession 里面保存数据,但是用户看不见这些。
有的授权处理一定要使用到缓存,否则会影响你的程序性能。