XCommunity权限控制和配置体系

本文介绍了一种改进的权限管理系统,该系统通过权限控制项(ControlItem)实现更灵活、精确的权限配置。文中详细解释了如何定义和配置这些控制项,以适应复杂场景,如用户在自己发起的话题中修改回复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、问题

我们知到一般说到权限管理配置,最常见的就是这样的形式:

in:某人、某事

out:允许或拒绝。

更强大一些无非加入用户组的概念,某用户组的人,某事。

但实际上,在稍微复杂的系统中,这样的模式是很糟糕的,比如说论坛。

 

比如说,我要定义一个这样的权限:

用户可以在自己发起的话题中修改自己发布的回复。

这里的某人是针对任何人的,而某事是:“在自己发起的话题中修改自己发布的回复”,最后控制级别是允许。

 

这里面有两个问题:

1、某人和某事是紧密联系在一起的,某事是针对特定的人的。而在传统的模式中,这两者是分开的,操作发起方应告诉权限控制系统完整的某事,即操作方还必须去判断这个是不是自己的话题和回复。

2、这个某事可以由几个基本条件组合出非常多的变化,不可能一开始都想到。

 

为了便于理解,我还是啰嗦两句,说明传统的方式会遇到多大的麻烦:

因为传统的权限控制方式只是简单的接受两个参数(某人,某事)然后查权限控制表,组合一下权限控制级别(Deny > Allow),然后告诉我们,你可不可以这么做。

那么,当用户点击修改按钮的时候,这个按钮必须自己判断出来,这个用户是不是在修改自己发表的回复,以及是不是在自己发起的话题里,然后告诉权限控制系统,这个用户正“在自己发起的话题中修改自己发布的回复”或者正“在不是自己发起的话题中修改自己发布的回复”或者。。。。。。

这样的组合我们不知道有多少种。

然后权限控制系统根据如此这些信息,查表得出结论,可以这么做。

 

所以,这种权限管理方式是不现实的。

 

2、权限项(ControlItem)

XCommunity的权限配置体系最小的配置项是权限控制项(ControlItem)。其定义为:

 

1public interface IControlItem
2{
3
4  bool IsSatisfied( IPrincipal user, string verb, params object[] frameObjects );
5
6  EntryControlType ControlType { get; } 
7
8  string Name { get; } 
9
10}
 
11

一个权限控制项就如同刚才我描述权限的那一个陈述句一样:“用户可以在自己发起的话题中修改自己发布的回复”。

将这个陈述句拆分成两个部分:“用户在自己发起的话题中修改自己发布的回复”,“可以”。

即条件(Condition)和控制类别(允许或拒绝)。

IsSatisfied方法用于判断当前是不是“用户在自己发起的话题中修改自己发布的回复”。

ControlType属性则告诉权限管理系统,如果是,则“可以”。

 

IsSatisfied方法的参数用于描述当前的情况(instance),使用了一个主谓宾结构来描述:

user,发起者,主语

verb,动词,谓语

frameObjects,所涉及到的框架对象,宾语。

 

这个结构中的核心是verb,动词。动词决定了宾语的结构,XCommunity预定义的动词与宾语结构的关系如下:

verb动词描述BoardFrameTopicFramePostFramePublishedDocument
ModifyPost修改一个帖子 帖子所属的话题被修改的帖子 
DeletePost从话题删除一个帖子 帖子所属的话题被删除的帖子 
ModifyTopicTitle修改话题的标题话题所在的版面被修改的话题  
DeleteTopic从版面删除一个话题话题所在的版面被修改的话题  
LaunchTopic在版面发起一个话题发起话题的版面  用于发起话题的文档
AttachTopic加入一个话题的讨论 被参与的话题 用于发表回复的文档

 

BoardFrame、TopicFrame、PostFrame、PublishedDocument统称为框架对象(FrameObject)。frameObjects参数包含了所有相关的框架对象,由于在每一种宾语结构中,每个类型的对象都只有一个,所以用OfType方法来找出需要的框架对象。

 

用于描述“用户可以在自己发起的话题中修改自己发布的回复”的权限控制项的实现就可以是这样的:

 

1public class AllowModifyOwnResponseInOwnTopic : IControlItem
2{
3  public bool IsSatisfied( IPrincipal user, string verb, params object[] frameObjects )
4  {
5    if ( verb != "ModifyPost" )
6      return false;
7
8    var topic = frameObjects.OfType<ITopicFrame>().Single();
9    if ( !user.Identity.IsMySelf( topic.Meta.Launcher ) )
10      return false;
11
12    var post = frameObjects.OfType<IPostFrame>().Single();
13    if ( post.IsTheme )
14      return false;
15
16    if ( !user.Identity.IsMySelf( post.Author ) )
17      return false;
18
19    return true;
20
21  }
 
22
23  public EntryControlType ControlType
24  {
25    get { return EntryControlType.Allow; }
26  }
 
27
28  public string Name
29  {
30    get { return "AllowModifyOwnResponseInOwnTopic"; }
31  }

32}
 
