Android 不同的用户看到不同的页面(权限控制)?

我想让不同的用户组看到不同的页面。比如:

有4个Fragment A B C D,Admin组能看到所有,Senior组能看到A B C,Junior组只能看到A B。

由于每个客户的数据库是独立的,所以没法像Web那样直接在数据库里创建 用户-权限 表。否则一旦APP发生改动,每一个库里的 用户-权限 表就都得跟着改,这不现实。

我的想法:

  1. 在 MyApplication.java 里,创建 Map<String, List<String>>. Key是用户组名,Value是该组所能看到的 List<Fragment名>

  2. 用户登录后,我就能知道用户属于哪个组,然后利用反射来实例化Fragments:

    
    Class clazz = Class.forName("Fragment names in the List");
    Fragment fragment = (Fragment) clazz.newInstance();
    

请问这样是否可行?有没有其他更好的方案?

阅读 7.6k
4 个回答

你的这个思路很好。

Fragment fragment = (Fragment) clazz.newInstance();

会在登陆后占用很长时间。

建议思路:

  1. 启动时加载全部Fragment

  2. 登陆时判断权限

  3. 设计多个button控制Fragment进入权限,如Fragment1,Fragment2……

  4. 根据权限设置button加载(实例化button比Fragment要快)

把Authority<-->Fragment对应map改成Authority<-->Button对应map。

可以给你讲下我们app的权限设计,很明显,你没有考虑到一些譬如,某个按钮存在A B C界面,但是不同的用户点击的业务都是不一样的,可以用状态模式,一个接口定义所有和权限有关的操作,然后不同权限类实现此接口,比如A按钮,可能管理员权限下就是修改打开界面,但是游客权限下就是调整登录页面

如果用户组和界面(Fragment)的映射关系是固定不变的话,可以这么做。

另外建议只是需要建立用户组名和界面映射的话,直接用 Map<String, List<Class<? extends Fragment>> 来存储 Fragment 的 Class 对象就好了,反射的话不得不要进行混淆过滤,用字符串硬编码类名对协作重构都不是很友好。

新手上路,请多包涵

我觉得也没有你想的那么复杂,fragment可以不用变,就是把abcd四个的数据加载出来,对应不同的权限,然后加载相应的fragment个数,再去加载对应的数据,这样说不知道能理解吗

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题