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. ...
随机推荐
- 《React+Redux前端开发实战》笔记2:基于Webpack构建的Hello World案例(上)
这次搭建分为两部分:一部分是前期必要配置,一部分是开发React代码. [基于Webpack的React Hello World项目] 1.前期必要配置 (1)首先要确保读者的开发设备上已经安装过No ...
- 微信小程序日历插件
1/ wxml代码 <view class="timePick"> <picker mode="date" fields="mo ...
- SpringBoot初步介绍及安装
SpringBoot的四个核心: 自动配置: 起步依赖: 命令行界面: Actuator: SpringBoot的web起步依赖:org.springframework.boot:spring-boo ...
- shiro登陆认证
1.LoginController @RequestMapping(method = RequestMethod.POST) public String login(User user, HttpSe ...
- deepin之添加右键新建文档选项
deepin之添加右键新建文档选项 虽然Linux系统下所有皆文件,创建各种文件很简单,也很随意,但还是有人讨厌采用先创建空文件再改文件名的方式(比如我),我还是喜欢右键新建一个相应的源文件,可是默认 ...
- 【中间件】Kafka 学习 01
KafKa 博客教程-1 博客教程-2 kafka简介 kafka起源 Kafka是由LinkedIn开发并开源的分布式消息系统,2012年捐赠给Apache基金会,采用Scala语言,运行在JVM中 ...
- Gantt与PERT图区别
甘特图也就做进度管理图.他是一种简单的水平条形图,它以日历为基准描述项目任务,水平轴表示日历时间线,每一个线条表示一个任务,任务名称垂直的列在左边列中,图中的线条的起点和终点对应水平轴上的时间,分别表 ...
- 17.AutoMapper 之配置(Configuration)
https://www.jianshu.com/p/031ff68797dd 配置(Configuration) 通过构造函数创建并初始化MapperConfiguration实例: config = ...
- es6 filter() 数组过滤方法总结(转载)
1.创建一个数组,判断数组中是否存在某个值 var newarr = [ { num: 1, val: 'ceshi', flag: 'aa' }, { num: 2, val: 'ceshi2', ...
- 安卓的几种alert对话框
@Override public void onClick(View v) { switch (v.getId()) { case R.id.d1: AlertDialog.Builder build ...