采用BigInteger进行的权限设计

本文介绍了一种使用BigInteger进行菜单权限管理的设计思路。通过将选中的菜单ID转换为BigInteger的位值,实现高效存储与快速权限验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    最近看到了一个项目的权限是根据bigineger来进行计算的菜单权限,觉得还是不错,存储上只需要存储在一个字段里就可以了,通过计算算出该角色的菜单权限即可,效率也非常的快,放在session中也非常的小,下面简单说一下思路。

        首先,将界面中选好的菜单树,勾选完成后传到后台,后台通过转成字符串数组来进行设值

       

public static BigInteger sumRights(String[] rights){
		BigInteger num = new BigInteger("0");
		for(int i=0; i<rights.length; i++){
			num = num.setBit(Integer.parseInt(rights[i]));
		}
		return num;
	}
通过上面方法,返回一个BigInteger,然后将这个数字存入所属角色的菜单权限字段中。注意的是:这里的菜单ID必须是数字,String[] rights为所选菜单的数组,通过setbit方法一一设置进num中。


其奖,再获取权限的时候,也一样,通过把之前存入的菜单权限的biginteger和菜单ID做对比来判断是否具有该菜单权限

public static boolean testRights(BigInteger sum,int targetRights){
		return sum.testBit(targetRights);
	}

sum为对应角色的菜单权限值,targetRights为具体菜单ID,通过biginteger的testBit方法来判断是否存在里面,如果存在就返回true,不存在就返回false.

biginteger通过set的值,其实是2的权的和。下面有一个列子:

package com.hundsun.network.post.settle.job;

import java.math.BigInteger;

public class TestBigInteger {

    public static void main(String[] args) {
        //初始
        BigInteger num = new BigInteger("0");
        num = num.setBit(2);
        num = num.setBit(1);
        System.out.println(num);
        System.out.println(num.testBit(2));
        System.out.println(num.testBit(1));
        System.out.println(num.testBit(3));
    }

}
num的值为6,是这样计算的2^2+1^2=6。

通过这种方式,不管是解析和查询其实效率都是很高的,占用session的空间也非常的小,不为是一个好的权限设计思路。


### 区块链数字身份认证系统设计研究 #### 基础概念和技术背景 区块链技术凭借其去中心化、不可篡改以及高安全性等特点,在数字身份认证领域展现出巨大潜力。传统身份认证方法通常依赖于单一或少数几个集中式的权威机构,这不仅增加了单点故障的风险,也使得个人信息容易遭受攻击和泄露。相比之下,基于区块链的数字身份认证方案能够有效克服这些问题。 #### 系统架构概述 为了构建一个高效可靠的区块链数字身份认证平台,整体框架需考虑多个层面的因素: - **选择合适的区块链网络**:根据具体的应用场景和服务对象来决定采用公有链还是联盟链等形式; - **智能合约开发**:编写并部署用于管理用户注册、登录及其他交互操作逻辑的智能合约; - **前端UI/UX设计**:打造直观易用的操作界面供终端用户访问; - **API接口定义**:制定标准化的数据传输协议以便不同组件间顺畅沟通; 以上各部分共同构成了完整的业务流程闭环[^2]。 #### 关键功能模块分析 ##### 用户端应用层 应用程序负责收集用户的生物特征数据(如指纹、面部识别等),并通过安全通道将其发送至服务器进行处理。在此过程中,还需确保通信的安全性和私密性不受侵犯。 ##### 后台服务管理层 接收到客户端提交的信息后,后台会调用相应的智能合约函数完成新账户建立或是现有凭证更新等工作。与此同时,所有交易记录都将被永久保存到区块之中,从而形成一条可追溯的历史链条。 ##### 安全机制保障 鉴于敏感资料的重要性,整个体系内应实施严格的身份验证措施,比如多因素认证(MFA),同时配合先进的密码学算法对存储于节点上的文件加以保护。此外,还应当定期审查权限设置情况以防止内部人员滥用职权获取未授权信息。 ```java // Java代码片段展示了一个简单的Merkle树计算过程,这是保证数据完整性的重要组成部分之一。 public class MerkleTree { private List<String> leaves; public String getRootHash() { while (leaves.size() > 1) { leaves = computeLevel(leaves); } return leaves.get(0); } private static List<String> computeLevel(List<String> hashes) { List<String> newLevel = new ArrayList<>(); for (int i = 0; i < hashes.size(); i += 2) { StringBuilder builder = new StringBuilder(); builder.append(hashes.get(i)); if ((i + 1) < hashes.size()) { builder.append(hashes.get(i + 1)); } else { // 如果当前层次为奇数,则最后一个哈希与其自身配对 builder.append(hashes.get(i)); } newLevel.add(hash(builder.toString())); } return newLevel; } private static String hash(String data) { try { MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] encodedhash = digest.digest(data.getBytes()); BigInteger number = new BigInteger(1, encodedhash); String hashtext = number.toString(16); // 补齐长度 while (hashtext.length() < 32) { hashtext = "0" + hashtext; } return hashtext; } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值