javaweb权限管理,用户的权限数据该存放在哪里

javaweb权限管理,用户的权限数据该存放在哪里,第1张

配置一个servlet,在容器启动时自加载权限,并且通过资源表的数据信息,将每一条资源中的resourceURL与AuthorityName(权限名)进行配对。这里的resourceURL可能对应多个权限,所以Map集合内的Collection集合就是用来配置多个权限的,验证时需匹配该集合内所有的权限。所以URL可以重复录入数据库,但权限不能重复。

AuthorityDataMap,建立这个类用来存放经过权限匹配后的权限信息,是项目所有的权限集合。缓存在servlet上下文中。

1、这是OA系统中的用户权限的表的设计。

2、一般分为5张表来解决,

用户表、权限表、角色表、用户角色表、角色权限表。

这样就可以使用户、权限、角色很好的分离管理了。

再思考下吧。

一、概要

通常,需要单独的权限系统是解决授权的管理和维护,再分配等难题,不针对开发而言。

系统架构目标:在易于理解和管理,开发的前提下,满足绝大部分粗粒度和细粒度权限控制的功能需要。

除了粗粒度权限,系统中必然还会包括无数对具体Instance的细粒度权限。这些问题,被留给对框架的扩展方法来解决,这样的考虑基于以下两点:

1、细粒度的权限判断必须要在资源上获取权限分配的支持的上下文信息才可能得以实现。

2、细粒度的权限常常具有相当大的业务逻辑相关性。对不同的业务逻辑,常常意味着完全不同的权限判定原则和策略。相比之下,粗粒度的权限更具通用性,将其实现为一个架构,更有重用价值;而将细粒度的权限判断实现为一个架构级别的东西就显得繁琐,增加架构的复杂性。而且不是那么的有必要,用定制的代码来实现就更简洁,更灵活。否则会变成各种逻辑代码的堆砌。

比如,product post数量的控制,这种一般要知道用户个性化的信息,付钱数量到数据库中查找最高数量,还要知道此用户已经有多少产品等,规则不具备通用性和重用性,

所以细粒度控制不应该放在权限架构层来解决。实例级的细粒度权限的解决方案就是将它转化为粗粒度权限,这样我们权限客户端就变得很简单了。

名词解释

粗粒度权限:一般可以通过配置文件来授权,授权只有真假,没有多少之分,不需要上下文的支持。不消耗资源的。

逻辑表达式:判断“Who对What(Which)进行How的 *** 作”的逻辑表达式是否为真。

别名:静态授权、类级授权

细粒度权限:不能通过配置文件等表达,需要特定上下文的支持

逻辑表达式:判断“When(Where)的时候,Who对What(Which)进行How的 *** 作”的逻辑表达式是否为真。

别名:动态授权、实例级授权

设计原则:框架只提供粗粒度的权限。细粒度的权限也需要集中管理和维护,细粒度的权限通过定制的扩展代码将细粒度转化为粗粒度授权。

二、权限系统的设计

权限往往是一个极其复杂的问题, 设计权限系统第一个要解决的问题就是什么样的行为是需要权限控制,什么样的是业务方法。他们之间本来是没有明确的区分,任何权限从某种角度上说可以是一种业务方法。为了以后管理和开发方面我们从概念上需要将权限和业务明确划分清楚,指导开发。

权限控制行为: 对What(Which)进行How的 *** 作需要区分Who,具有Who身份差异性和可替换性。 我们将此类 *** 作作为权限。

特点: 可以收回也可以分配的,具有一定的抽象级别。 消耗资源,行为结果具备一些持久性的影响。

业务逻辑行为: 对What(Which)进行How的 *** 作的时候与Who的身份无关或者具有Who身份差异性但 是不具有可替换性。

特点: 不能抽象和共享,很难回收和分配。不消耗资源,不产生持久性。现实中也存在某一时期行为是业务逻辑,最后演变成权限控制,或者相反的过程。

1、粗粒度权限设计

采用自主型访问控制方法, *** 作给予访问控制列表。每一个用户通过角色获得一组权限集合,权限系统的功能是验证用户申请的权限(集合)是否在这个集合当中,即申请的权限(集合)是否投影在用户拥有的权限集合,换句话说:只要某用户直接或者间接的属于某个Role那么它就具备这个Role的所有权限许可。

