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 ...
随机推荐
- Xshell如何连接
Xshell如何连接
- JavaScript图片预览
预览选中的图片文件 jQuery $("#selectImage").change(function(){ $("#image").attr("src ...
- 从零开始实现multipart/form-data数据提交
在HTTP服务应用中进行数据提交一般都使用application/json,application/x-www-form-urlencoded和multipart/form-data这几种内容格式.这 ...
- 介绍python由来, 安装python3.8.3 及其变量的定义, 小整数池
介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,Guido开始写能够解释Python语言语法的解释器.Python这个名字,来自Guido所挚爱 ...
- day53 html收尾
目录 一.解决浮动带来的影响 二.溢出属性 三.定位 四.验证浮动和定位是否脱离文档流 五.z-index模态框 六.透明度opacity 七.js简介 一.解决浮动带来的影响 块级标签内的浮动如果该 ...
- day16 函数对象与闭包函数
目录 一.函数对象 1.1函数可以被引用 1.2函数可以作为容器类型的元素 1.3函数可以作为参数传入另外一个函数 1.4函数的返回值可以是一个函数 二.闭包函数 1 什么是闭包函数 2 闭包函数的用 ...
- Maven 专题(七):常用命令
mvn archetype:generate : 反向生成项目的骨架 mvn clean: 清除各个模块target目录及里面的内容 mvn compile: 静态编译,根据xx.java生成xx.c ...
- 手把手从零开始---封装一个vue视频播放器组件
现在,在网页上播放视频已经越来越流行,但是网上的资料鱼龙混杂,很难找到自己想要的,今天小编就自己的亲身开发体验,手把手从零开始---封装一个vue视频播放器组件. 作为一个老道的前端搬砖师,怎么可能会 ...
- CobaltStrike上线Linux主机(CrossC2)
一.简述 CrossC2插件是为企业和红团队人员提供的安全框架,支持 CobaltStrike 对其他平台的渗透测试(Linux / MacOS /...),支持自定义模块,并包括一些常用的渗透模块. ...
- 带Boolean类型的参数的接口用postman测试时传参问题
带Boolean类型的参数的接口用postman测试时传参问题 @Data public class ATest { private Boolean isCommit; } postman 测试时传参 ...