shiro框架学习-3- Shiro内置realm
1. shiro默认自带的realm和常见使用方法
- realm作用:Shiro 从 Realm 获取安全数据
- 默认自带的realm:idae查看realm继承关系,有默认实现和自定义继承的realm
- 两个概念
- principal : 主体的标示,可以有多个,但是需要具有唯一性,常见的有用户名,手机号,邮箱等
- credential:凭证, 一般就是密码
- 所以一般我们说 principal + credential 就账号 + 密码
- 开发中,往往是自定义realm , 即集成 AuthorizingRealm,重写AuthorizingRealm的getAuthorizationInfo方法
2. Shiro内置 ini realm 操作
在springboot的resources资源目录下创建shiro.ini 配置文件,将下面内容复制进去
[users]
# 格式 name=password,role1,role2,..roleN
jack = 456, user
xdclass = 123, root, admin
# 格式 role=permission1,permission2...permissionN 也可以用通配符
# 下面配置user的权限为所有video:find,video:buy,如果需要配置video全部操作crud 则 user = video:*
[roles]
user = video:find,video:buy
# 下面定义了游客角色具有商品模块的查询,购买权限以及评论模块的所有权限
visitor= good:find,good:buy,comment:*
# 'admin' role has all permissions, indicated by the wildcard '*'
admin = *
xdclass = 123, root, admin 表示,xdclass这个用户密码是123,具有 root 和admin两个角色,
user = video:find,video:buy 表示,普通用户角色具有视频的查看,购买权限,
admin = * 表示admin角色具有所有的权限
测试代码:
package net.xdclass.xdclassshiro; import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.realm.SimpleAccountRealm;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.junit.Before;
import org.junit.Test; /**
* iniRealm操作
*/
public class QuicksStratTest5_2 { @Test
public void testAuthentication() {
//通过配置文件创建SecurityManager工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
// 获取SecurityManager实例
SecurityManager securityManager = factory.getInstance();
//设置当前上下文
SecurityUtils.setSecurityManager(securityManager); //获取当前subject(application应用的user)
Subject subject = SecurityUtils.getSubject();
// 模拟用户输入
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("jack","456");
//
subject.login(usernamePasswordToken);
System.out.println("认证结果(是否已授权):" + subject.isAuthenticated()); //认证结果(是否已授权):true
//最终调用的是org.apache.shiro.authz.ModularRealmAuthorizer.hasRole方法
System.out.println("是否有对应的角色:" + subject.hasRole("root")); //是否有对应的角色:false
//获取登录 账号
System.out.println("getPrincipal():" + subject.getPrincipal()); //getPrincipal():jack
//校验角色,没有返回值,校验不通过,直接跑出异常
subject.checkRole("user");
// user jack有video的find权限,执行通过
subject.checkPermission("video:find");
// 是否有video:find权限:true
System.out.println("是否有video:find权限:" + subject.isPermitted("video:find"));
// 是否有video:delete权限:false
System.out.println("是否有video:delete权限:" + subject.isPermitted("video:delete"));
//user jack没有video的删除权限,执行会报错:org.apache.shiro.authz.UnauthorizedException: Subject does not have permission [video:delete]
subject.checkPermission("video:delete");
// subject.logout();
// System.out.println("logout后认证结果:" + subject.isAuthenticated());
} @Test
public void testAuthentication2() {
//通过配置文件创建SecurityManager工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
// 获取SecurityManager实例
SecurityManager securityManager = factory.getInstance();
//设置当前上下文
SecurityUtils.setSecurityManager(securityManager);
//获取当前subject(application应用的user)
Subject subject = SecurityUtils.getSubject();
// 模拟用户输入
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("xdclass","123");
subject.login(usernamePasswordToken);
System.out.println("认证结果(是否已授权):" + subject.isAuthenticated()); // 认证结果(是否已授权):true
//最终调用的是org.apache.shiro.authz.ModularRealmAuthorizer.hasRole方法
System.out.println("是否有admin角色:" + subject.hasRole("admin")); //是否有admin角色:true
System.out.println("是否有root角色:" + subject.hasRole("root")); //是否有root角色:true
//获取登录 账号
System.out.println("getPrincipal():" + subject.getPrincipal()); //getPrincipal():xdclass
// admin角色具有所有权限
subject.checkPermission("video:find");
// 是否有video:find权限:true
System.out.println("是否有video:find权限:" + subject.isPermitted("video:find")); //是否有video:find权限:true
// 是否有video:delete权限:true
System.out.println("是否有video:delete权限:" + subject.isPermitted("video:delete")); // 是否有video:find权限:true
// 结果为true,如果subject.checkPermission校验不通过,则抛出异常
subject.checkPermission("video:delete");
}
}
shiro框架学习-3- Shiro内置realm的更多相关文章
- shiro框架学习-6-Shiro内置的Filter过滤器及数据加解密
1. shiro的核心过滤器定义在枚举类DefaultFilter 中,一共有11个 ,配置哪个路径对应哪个拦截器进行处理 // // Source code recreated from a .c ...
- shiro框架学习-5-自定义Realm
1. 自定义Realm基础 步骤: 创建一个类 ,继承AuthorizingRealm->AuthenticatingRealm->CachingRealm->Realm 重写授权方 ...
- shiro框架学习-1-shiro基本概念
1. 什么是权限控制 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源, ...
- shiro基础学习(二)—shiro认证
一.shiro简介 shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证.权限授权.加密.会话管理等功能,组成了一个通用的安全认证框架. 以下 ...
- Python学习第二阶段day1 内置函数,序列化,软件目录开发规范
内置函数 1.abs() 求绝对值 2.all() 所有元素为真才返回真 all( [1,1,2,3,-1] ) 值为True 3.any() 所有元素为假才返回假 any([0,0,0 ...
- shiro基础学习(四)—shiro与项目整合
一.认证 1.配置web.xml 2.配置applicationContext.xml 在applicationContext.xml中配置一个bean,ID和上面的过滤器的名称一致. ...
- python自动化测试学习笔记-4内置函数,处理json
函数.全局变量 写代码时注意的几点事项: 1.一般写代码的时候尽量少用或不用全局变量,首先全局变量不安全,大家协作的情况下,代码公用容易被篡改,其次全局变量会一直占用系统内容. 2.函数里如果有多个r ...
- js学习---常用的内置对象(API)小结 :
内置对象(API): 日期 Date: getFullYear() 返回完整的4位的年份 如:2016 getMonth() 返回月份,从0开始 getDate() 返回当前月的第几天,当 ...
- 学习笔记——Maven 内置变量
Maven内置变量说明: ${basedir} 项目根目录(即pom.xml文件所在目录) ${project.build.directory} 构建目录,缺省为target目录 ${project. ...
随机推荐
- c++ 运算符 循环
运算符 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 一.算术运算符 二.关系运算符 三.逻辑运算符 四.位运算符 位运算符作用于位,并逐位执行操作 假设如果 A = 60,且 ...
- Java编程思想——标准 I / O
将Syetem.out转换成PrintWriter 标准I/O重定向: 控制台信息量大,滚动快,查看困难 setIn(InputStream) setOut(...) setErr(...) 新I/O ...
- #Java学习之路——基础阶段二(第十一篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- eureka配置参数
org.springframework.cloud.netflix.eureka.EurekaClientConfigBean 参数名称 说明 默认值 eureka.client.enabled 用于 ...
- MySQL改密
一.未进入之前: 1.grep password /var/log/mysqld.log 得出默认密码2.更改密码 mysqladmin -uroot -p'd-tlbwIgP3e2' pa ...
- Brew 替换为国内源Mac
# 替换brew.git cd "$(brew --repo)" git remote set-url origin https://mirrors.aliyun.com/home ...
- etcd api常用操作
如果需要使用v2 version api,启动etcd时候需要加入“ETCD_ENABLE_V2=true”参数,否则会报错“404 page not found” 获取etcd信息 版本信息 # c ...
- Integer类的常量池
- 小白学习django第二站-模版配置
上一站说道app创建,接下来我们来配置app的url路由 首先需要到setting.py中添加book这个app, 再到django_test文件里的urls添加路由 include() : 这个函数 ...
- python-event事件-模仿红绿灯
import time import threading event =threading.Event() def lighter(): count=0 event.set()#先设置成绿灯 whil ...