java实现权限_Java实现常用权限控制算法

一种常用的权限控制算法的实现,参考LINUX/UNIX权限编码

这里笔者介绍一种很常用,也比较专业的权限控制思路。

要换成其他的语言主,自己转一下就可以了。

这里用java语言描述,其实都差不多的。

为了方便起见,我们这里定义a^b为:a的b次方。

这里,我们为每一个操作设定一个唯一的整数值,比如:

删除A---0

修改A---1

添加A---2

删除B---3

修改B---4

添加B---5

……

理论上可以有N个操作,这取决于你用于储存用户权限值的数据类型了。

如果用户有权限:

添加A---2;

删除B---3;

修改B---4。

那用户的权限值 purview =2^2+2^3+2^4=28,就是2的权的和。化成二进制可以表示为11100。

这样,如果要验证用户是否有删除B的权限,就可以通过位与运算来实现。

在JAvA里,位与运算运算符号为&,即是:

int value = purview &((int)Math.pow(2,3));

你会发现,当用户有操作权限时,运算出来的结果都会等于这个操作需要的权限值!

原理:

位与运算,顾名思义就是对位进行与运算:

以上面的式子为例:purview & 2^3 也就是 28&8

将它们化成二进制有

11100

& 01000

-------------------

01000 == 8(十进制) == 2^3

同理,如果要验证是否有删除A---0的权限

可以用:purview &((int)Math.pow(2,0));

即:

11100

& 00001

------------------------

00000 == 0(十进制)  != 2^0

这种算法的一个优点是速度快。

可以同时处理N个权限。

如果想验证是否同时有删除A---0和删除B---3的权限,可以用

purview&(2^0+2^3)==(2^0+2^3)?true:false;

设置多角色用户。根据权限值判断用户的角色。

下面提供一个java的单操作权限判断的代码:

//userPurview是用户具有的总权限

//optPurview是一个操作要求的权限为一个整数(没有经过权的!)

public static boolean checkPower(int userPurview, int optPurview)

{

int purviewValue = (int)Math.pow(2, optPurview);

return (userPurview & purviewValue) == purviewValue;

}

当然,多权限的验证只要扩展一下就可以了。

几点注意事项:

首先,一个系统可能有很多的操作,

因此,请建立数据字典,以便查阅,修改时使用。

其次,如果用数据库储存用户权限,请注意数值的有效范围。

操作权限值请用唯一的整数!

