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 ...
随机推荐
- mysql逗号分隔问题
1.说明: 之前写了一个发先了有点问题, 用正则去匹配的会匹配多了数据,所以优化下 媒资表(asset_baseinfo)里面有地区,如下,如果一个节目包含多个地区,id存在如下 地区表(produc ...
- day27 作业
# 学校类 class School: #校区的名字:如"老男孩上海校区" #校区的地址:如"上海虹桥" def __init__(self,s_name,s_ ...
- Spring Boot 2 实战:常用读取配置的方式
1. 前言 在Spring Boot项目中我们经常需要读取application.yml配置文件的自定义配置,今天就来罗列一下从yaml读取配置文件的一些常用手段和方法. 2. 使用@Value注解 ...
- JVM 专题十七:垃圾回收(一)简述
1. 什么是垃圾 1.1 C++与Java 1.2 概述 垃圾收集,不是Java语言的伴生产物.早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生. 关于垃圾收集有三个经典问题 ...
- 数据可视化实例(十五):有序条形图(matplotlib,pandas)
偏差 (Deviation) 有序条形图 (Ordered Bar Chart) 有序条形图有效地传达了项目的排名顺序. 但是,在图表上方添加度量标准的值,用户可以从图表本身获取精确信息. https ...
- [ArcEngine二次开发]为Feature的属性赋值
在创建FeatureClass之后,需要为FeatureClass添加Features,在为Feature的字段赋值时,代码大致如下: 在这里赋值的时候,出现了一个错误: The operation ...
- 使用redis完成秒杀系统原理
假设秒杀商品数为100,list名称为winner_user 参考视频教程:https://www.imooc.com/video/15167
- python也能玩视频剪辑!moviepy操作记录总结
前几篇文章咱们介绍了一下图片的处理方式,今天咱们说说视频的处理.python能够支持视频的处理么?当然是肯定的,人生苦读,我用python.万物皆可python. moviepy库安装 今天咱们需要使 ...
- T133309 57级返校测试重测-T2-选票统计
大致题意: 找出个数超过n/4的数们. 基本思路: 一开始我是用map做的,然后就很玄学的TLE了. 啊,那就换个法吧. 先排个序,然后一样的数就在一起了, 再然后直接从前往后遍历一下,就能得出结果了 ...
- Linux内存大页设置
实际环境中,遇到3次由于内存大页设置参数不合理或者错误,导致系统内存不足,或者数据库内存不足的问题. 按照如下方式,推荐设置大页参考下发设置! 参考HugePages on Oracle Linux ...