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 配置文件,将下面内容复制进去

 1 [users]
 2 # 格式 name=password,role1,role2,..roleN
 3 jack = 456, user
 4 xdclass = 123, root, admin
 5 # 格式 role=permission1,permission2...permissionN   也可以用通配符
 6 # 下面配置user的权限为所有video:find,video:buy,如果需要配置video全部操作crud 则 user = video:*
 7 [roles]
 8 user = video:find,video:buy
 9 # 下面定义了游客角色具有商品模块的查询,购买权限以及评论模块的所有权限
10 visitor= good:find,good:buy,comment:*
11 # ‘admin‘ role has all permissions, indicated by the wildcard ‘*‘
12 admin = *
xdclass = 123, root, admin  表示,xdclass这个用户密码是123,具有 root 和admin两个角色,
user = video:find,video:buy 表示,普通用户角色具有视频的查看,购买权限,
admin = *  表示admin角色具有所有的权限

测试代码:

 1 package net.xdclass.xdclassshiro;
 2
 3 import org.apache.shiro.SecurityUtils;
 4 import org.apache.shiro.authc.UsernamePasswordToken;
 5 import org.apache.shiro.config.IniSecurityManagerFactory;
 6 import org.apache.shiro.mgt.DefaultSecurityManager;
 7 import org.apache.shiro.mgt.SecurityManager;
 8 import org.apache.shiro.realm.SimpleAccountRealm;
 9 import org.apache.shiro.subject.Subject;
10 import org.apache.shiro.util.Factory;
11 import org.junit.Before;
12 import org.junit.Test;
13
14 /**
15  * iniRealm操作
16  */
17 public class QuicksStratTest5_2 {
18
19     @Test
20     public void testAuthentication() {
21         //通过配置文件创建SecurityManager工厂
22         Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
23        // 获取SecurityManager实例
24         SecurityManager securityManager = factory.getInstance();
25         //设置当前上下文
26         SecurityUtils.setSecurityManager(securityManager);
27
28         //获取当前subject(application应用的user)
29         Subject subject = SecurityUtils.getSubject();
30         // 模拟用户输入
31         UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("jack","456");
32         //
33         subject.login(usernamePasswordToken);
34         System.out.println("认证结果(是否已授权):" + subject.isAuthenticated());  //认证结果(是否已授权):true
35         //最终调用的是org.apache.shiro.authz.ModularRealmAuthorizer.hasRole方法
36         System.out.println("是否有对应的角色:" + subject.hasRole("root"));  //是否有对应的角色:false
37         //获取登录 账号
38         System.out.println("getPrincipal():" + subject.getPrincipal());  //getPrincipal():jack
39         //校验角色,没有返回值,校验不通过,直接跑出异常
40         subject.checkRole("user");
41         // user jack有video的find权限,执行通过
42         subject.checkPermission("video:find");
43         // 是否有video:find权限:true
44         System.out.println("是否有video:find权限:" + subject.isPermitted("video:find"));
45         //   是否有video:delete权限:false
46         System.out.println("是否有video:delete权限:" + subject.isPermitted("video:delete"));
47         //user jack没有video的删除权限,执行会报错:org.apache.shiro.authz.UnauthorizedException: Subject does not have permission [video:delete]
48         subject.checkPermission("video:delete");
49 //        subject.logout();
50 //        System.out.println("logout后认证结果:" + subject.isAuthenticated());
51     }
52
53     @Test
54     public void testAuthentication2() {
55         //通过配置文件创建SecurityManager工厂
56         Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
57         // 获取SecurityManager实例
58         SecurityManager securityManager = factory.getInstance();
59         //设置当前上下文
60         SecurityUtils.setSecurityManager(securityManager);
61         //获取当前subject(application应用的user)
62         Subject subject = SecurityUtils.getSubject();
63         // 模拟用户输入
64         UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("xdclass","123");
65         subject.login(usernamePasswordToken);
66         System.out.println("认证结果(是否已授权):" + subject.isAuthenticated()); // 认证结果(是否已授权):true
67         //最终调用的是org.apache.shiro.authz.ModularRealmAuthorizer.hasRole方法
68         System.out.println("是否有admin角色:" + subject.hasRole("admin")); //是否有admin角色:true
69         System.out.println("是否有root角色:" + subject.hasRole("root"));  //是否有root角色:true
70         //获取登录 账号
71         System.out.println("getPrincipal():" + subject.getPrincipal());  //getPrincipal():xdclass
72         // admin角色具有所有权限
73         subject.checkPermission("video:find");
74         // 是否有video:find权限:true
75         System.out.println("是否有video:find权限:" + subject.isPermitted("video:find"));  //是否有video:find权限:true
76         //   是否有video:delete权限:true
77         System.out.println("是否有video:delete权限:" + subject.isPermitted("video:delete")); // 是否有video:find权限:true
78         // 结果为true,如果subject.checkPermission校验不通过,则抛出异常
79         subject.checkPermission("video:delete");
80     }
81 }