一个自主型访问控制方法的权限系统包括以下几个部分:角色、权限、访问控制表、

(1)权限

描述一个权限可以通过以下几个要素说明:

类型(class):

名称(name):

动作(actions):

掩码(mask):

属性:

具体权限Example:

1、Test

类型(class):comyangjssecutiry permissions TestPermission

名称(name):如:test ,testsub ,testsub1sub2

动作(actions): brower_detail ,post,repost,……

掩码(mask):0x1,0x2,0x4…

属性: 无

…………

l 存取控制器(my--aclxml)配置

存取控制项(ACE):角色到权限的映射集合,表示某个角色可以在某些资源上执行某些动作,它们之间通过role关联(继承),ACE之间产生包含关系。

存取控制列表(ACL):ACE的集合。

我们的存取控制器(ACL)是通过一个xml的配置文件说明,存取控制列表由多个存取控制项(ACE)来描述。使用方法(略)

2、细粒度权限设计

细粒度授权需要上下文的支持,而且每个权限控制的上下问题都不一样,这由相关的业务逻辑决定,而且此类授权一般变化较快,应此需要将强的可维护性和扩展性,支持变化,但又不能够太复杂,否则缺乏可执行性。虽然此类权限个性化较强,我们仍然可以总结出很多共性:

(1) 几乎所有的授权需要用户的角色和ID

(2) 特定的上下文几乎都同用户资源使用情况相关

我们将此类信息称为UserState 即:User角色以及资源使用情况和当前状态。大部分信息我们在用户登陆的时候已经。获得。授权贯穿Web层和Biz层,因此我们的登陆要独立于Web端。因此上下文我们可以用UserState结合其他来抽象。

关于上下文的维护问题,我们不可能将UserState此类参数在Web层和Biz层来回传递,更加不能在需要授权的地方都加上一个这样的方法参数,这样不太现实。其次如果在授权的地方再从数据库中取一次这样虽然能够解决部分问题(不能解决userId的传递),这样效率太低,不能接受。

解决方法就是将此类信息cache起来,用的时候再去取,由于此类信息具有非常高的并发性,对线程安全较高,因此我们决定将此类信息放入一个线程上下文的内存cache中。此外我们由于引入cache,就需要解决所有cache共有的维护性问题。

Cache的生命周期:用户的一次请求,属于线程级,用户请求线程结束,Cache结束。

Cache的更新:当上下文信息发生变化是需要及时更新Cache,这是一个不可避免的步骤。

Cache丢失:发生在如系统down机,线程崩溃,内存溢出等等,对用户来说就是当前请求突然中断。

当用户重新发送请求,我们的系统就需要重新验证用户,此时我们可以更新Cache解决丢失问题。

Cache的清理:这个实现就是当用户请求结束,返回应答的时候清理,可以通过Filter实现,比较简单。

以上是相关的原理部分,我们看看系统地实现:

实现:线程上下文的cache

实现类:comyangjscacheThreadContextCache:

public class ThreadContextCache {

public static Map asMap();

public static boolean containsKey(Object key);

public static boolean containsValue(Object key);

public static Object get(Object key);

public static void put(Object key, Object value);

public static Object remove(Object key);

public static void clean();

public static int size() ;

public static void destroy()

这个有两种做法

session的信息不要使用原生session, 信息存放在redis中, 每次修改之前触发修改redis的内容

因为要做权限控制, 所以你肯定是要有一个filter的, 那么就可以在filter中, 每次pre之前, 现根据session中的userid, 动态的去数据库中查询一遍权限, 然后塞入session中

数据库设计,设计如下:

用户:user

角色:role

用户-角色:user_role

资源:resource(包括上级菜单、子菜单、按钮等资源)

角色-资源:role_resource

标准的权限管理系统设计为以上5张表。

注:用户、用户-角色我就不做说明了,这两个是很简单的两块,用户的crud,以及为用户分配角色(多对多的关系)稍微琢磨一下就清楚了,下面都是针对为角色分配权限的实现

后台实现

展示层采用ztree树

以上就是关于javaweb权限管理,用户的权限数据该存放在哪里全部的内容,包括:javaweb权限管理,用户的权限数据该存放在哪里、java高手来 关于权限问题、java权限设计等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9494890.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存