Shiro探索1. Realm
1. Realm 是什么?汉语意思:领域,范围;王国;这个比较抽象;
简单一点就是:Realm 用来对用户进行认证和角色授权的
再简单一点,一个用户怎么判断它有没有登陆?这个用户是什么角色有哪些权限?
是不是需要我们查询数据库或者从缓存中获取相关的角色信息或者进行登陆认真。
2. 其实呢?就是我们说的DAO!!!或者我们说的Mapper ,就是用来访问数据库的工具
对的!! 就是用来访问数据库的工具。只是在访问数据库的基础上,有一些其他的功能而已。
3. 看看类继承关系
看看这里 类 AuthorizingRealm 其中Authorizing 是授权的意思; 这是一个抽象类
我们一般自己定义一个Realm 直接继承AuthorizingRealm并实现两个抽象方法
protected abstract AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException;
//这个是AuthenticatingRealm类中的放法
protected abstract AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals);
// 这个是AuthorizingRealm类中的方法
注意这两个单词
Authenticating 认证,就是判定有没有登陆
Authorizing 授权,就是给登陆的用户分配一些特定的角色,所以需要先登录了,才能进行授权(角色分配) 上述两个抽象方法需要实现;一个用来登陆,一个用来授权
4. 再认识一下两个参数:
AuthenticationToken 就是Token,一般是根据请求的数据,比如用户名和密码 生成的token;
这个token如果保存着用户名和密码数据,那么在 doGetAuthenticationInfo()这个方法中就可以进行访问数据库进行登陆操作;
PrincipalCollection 这个参数,可以用到可以不用;
这个里面存放的Subject 中的 principal;因为可以定义多个Realm,所以可能会生成多个Subject;
principal 就是subject 的身份标识,一般用比如用户名,邮箱,id 等 5. 最后非常重要的思想:
doGetAuthenticationInfo
doGetAuthorizationInfo 这两个方法,是要直接进行访问数据库的,不要在里面进行访问shiro配置的缓存; 因为shiro 只有在缓存中找不到时,才会调用这两个方法
protected AuthorizationInfo getAuthorizationInfo(PrincipalCollection principals) { if (principals == null) {
return null;
} AuthorizationInfo info = null; if (log.isTraceEnabled()) {
log.trace("Retrieving AuthorizationInfo for principals [" + principals + "]");
} Cache<Object, AuthorizationInfo> cache = getAvailableAuthorizationCache();
if (cache != null) {
if (log.isTraceEnabled()) {
log.trace("Attempting to retrieve the AuthorizationInfo from cache.");
}
Object key = getAuthorizationCacheKey(principals);
info = cache.get(key); // 先访问缓存
if (log.isTraceEnabled()) {
if (info == null) {
log.trace("No AuthorizationInfo found in cache for principals [" + principals + "]");
} else {
log.trace("AuthorizationInfo found in cache for principals [" + principals + "]");
}
}
} if (info == null) {
// Call template method if the info was not found in a cache
info = doGetAuthorizationInfo(principals);// 缓存中没有,才调用我们实现的方法
// If the info is not null and the cache has been created, then cache the authorization info.
if (info != null && cache != null) {
if (log.isTraceEnabled()) {
log.trace("Caching authorization info for principals: [" + principals + "].");
}
Object key = getAuthorizationCacheKey(principals);
cache.put(key, info);// 再放入缓存
}
} return info;
}
public final AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { AuthenticationInfo info = getCachedAuthenticationInfo(token);// 先调用访问缓存的方法;【这个方法就不贴了,可看源码,就是从cache中获取】
if (info == null) {
//otherwise not cached, perform the lookup:
info = doGetAuthenticationInfo(token);// 如果缓存中没有,则调用我们的方法
log.debug("Looked up AuthenticationInfo [{}] from doGetAuthenticationInfo", info);
if (token != null && info != null) {
cacheAuthenticationInfoIfPossible(token, info);// 写入缓存
}
} else {
log.debug("Using cached authentication info [{}] to perform credentials matching.", info);
} if (info != null) {
assertCredentialsMatch(token, info);
} else {
log.debug("No AuthenticationInfo found for submitted AuthenticationToken [{}]. Returning null.", token);
} return info;
}
从上述可以看到,我们实现认证和授权的方法时,要直接从数据库中获取,而不需要从shiro使用的缓存中获取;
除非是多级缓存,比如shiro 定义的cache 用的缓存和该方法内的缓存不是同一个缓存。
但无论怎样,一定要最终到数据库中去获取最根本的数据。 关于shiro 缓存机制,我们下次再总结
Shiro探索1. Realm的更多相关文章
- shiro中自定义realm实现md5散列算法加密的模拟
shiro中自定义realm实现md5散列算法加密的模拟.首先:我这里是做了一下shiro 自定义realm散列模拟,并没有真正链接数据库,因为那样东西就更多了,相信学到shiro的人对连接数据库的一 ...
- 【三】shiro入门 之 Realm
Realm:域,Shiro 从从Realm获取安全数据(如用户.角色.权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法:也 ...
- Shiro -- (三) 自定义Realm
简介: Realm:域,Shiro 从从 Realm 获取安全数据(如用户.角色.权限),就是说 SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的用户进行比较以确定 ...
- shiro(二)自定义realm,模拟数据库查询验证
自定义一个realm类,实现realm接口 package com; import org.apache.shiro.authc.*; import org.apache.shiro.realm.Re ...
- (4)shiro多个realm
shiro支持多个realm,当设置多个realm的时候,shiro的认证和授权的步骤是怎样的呢. 多个realm认证原理: 发现需要在执行认证的时候,需要策略来处理多个realm存在的情况.默认实现 ...
- 使用Spring配置shiro时,自定义Realm中属性无法使用注解注入解决办法
先来看问题 纠结了几个小时终于找到了问题所在,因为shiro的realm属于Filter,简单说就是初始化realm时,spring还未加载相关业务Bean,那么解决办法就是将springmvc ...
- shiro之自定义realm
Shiro认证过程 创建SecurityManager--->主体提交认证--->SecurityManager认证--->Authenticsto认证--->Realm验证 ...
- 6、Shiro之自定义realm
1.创建一个包存放我们自定义的realm文件: 创建一个类名为CustomRealm继承AuthorizingRealm并实现父类AuthorizingRealm的方法,最后重写: CustomRea ...
- shiro权限认证Realm的四大用法
一.SimpleAccountRealm public class AuthenticationTest { SimpleAccountRealm sar=new SimpleAcc ...
随机推荐
- Docker镜像-删除镜像
因为尝试使用新的镜像,对原来的镜像进行删除,报错如下: 意思就是在删除镜像之前,要先删除对应的docker.因为该image被对应的container引用,所以image删除失败. 显示所有状态的容器 ...
- 线下---复习day04---作业
1 学的不好的同学:用ajax提交一个json格式数据,返回一个json格式数据,console.log打印出来 2 通过ajax上传一个文件并保存起来,前端接收到,弹窗说上传成功 urls.py f ...
- 如何查询到你的wifi所在的公网ip?
浏览器中输入:ip138.com 即可查询到.
- day71 django收尾
目录 一.Auth模块 1 简介 2 方法总结 3 如何扩展auth_user表 二.bbs表介绍 1 项目开发流程 2 bbs七张表关系 一.Auth模块 1 简介 在我们创建好一个django项目 ...
- Pop!_OS配置Python环境
Pop!_OS配置Python环境 #0x0 安装vscode #0x1 配置vscode #0x0 安装vscode 见vscode安装 #0x1 配置vscode 安装Python插件 安装pyl ...
- Set 和 Map
1. 数组去重 <script type="text/javascript"> [...new Set(array)] </script> 2. 条件语句的 ...
- 用svg实现一个环形进度条
svg实现环形进度条需要用到的知识: 1.会使用path的d属性画一个圆环 //用svg的path元素的A命令画圆 <path d=" M cx cy m 0 -r a r r 0 1 ...
- JVM 专题二十二:垃圾回收(六)垃圾回收器 (三)
4. GC日志分析 4.1 日志分析 通过阅读GC日志,我们可以了解Java虚拟机内存分配与回收策略. 内存分配与垃圾回收的参数列表-XX:+PrintGC:输出GC日志.类似-verbose: gc ...
- 数据可视化基础专题(十四):pyecharts 基础(一)简单上手
1.引言 文档位于 https://pyecharts.org/#/zh-cn/intro 示例位于 https://gallery.pyecharts.org/#/README echarts 官网 ...
- 06 flask源码剖析之路由加载
06 Flask源码之:路由加载 目录 06 Flask源码之:路由加载 1.示例代码 2.路由加载源码分析 1.示例代码 from flask import Flask app = Flask(__ ...