android用户特权管理思路

本文介绍了一个Android应用程序中如何管理用户权限的问题。通过分析用户权利的组成,如用户组、岗位和特权,提出了两种解决方案。重点讨论了通过生成唯一标识码来简化权限获取,包括个性化特权和套餐特权的唯一标识码生成方法,并提供了相关代码示例。

前言

项目背景

用户固有属性:

  • 用户id
  • username
  • 联系方式
  • 等等

app需要获取的用户的:

  1. 用户组,用户具有组权利;
  2. 用户在所在组的岗位,岗位类型很多,用户具有岗位权利,不同组不同岗位权利不同;
  3. 用户特权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;
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值