原文地址:https://www.cnblogs.com/enjoyjava/p/12079646.html

时间: 2024-08-29 14:18:22

shiro框架学习-3- Shiro内置realm的相关文章

python学习笔记11-python内置函数

python学习笔记11-python内置函数 一.查看python的函数介绍: https://docs.python.org/2/library/ 二.python内置函数 1.abs获取绝对值: 通过python官网查看abs abs(x) Return the absolute value of a number. The argument may be a plain or long integer or a floating point number. If the argument

php学习之重要内置函数

1. require_once()函数 此函数在脚本执行期间包含并执行指定的文件,与require语句类似,唯一区别是如果该文件中的代码已经被包含了,则不会再次包含. require_once()函数保证在脚本执行期间,对于可能出现相同的文件被包含超过一次的 情况下,想确保它包含一次以避免函数重定义,变量重新赋值等问题. 与include()函数一样,此函数执行成功则返回true. 同时,我们要注意到在类似window这样的对大小写不敏感的操作系统中,require_once()和include

shiro框架学习-6-Shiro内置的Filter过滤器及数据加解密

1.  shiro的核心过滤器定义在枚举类DefaultFilter 中,一共有11个 ,配置哪个路径对应哪个拦截器进行处理 // // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package org.apache.shiro.web.filter.mgt; import java.util.LinkedHashMap; import ja

js学习---常用的内置对象(API)小结 :

内置对象(API): 日期 Date: getFullYear() 返回完整的4位的年份  如:2016 getMonth()    返回月份,从0开始 getDate()   返回当前月的第几天,当月的几号 getHours()   返回0-23的小时数字 getMinutes()  返回0-59的分钟数字 getSeconds()  返回0-59的秒数字 getTime()    返回毫秒数 getMilliseconds()  返回毫秒数字 getDay()       返回星期几 Arr

python学习系列--python内置函数(一)

先列出所有的python内置函数,可以看到还是挺多的. abs()        求给定数的绝对值. all()          传入一个列表,只有当列表中所有元素都是真时,该函数返回真. any()        传入一个列表,只要列表中有一个元素为真,该函数即返回真. ascii()       执行对象中的__repr__方法.该函数在python2.7中已弃用. bin()         将给定的值转换成二进制. bool()       判断真假. bytearray()     

Python学习笔记-Day3-python内置函数

python内置函数 1.abs    求绝对值 2.all 判断迭代器中的所有数据是否都为true 如果可迭代的数据的所有数据都为true或可迭代的数据为空,返回True.否则返回False 3.any 判断迭代器中的是否有一个数据为true 如果可迭代的数据中有一个数据为true,返回True.否则返回False.可迭代的数据为空也返回False 4.bin    转换整数为一个二进制字符串(其他数据类型报错) 5.bool 转换一个数据为布尔值 bool是int的子类,如果参数为false

jsp 学习笔记 1——内置对象

jsp 内置对象 jsp中,有9大内置对象有: 1)out. 2)request. 3)response.4)session.5)application; //常用 6)page 7)pageContext 8)exception 9)config //不太常用 一.requset & response 对象 用>>> request >>>web 户<<< response <<<服务器, 由用户向服务器发送 称为请求(re

老男孩学习 python 5 内置函数和文件操作

lambda 表达式: 内置函数: ABS:绝对值: ALL:循环参数,如果每个元素都为真,那么all的返回的值为真 ANY 只有一个真,则为真 ASCII ,利用对象中_repr_,获得返回值: INT: 将别的进制的数据转换十进制的数据: bin:将字符串转换成字节 bool  判断真假,把一个对象转换成布尔值 CHR:将10进制的数据转换成ASCII中的字母 ord:将ascii中的字符转换成十进制的字符 radmon 模块 random.randrange(1.8) 从1到8中生成随机数

【学习】js学习笔记:内置顶层函数eval()的兼容用法

今天学了一个内置顶层函数,eval();其作用是将字符串转换成javascript命令执行,但必须符合语法,否则会报错. 如果写成window.eval(),则其定义的变量会在全局生效. 但是,在IE中,(测试为IE8及以下), window.eval()定义的变量不能在全局作用域生效,而ie有自己的一个函数为window.execScript()可以做到同样的效果.于是,在实际应用中,需要一个判断的函数,分别使用.如下: function evals(str){ if(typeof str!=