android用户特权管理思路
来源:互联网 发布:手机淘宝如何看买家秀 编辑:程序博客网 时间:2024/06/11 20:31
前言
项目背景
用户固有属性:
- 用户id
- username
- 联系方式
- 等等
app需要获取的用户的:
- 用户组,用户具有组权利;
- 用户在所在组的岗位,岗位类型很多,用户具有岗位权利,不同组不同岗位权利不同;
- 用户特权Vip,电话服务等等很多,有些特权是固有的,有些是付费购买的;
注意:一个用户可以在不同用户组担任职务。
项目简要流程
用户登录→之后显示用户所拥有的权利。不具有的权利不能显示
分析:
1,2两项权利都是根据岗位及所在组所与生俱有的。第3项是个性化定制的。
用户权利可以分为两大类:
①:打包特权,即特权包(里面有一些权利)类似于:套餐
②:单个的特权,个性化定制的特权,组合较为灵活。类似于:自由组合
而现在的用户权利是由①+②组成的,而且更要命的是:一个用户可以有多个套餐再加上N个自由组合。这样一个权利体系就很复杂了。即:
特权=(套餐x+套餐y+...)+(个性化特权x+个性化特权y+....)
用户的各项权利,后台都有存储。
项目中的问题与解决方案
现在的问题是,后台的这些权利,前台怎样获取?
方案一:在登录的同时,获取用户的所有权利,当然,数据量相当大。具有很大的缺点,而且不利于分离出用户权利。
方案二:将用户所在组特权,岗位特权,包特权(xx级别会员),个性特权分别生成一个唯一识别码。当然如果量不太大的话你也可以将这些唯一识别码合并成一个。
解决方案详解
解决方案示例图在线查看地址
唯一识别码怎么定义?
首先规定这个识别码是数值型的。
先说说“用户个性化自由组合特权”的唯一标识码
CP(Custom Privilege):用户个性化自由组合特权;单种特权类型多,并且一个用户可以购买多个特权;
个性化特权,姑且假设有31个,如果再多,你再添加位或者再来一个识别码
某用户个性化特权可能为:a,c,g,x,y
则唯一识别码为:0101 0001 0000 0000 0000 0000 0000 0110
用十进制表示则为:1358954502
用十六进制表示则为:51000006
二进制转换成十进制,在转换成十六进制很简单,代码如下:
String binary="01010001000000000000000000000110";Integer.parseInt(binary,2));//转成二进制Integer.toHexString(Integer.parseInt(binary,2));//转成16进制
我个人觉得后台返回这个唯一识别码时返回十六进制比较好。
再说说,“用户套餐自由组合特权”的唯一标识码”
这里我们定义以下几个特权套餐(特权包):
tcGROUP:组权利套餐(特权包);组的种类很多,并且一个用户可以分属不同的组;
tcJOB:岗位权利套餐(特权包);岗位种类很多,并且一个用户可以兼任多个岗位
tcVIP:用户订购的特权包;VIP套餐种类很多,并且一个用户可以购买多个类型的VIP套餐
仿照CP(Custom Privilege)生成唯一识别码的方式:
分别产生唯一识别码:tcGROUP,tcJOB,tcVIP
之所以使用十六进制标识唯一识别码,是因为这样的识别码比较短,也方便理解。
代码用法
下面的这些代码怎么用?
我们在做应用的时候,针对不同的用户展示不同的功能(特权)。比如说:用户A具有如下具有x特权,我就把x特权显示出了,不具有x特权,我就不显示该功能(特权)。我们从后台获取了,几个唯一识别码,之后分别用唯一识别码创建MyGroup对象,MyJob对象….,然后在用这些对象创建User对象。如果我们想要确认一下该user是否购买了CustomPrivilege.PLAYTOGETHER这个特权,这时我们可以这样判断:
boolean whichCustomPrivilege = user.whichCustomPrivilege(CustomPrivilege.PLAYTOGETHER);//这个返回值会告诉我们用户是否具购买PLAYTOGETHER;
下面上代码:
代码的具体实现
以下代码,为方便起见,你可以向上抽取一下;
用户类:
package com.cis.test;public class User { // 所属的组 private MyGroup groups; // 所具有的工作岗位; private MyJob jobs; // 所购买的VIP套餐 private MyVIP vip; // 所具有的个性化权利自由组合包 private CustomPrivilege customPrivilege; public User(MyGroup groups, MyJob jobs, MyVIP vip, CustomPrivilege customPrivilege) { super(); this.groups = groups; this.jobs = jobs; this.vip = vip; this.customPrivilege = customPrivilege; } /** * * @param groupRigthCode * 具体的组名(数字表示) * @return 在这个组中就返回true */ public boolean whichGroup(int groupRigthCode) { return groups.haveRight(groupRigthCode); } /** * * @param vipRigthCode * VIP套餐名称(用数字表示) * @return 用户购买了该VIP套餐就返回true; */ public boolean whichVIP(int vipRigthCode) { return vip.haveRight(vipRigthCode); } /** * * @param jobRightCode * 具体工作名(用数字表示) * @return 包含这个岗位就返回true */ public boolean whichJob(int jobRightCode) { return jobs.haveRight(jobRightCode); } /** * * @param cpRightCode * 特权名称(用数字表示) * @return 购买了该项特权就返回true */ public boolean whichCustomPrivilege(int cpRightCode) { return customPrivilege.haveRight(cpRightCode); } public MyGroup getGroups() { return groups; } public void setGroups(MyGroup groups) { this.groups = groups; } public MyJob getJobs() { return jobs; } public void setJobs(MyJob jobs) { this.jobs = jobs; } public CustomPrivilege getCustomPrivilege() { return customPrivilege; } public void setCustomPrivilege(CustomPrivilege customPrivilege) { this.customPrivilege = customPrivilege; }}
用户所在的组类
package com.cis.test;public class MyGroup {// 我先写几个假设的组名称,组名称意味着组特权哦!public static final int BAIDU = 1;public static final int ALIBABA = 1 << 1;public static final int TECENT = 1 << 2;// 先写这么多.......// 用户所在组的唯一识别码private int groupUniqueCode;public MyGroup(int groupUniqueCode) { super(); this.groupUniqueCode = groupUniqueCode;}/** * 判断用户是否在某个组 * * @param groupRigthCode * 传入上面的那几个字段 * @return */public boolean haveRight(int groupRigthCode) { return (groupRigthCode & groupRigthCode) != 0;}public int getGroupUniqueCode() { return groupUniqueCode;}public void setGroupUniqueCode(int groupUniqueCode) { this.groupUniqueCode = groupUniqueCode;}}
工作岗位类
package com.cis.test;public class MyJob {// 写几个岗位,不同的岗位意味着不同的岗位权利套餐包哦!public final static int CEO = 1;public final static int CFO = 1 << 1;public final static int CGO = 1 << 2;public final static int CHO = 1 << 3;// 先写这么多....// 岗位唯一识别码private int jobUniqueCode;public MyJob(int jobUniqueCode) { super(); this.jobUniqueCode = jobUniqueCode;}/*** * * @param jobRightCode * @return */public boolean haveRight(int jobRightCode) { return (jobRightCode & jobRightCode) != 0;}public int getJobUniqueCode() { return jobUniqueCode;}public void setJobUniqueCode(int jobUniqueCode) { this.jobUniqueCode = jobUniqueCode;}}
用户VIP套餐类
package com.cis.test;public class MyVIP {// 写几个自由选购的VIP特权包public final int BASIC_VIP = 1;public final int SEMI_VIP = 1 << 1;public final int ADVANCE_VIP = 1 << 2;//先写这么多....//vip的唯一识别码private int vipUnique;public MyVIP(int vipUnique) { super(); this.vipUnique = vipUnique;}/** * 判断是否购买某一个vip包 * @param vipRigthCode * @return */public boolean haveRight(int vipRigthCode) { return (vipUnique&vipRigthCode)!=0;}public int getVipUnique() { return vipUnique;}public void setVipUnique(int vipUnique) { this.vipUnique = vipUnique;}}
用户自由定制特权类
package com.cis.test;public class CustomPrivilege {// 写几个私密特权public final static int CHAT = 1;public final static int GAME = 1 << 1;public final static int SLEEP = 1 << 2;public final static int PLAYTOGETHER = 1 << 3;// 先写这么多....// 用户自由组合特权唯一识别码private int customPrivilegeUnique;public CustomPrivilege(int customPrivilegeUnique) { super(); this.customPrivilegeUnique = customPrivilegeUnique;}/** * 判断是否具有上面的那几个权利 * * @param cpRightCode * 上面那几个字段 * @return */public boolean haveRight(int cpRightCode) { return (customPrivilegeUnique & cpRightCode) != 0;}public int getCustomPrivilegeUnique() { return customPrivilegeUnique;}public void setCustomPrivilegeUnique(int customPrivilegeUnique) { this.customPrivilegeUnique = customPrivilegeUnique;}}
- android用户特权管理思路
- oracle 用户添加、删除、修改,用户权限,对象特权管理
- Oracle:用户、特权和角色
- Android-管理应用内多个Activity思路
- Intel特权用户嵌入式帮助在线申请表
- Oracle之用户、特权和角色
- oracle:用户、特权和角色,审计
- linux 特权级 用户态 内核态
- Android项目之用户管理
- Android 防住用户查看文件和文件夹思路
- 97.Oracle数据库SQL开发之 用户特权和角色——系统特权
- 98.Oracle数据库SQL开发之 用户特权和角色——对象特权
- android 自己的思路写的订单管理界面
- Android Studio 应用程序管理功能思路与代码
- 用户登录功能设计思路
- 将最小特权原则应用到Windows XP用户帐户
- 内核空间_用户空间_特权级别
- sysdba和sysoper两个特权用户的区别
- 关于视频格式的问题
- 在android程序中使用配置文件properties
- vs release版本的断点调试
- Git忽略规则及.gitignore规则不生效的解决办法
- 3.5.8比较操作
- android用户特权管理思路
- oracle中逗号分割值
- Android实战开发:自定义照相机
- Maven搭建SpringMVC+Mybatis项目详解
- 使用xib封装一个自定义view的步骤
- 数据库中float,double与decimal的区别
- p243 第二题
- app 通知类接口设计
- 分布式关系数据库中间件swiftdb (类似mycat、cobar中间件)