Spring Security ACL 看起来非常强大,并且当您可以坚持使用它们的数据库实现时,它很容易实现。但是,当您必须实现自己的 Acl 和 AclService 时,它似乎变得更加复杂(例如,参见这个(旧)very basic tutorial 仅约 26 页)和似乎很难找到它的引用资料和示例(该教程来自 2008 年)。
例如,在我们的应用程序中,用户具有角色并属于部门。大多数时候,他们被允许根据他们的角色对属于他们部门的对象执行一些操作。在所有情况下,部门 + 角色足以决定是否应授予用户对特定对象的特定操作。
用户、角色和部门由外部应用程序管理,当用户连接时我们会从该应用程序中检索它们(我们使用的是 REST 服务,但它也可以是 LDAP 服务器)。
我们希望依靠 @PreAuthorize('hasPermission(…)') 来实现域对象安全性。因此有两种解决方案:
PermissionEvaluator 来完成整个检查;或AclService 来实现 ACL,它构建了 ACL 正常工作所需的对象结构。似乎实现整个 AclService 会比实现 PermissionEvaluator 更困难和更复杂,但 ACL 似乎更标准。
您应该根据哪些标准实现其中一个?
最佳答案
PermissionEvaluator 负责表达式评估以确定用户是否拥有给定域对象的权限。另一方面,AclService 提供了一个用于检索Acl 实例的接口(interface)。本着 Separation of concerns 的精神每个组件解决一个单独的问题。
如果任何 PermissionEvaluator 实现需要基于 Acl 实例执行评估,它应该委托(delegate)给 AclService 来检索它们。实际上 AclPermissionEvaluator 正是这样做的。
我建议你走这条路。将评估与 ACL 检索分开。如果 Spring AclService 和 Acl 的概念对于您的用例来说过于复杂或复杂,您可以引入自己的服务来检索自定义 ACL。然后实现 PermissionEvaluator 将委托(delegate)给您的 ACL 服务。
实际上,我不得不做类似的事情,因为我需要将 ACL 存储在 NoSQL 数据库中,而 Spring 提供的对我不起作用。
我想说的是调整 Spring ACL 以满足您的要求所需的努力以及实现自定义解决方案所需的努力。如果您的要求可以通过默认的 Spring ACL 实现来满足,那就去做吧。它肯定会节省您实现自定义解决方案的时间。但是,如果无法根据您的要求调整 Spring ACL 或者太难了,那么实现您的自定义解决方案会更容易。
关于spring - 我应该什么时候在我的应用程序中实现 Spring Security ACL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26549389/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返