ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

shiro的基础知识储备--授权流程

2021-08-05 15:30:44  阅读:150  来源: 互联网

标签:-- 基础知识 org apache import 权限 shiro subject


目录

授权基础知识

1,概念

授权就是访问控制,控制谁能访问哪些资源。主体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的。

2,关键对象

Who 对what 进行How操作“:

  • Who:就是主体subject
  • What:就是资源,系统菜单,页面,按钮,类方法等,资源包括资源类型和资源实例,比如商品信息就是资源类型,类型为t01的商品为资源实例,编号为001的商品信息也属于资源实例。
  • How:权限,许可,规定了主体对资源的操作许可,权限离开资源没有意义,比如用户查询权限,用户添加权限,某个类方法的调用权限,编号为001用户的修改权限等,通过权限可知道主体对哪些资源都有哪些操作。

3,授权流程

授权的前提是通过了认证。
在这里插入图片描述

4,授权方式

  • 基于角色的访问控制:RBAC基于角色的访问控制是以角色为中心进行访问控制的。
 If(subject.hasRole(“admain”)){
   操作什么资源 
   }
  • 基于资源的访问控制:是以资源为中心进行访问控制的
If(subject.isPermission (“user:*:create”)){
对所有的用户有创建权限
}

5,权限字符串

表达式:资源标识符:操作:资源实例标识符
意思就是对那个资源的那个实例进行什么操作
例子:
User:*:01:就是任意的用户对01实例的任意操作都有权限。

User:update:01: 代表着资源实例
User:update:*: 代表着资源类型

6,授权实现

(1)自定义的realm类中重写了AuthorizingRealm中的doGetAuthorizationInfo()方法。

package com.example.shiro.realm;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;

//使用自定义reaml加入MD5+salt+hash
public class customerMd5Realm extends AuthorizingRealm {


//    自定义授权方法
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
//        获取身份信息
        String primaryPrincipal = (String) principalCollection.getPrimaryPrincipal();
        System.out.println("身份信息:"+primaryPrincipal);
//        根据身份信息 用户名 获取当前用户的角色信息以及权限信息  xiaochen admain user
        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
//        将数据库中查询的角色信息赋值给权限对象
        simpleAuthorizationInfo.addRole("admin");
        simpleAuthorizationInfo.addRole("user");
//        将数据库中查询权限信息赋值给权限对象
        simpleAuthorizationInfo.addStringPermission("user:*:01");
        simpleAuthorizationInfo.addStringPermission("product:update");
        return simpleAuthorizationInfo;
    }


//   自定义认证方法
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
//        获取身份信息
        String principal = (String) authenticationToken.getPrincipal();
//        根据用户名查询数据库
        if ("xiaochen".equals(principal)) {
//            这是单纯的MD55算法生成的密码
            SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(principal, "202cb962ac59075b964b07152d234b70", this.getName());
/**
 *  md5+salt生成的密码验证方式,多了一个参数,是salt生成随机后缀的表达式
 * 参数1:数据库中的用户名 参数2:数据库md5+salt之后的密码 参数3:注册时的随机盐 参数4:realm的名字
 * 并且shiro会自动识别随机盐
 * 如果想使用MD5+salt+hash就要在指定算法的地方去设置散列的次数
 */
            SimpleAuthenticationInfo simpleAuthenticationInfo1 = new SimpleAuthenticationInfo(principal, "8a83592a02263bfe6752b2b5b03a4799", ByteSource.Util.bytes("X0*7ps"), this.getName());
            return simpleAuthenticationInfo;
        }


        return null;
    }
}

编程式,注解式,标签式。

(2)测试类中去查看认证用户中被授权的权限

package com.example.shiro.demoshiro;

import com.example.shiro.realm.customerMd5Realm;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.subject.Subject;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class TestCustomerMd5RealmAuthenicator {
    public static void main(String[] args) {
//        创建安全管理器
        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
//        设置realm使用hash凭证匹配器,我们自定义的realm继承了AuthorizingRealm,而AuthorizingRealm中可以去设置凭证匹配器,但是我们要创建一个匹配器的对象
        customerMd5Realm realm = new customerMd5Realm();
        HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();//创建匹配器的对象
//        使用算法
        hashedCredentialsMatcher.setHashAlgorithmName("md5");//给这个匹配器命名
//        如果使用md5+salt+hash时,指定其散列次数
        hashedCredentialsMatcher.setHashIterations(1024);//给这个匹配器设置hash次数
        realm.setCredentialsMatcher(hashedCredentialsMatcher);//给这个realm设置这个匹配器
//        注入realm
        defaultSecurityManager.setRealm(realm);
//        将安全管理器注入安全工具
        SecurityUtils.setSecurityManager(defaultSecurityManager);
//        通过安全工具类获取subject
        Subject subject = SecurityUtils.getSubject();
//        认证
        UsernamePasswordToken token = new UsernamePasswordToken("xiaochen", "123");
        try {
            subject.login(token);
            System.out.println("登陆成功");
        } catch (UnknownAccountException e) {
            e.printStackTrace();
            System.out.println("认证失败");

        }
        catch (IncorrectCredentialsException e) {
            e.printStackTrace();
            System.out.println("密码错误");
        }
        //        认证用户进行授权
        if(subject.isAuthenticated()){
//            1,基于角色的权限控制
            System.out.println(subject.hasRole("admin"));
//            基于多角色权限控制
            System.out.println(subject.hasAllRoles(Arrays.asList("admin", "user")));
//            是否具有其中一个角色
            System.out.println(subject.hasRoles(Arrays.asList("admin", "super", "user")));
//            基于权限字符串的访问控制  资源标识符:操作:资源类型
            System.out.println("权限:"+subject.isPermitted("user:*:*"));
//            分别具有哪些权限
            boolean[] permitted = subject.isPermitted("user:*:01", "order:*:10");//返回了一个bool数组
            for (boolean b : permitted){
                System.out.println(b);
            }
//            同时具有那些权限
            boolean permittedAll = subject.isPermittedAll("user:*:01", "product:*");
        }
    }
}

标签:--,基础知识,org,apache,import,权限,shiro,subject
来源: https://blog.csdn.net/wlijun_0808/article/details/119418114

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有