您的位置:首页 > 移动开发 > Android开发

android用户特权管理思路

2016-01-08 16:20 603 查看

前言

项目背景

用户固有属性:

用户id

username

联系方式

等等

app需要获取的用户的:

用户组,用户具有组权利;

用户在所在组的岗位,岗位类型很多,用户具有岗位权利,不同组不同岗位权利不同;

用户特权Vip,电话服务等等很多,有些特权是固有的,有些是付费购买的;

注意:一个用户可以在不同用户组担任职务。

项目简要流程

用户登录→之后显示用户所拥有的权利。不具有的权利不能显示

分析:

1,2两项权利都是根据岗位及所在组所与生俱有的。
第3项是个性化定制的。


用户权利可以分为两大类:

①:打包特权,即特权包(里面有一些权利)类似于:套餐

②:单个的特权,个性化定制的特权,组合较为灵活。类似于:自由组合

而现在的用户权利是由①+②组成的,而且更要命的是:一个用户可以有多个套餐再加上N个自由组合。这样一个权利体系就很复杂了。即:

特权=(套餐x+套餐y+...)+(个性化特权x+个性化特权y+....)


用户的各项权利,后台都有存储。

项目中的问题与解决方案

现在的问题是,后台的这些权利,前台怎样获取?

方案一:在登录的同时,获取用户的所有权利,当然,数据量相当大。具有很大的缺点,而且不利于分离出用户权利。

方案二:将用户所在组特权,岗位特权,包特权(xx级别会员),个性特权分别生成一个唯一识别码。当然如果量不太大的话你也可以将这些唯一识别码合并成一个。

解决方案详解



解决方案示例图在线查看地址

唯一识别码怎么定义?

首先规定这个识别码是数值型的。

先说说“用户个性化自由组合特权”的唯一标识码

CP(Custom Privilege):用户个性化自由组合特权;单种特权类型多,并且一个用户可以购买多个特权;

个性化特权,姑且假设有31个,如果再多,你再添加位或者再来一个识别码

32位的int值0111 1111….1111 1111
特权名称a,b,c,d,e,f,gs,t,u,v,w,x,y,z
某用户个性化特权可能为: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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息