public class Limits {

/**

* 常规信息下发

*/

public static final int CGXX_XF = 0;

/**

* 常规信息列表

*/

public static final int CGXX_LB = 1;

/**

* 常规信息审核

*/

public static final int CGXX_SH = 2;

/**

* 包月用户查看

*/

public static final int BYYH_CK = 3;

/**

* 违章点播统计

*/

public static final int WZDB_TJ = 4;

/**

* 定制提取详细

*/

public static final int DZTQ_XX = 5;

/**

* 请求记录

*/

public static final int QQJL = 6;

/**

* 管理员权限

*/

public static final int GLY_QX = 7;

/**

* 验证权限

* @param limitsSum 权限总和 权限总和 为每个权限的3次方相加

* @param checkInt 具体权限

* @return

*/

public static boolean checkLimits(int limitsSum, int checkInt){

return (limitsSum & (1 << checkInt)) > 0;

}

/**

* 生成权限总值

* @param limits

* @return

*/

public static int createLimits(String[] limits){

int limitsSum = 0;

for (int i = 0; i < limits.length; i++) {

limitsSum += (1 << Integer.parseInt(limits[i]));

}

return limitsSum;

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304034.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

社区 正式发布了跨平台的 CoreWCF 0.1.0 GA

CoreWCF 项目在2021.2.19 正式发布了0.1.0 GA版本:https://github.com/CoreWCF/CoreWCF/releases/tag/v0.1.0 &#xff0c;这个版本号虽然是0.1&#xff0c;但是它是可以投入生产的版本&#xff0c;而且是跨平台的&#xff0c;支持LInux部署WCF&#xff0c;当前仅支持http 和 n…

Prim 算法及其高效实现

转自&#xff1a;ivy-endhttp://www.ivy-end.com/archives/943背景最小生成树&#xff08;Minimum Spanning Trees&#xff09;&#xff0c;简称MST。是图论中一个非常重要的概念。解决这个问题有两种算法&#xff0c;今天暂且先来讨论一下Prim Algorithm。不做特别说明&#x…

Silverlight实例教程 - Validation数据验证开篇

说起来Validation验证功能&#xff0c;相信大家都不陌生&#xff0c;在应用中&#xff0c;当需要用户交互输入时&#xff0c;开发人员都会加入一些验证代码&#xff0c;这样可以有效的避免应用异常出现&#xff0c;也可以使应用的错误提示信息清晰明了的显示在客户端&#xff0…

c语言 java 性能 测试_这个蓝桥杯系统的题,用c语言去评测是满分,改为Java说运行错误是0分,但是我查看输入输出,至少第...

这个蓝桥杯系统的题&#xff0c;用c语言去评测是满分&#xff0c;改为Java说运行错误是0分&#xff0c;但是我查看输入输出&#xff0c;至少第一个是对的啊提交序号1269960作者彭云成提交时间02-0507:49:27评测结果运行错误得分...这个蓝桥杯系统的题&#xff0c;用c语言去评测…

一日一技:微信扫码用户帐号绑定

概述最近在整一个微信扫码用户帐号绑定功能。为了满足用户帐号绑定场景的需要&#xff0c;通过生成用户自己的二维码&#xff0c;用户扫描后&#xff0c;公众号可以接收到事件推送。如下1、用户登录扫码2、绑定成功实现思路扫码绑定账户&#xff0c;其实就是扫描带有用户信息的…

CSS规化

一&#xff1a;简单划分&#xff08;规模小时&#xff09; 整站布局:layout.css /*子模块如有特殊布局&#xff0c;可以通过不同的名称写在一起。*/ 公用样式:pubic.css /* 定义些公用字体&#xff0c;颜色&#xff0c;超链接等。*/ 模块样式:module.css /*也…

计算机起源的数学思想

人类的历史可以看做一部关于解放的历史。也有这样的说法&#xff0c;懒惰是人类进步的动力。为了偷懒&#xff0c;人类不断的做着各种努力&#xff0c;发明了各种机器工具&#xff0c;将自己从繁重的劳动解放出来&#xff0c;另一方面&#xff0c;每一次大的进步&#xff0c;都…

java mongodb 批量删除_MONGODB删除/新增/更改大量记录的方法

Indexed(expireAfterSeconds180)private Date deletedAt;以上代码&#xff0c;如果字段deletedAt有值&#xff0c;那么将在180秒后被MONGODB删除&#xff0c;如果没值不会被删除。批量新增&#xff0c;小批量更新&#xff0c;防止读取超时private void insertAll(List list) {…

Redis 通过 RDB 方式进行数据备份与还原

Redis 通过 RDB 方式进行数据备份与还原Intro有的时候我们需要对 Redis 的数据进行迁移&#xff0c;今天介绍一下通过 RDB&#xff08;快照&#xff09;文件进行 Redis 数据的备份和还原Redis 持久化Redis 的数据持久化有两种机制&#xff0c;一种是 RDB(Redis Database)&#…

java proguard 使用_一步步教你使用Proguard混淆Java源代码

ava代码很容易被反编译&#xff0c;以下使用proguard来保护我们的代码proguard选项很多&#xff0c;容易迷糊&#xff0c;现在就把我的配置写下来(实际使用中)&#xff0c;以供参考2.准备好你的jar包&#xff0c;我在这里举例叫做test.jar。3.解压proguard&#xff0c;执行 bin…

vi的使用

vi编辑器是所有Unix及Linux系统下标准的编辑器&#xff0c;它的强大不逊色于任何最新的文本编辑器&#xff0c;这里只是简单地介绍一下它的用法和一小部分指令。由于 对Unix及Linux系统的任何版本&#xff0c;vi编辑器是完全相同的&#xff0c;因此您可以在其他任何介绍vi的地方…

稳定匹配问题——稳定婚姻算法设计

图片源自&#xff1a;美剧《How I met your mother》****本代码带有详细的注释&#xff0c;并在控制台输出时详细地说明了算法的过程&#xff0c;非常有助于新手理解稳定匹配问题和稳定婚姻算法的设计思路。****#include <iostream>using namespace std;bool finish_or_n…

如果诸葛亮用C#写出师表...

❝看到一篇18年的文章 "C版《出师表》"&#xff0c;站长觉得挺有意思的&#xff0c;就用C# 控制台也实现了一遍&#xff0c;技术上没啥难度&#xff0c;但复制代码费了1、2个小时&#xff0c;纯粹无聊写着玩&#xff0c;看者别在意枚举、类名、变量中文命名&#xff…

简单的作好服务器安全的几个步骤

一.停掉Guest 帐号 在计算机管理的用户里面把guest帐号停用掉&#xff0c;任何时候都不允许guest帐号登陆系统。为了保险 起见&#xff0c;最好给guest 加一个复杂的密码&#xff0c;你可以打开记事本&#xff0c;在里面输入一串包含特殊字符,数 字&#xff0c;字母的长字符…

java蛮力法背包问题_[算法课]五种蛮力法解决01背包问题

文章目录注明&#xff1a;题目要求只能使用蛮力法算法标签&#xff1a;全排列&#xff0c;枚举&#xff0c;二进制&#xff0c;dfs&#xff0c;数组题目简介思路AC代码方法一&#xff1a;字符串蛮力方法二&#xff1a;二进制枚举方法三&#xff1a;DFS三.&#xff12;闫老板思考…

这16个数据可视化案例,惊艳了全球数据行业

数据可视化可以帮你更容易的解释趋势和统计数据。数据是非常强大的。当然&#xff0c;如果你能真正理解它想告诉你的内容&#xff0c;那它的强大之处就更能体现出来了。通过观察数字和统计数据的转换以获得清晰的结论并不是一件容易的事。必须用一个合乎逻辑的、易于理解的方式…

asp.net core 自定义 Content-Type

asp.net core 实现支持自定义 Content-TypeIntro我们最近有一个原本是内网的服务要上公网&#xff0c;在公网上有一层 Cloudflare 作为网站的公网流量提供者&#xff0c;CloudFlare 会有一层防火墙拦截掉一些非法的请求&#xff0c;我们有一些 API 会提交一些 html 内容&#x…

left outer join 和 right outer join 和 join 的区别

举个例子你就能知道了&#xff01;A表(a1,b1,c1) B表(a2,b2)a1 b1 c1 a2 b201 数学 95 01 张三02 语文 90 02 李四03 英语 80 04 王五select A.*,B.* from A inner join B on(A.a1B.a2)结果是&#xff1a;a1 b1 c1 …

liunx+java+jar+运行_Linux后台运行java的jar包

Linux 运行jar包命令如下&#xff1a;方式一java -jar shareniu.jar特点&#xff1a;当前ssh窗口被锁定&#xff0c;可按CTRL C打断程序运行&#xff0c;或直接关闭窗口&#xff0c;程序退出那如何让窗口不锁定&#xff1f;方式二java -jar shareniu.jar &&代表在后台…

如何优雅的移植JavaScript组件到Blazor

Blazor作为一个新兴的交互式 Web UI 的框架&#xff0c;有其自身的优缺点&#xff0c;如果现有的 JavaScript 组件能移植到 Blazor&#xff0c;无疑让 Blazor 如虎添翼&#xff0c;本文就介绍一下自己在开发 BulmaRazor 组件库的时&#xff0c;封装现有的 JavaScript 组件的方法…