33
34

 

这样,所有已想到和没想到的权限设置都可以用一个个的类型来描述了。

3、配置

但是如果所有的权限控制项都用代码来实现,是不现实的。所以,同样的,权限控制项可以通过XML文件来配置。

一个权限控制项典型的配置如下:

 

<control-item>
  
<condition verb=”DeletePost” />
  
<control-type>Deny</control-type>
</control-item>

 

 

其中condition元素对应为IsSatisfied方法,control-type则对应ControlType属性。该控制项表示任何情况下都禁止删除帖子的操作。

<condition>元素主要有两种配置方案:

设置一个类或者方法来处理,如:

<condition type=”XCommunity.Forums.Users.ControlConditions.ModifyOwnResponse” />

<condition method=”XCommunity.Forums.Users.ControlConditions.IsModifyOwnResponse” />

 

直接通过XML来配置一系列条件的组合,如上例的“用户可以在自己发起的话题中修改自己发布的回复”可以如此设置:

<control-item>
  
<condition verb=”ModifyPost” >
    
<topic launcher=”#current-logged” >
    
<post theme=”false” author=”#current-logged” >
  
</condition>
  
<control-type>Allow</control-type>
<control-item>

 

其中的topic和post会自动对应为frameObjects中的ITopicFrame对象和IPostFrame对象。当然,如果要对自定义类型的对象进行条件判断,也可以透过简单的语法实现:

<condition verb=”AttachTopic” >
  
<frame-object type=”MyTopic” >
    
<property name=”locked” value=”false” />
  
</frameObject>
</condition>

 

condition元素可以包含多个条件,各个条件之间都是与的关系,如果某个条件因为某些原因无法判断,例如找不到指定类型的对象,则直接判否。

 

4、控制组

权限控制项的粒度是很小的,很多时候我们需要设置一批权限控制项,所以我们需要将一些权限控制项组合在一起加以管理,这就是权限控制组,同样用XML文件来配置:

<control-group name=”DemoGroup” >

  
<control-item>
    
<condition verb=”ModifyPost” >
      
<topic launcher=”#current-logged” >
      
<post theme=”false” author=”#current-logged” >
    
</condition>
    
<control-type>Allow</control-type>
  
<control-item>

  
<control-item>
    
<condition verb=”AttachTopic”>
      
<frame-object type=”MyTopic”>
        
<property name=”locked” value=”false” />
      
</frameObject>
    
</condition>
  
</control-item>

</control-group>

 

但有时候同一个权限项可能被多个组包含,为了避免重复代码,所以还支持这样的语法。

<control-item name=”AllowModifyOwnResponseInOwnTopic” >
  
<condition verb=”ModifyPost” >
    
<topic launcher=”#current-logged” >
    
<post theme=”false” author=”#current-logged” >
  
</condition>
  
<control-type>Allow</control-type>
<control-item>

<control-group>
  
<control-item ref=”AllowModifyOwnResponseInOwnTopic” />
</control-group>

 

同样的,控制组也可以命名,并且被包含于其他控制组内。

权限控制组和控制项的定义都必须包含在授权配置元素(authorities)内。不包含在任何权限控制组内的权限控制项和组定义必须是命名的(name属性是必须的),而在控制组内的内联定义则不能命名(不能有name属性),即authorities的直接子元素的control-item和control-group是必须具备name属性的,而control-group内的control-item和control-group则是不能有name属性的。

内容概要:本文深入探讨了金属氢化物(MH)储氢系统在燃料电池汽车中的应用,通过建立吸收/释放氢气的动态模型热交换模型,结合实验测试分析了不同反应条件下的性能表现。研究表明,低温环境有利于氢气吸收,高温则促进氢气释放;提高氢气流速降低储氢材料体积分数能提升系统效率。论文还详细介绍了换热系统结构、动态性能数学模型、吸放氢特性仿真分析、热交换系统优化设计、系统控制策略优化以及工程验证与误差分析。此外,通过三维动态建模、换热结构对比分析、系统级性能优化等手段,进一步验证了金属氢化物储氢系统的关键性能特征,并提出了具体的优化设计方案。 适用人群:从事氢能技术研发的科研人员、工程师及相关领域的研究生。 使用场景及目标:①为储氢罐热管理设计提供理论依据;②推动车载储氢技术的发展;③为金属氢化物储氢系统的工程应用提供量化依据;④优化储氢系统的操作参数结构设计。 其他说明:该研究不仅通过建模仿真全面验证了论文实验结论,还提出了具体的操作参数优化建议,如吸氢阶段维持25-30°C,氢气流速0.012g/s;放氢阶段快速升温至70-75°C,水速18-20g/min。同时,文章还强调了安全考虑,如最高工作压力限制在5bar以下,温度传感器冗余设计等。未来的研究方向包括多尺度建模、新型换热结构智能控制等方面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值