zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    (转)Computer Vision Open Source Algorithm Implementations
    关于项目依赖项
    fatal error CVT1100: duplicate resource. type:MANIFEST, name:1, language:0×0409
    转:error LNK2005
    C++ string类常用函数
    [转载]同步synchronized方法和代码块
    Java语言基础常用对象API(二)泛型、Map集合
    Java语言基础IO流(输入输出流) 字符流
    Java语言基础常用对象API(二)集合框架
    Java语言基础IO流(输入输出流) 字节流、转换流
  • 原文地址:https://www.cnblogs.com/enjoyjava/p/12079646.html
Copyright © 2011-2022 走看看