问题标签 [declarative-security]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
3869 浏览

.net - .NET 声明式安全:为什么 SecurityAction.Deny 无法使用?

我已经搞砸了大约一天半,现在筛选.NET反射器和MSDN文档,但什么都想不出来......

在 .NET 框架中,您可以要求当前的 Principal 属于一个角色,以便能够通过标记这样的方法来执行方法:

我正在使用已经定义了“ReadOnly”角色的现有安全模型,因此我需要执行与上述完全相反的操作...如果用户处于“ReadOnly”角色中,则阻止 Save() 方法。没问题,对吧?只需将 SecurityAction 翻转为 .Deny:

好吧,事实证明这根本没有任何作用。该方法仍然运行良好。似乎 PrincipalPermissionAttribute 定义了:

但是,当属性设置为 SecurityAction.Deny 时,永远不会调用此方法,因此永远不会创建 IPermission 对象。有谁知道让 .Deny 工作的方法?我一直在尝试制作自定义安全属性,但即使这样也行不通。我试图变得棘手并做:

请注意,我的属性构造函数始终传递 SecurityAction.Demand,这是以前可以使用的一个操作。然而,即使在这种情况下,CreatePermission() 方法仍然只在属性设置为 .Demand 时才被调用,而不是 .Deny!也许运行时实际上是检查属性而不是传递给 CodeAccessSecurityAttribute 构造函数的 SecurityAction?

我不确定这里还有什么可以尝试的……有人有什么想法吗?您不会认为基于角色拒绝方法访问会那么难,而不仅仅是要求它。让我感到非常不安的是,默认的 PrincipalPermission 从 IDE 中出现,就像执行 .Deny 一样很好,而且 MSDN 文档中有一个 1-liner 暗示它不起作用。如果指定了 .Demand 以外的任何其他内容,您会认为 PrincipalPermissionAttribute 构造函数会立即抛出异常,因为这可能会造成很大的安全漏洞!如果我没有进行单元测试,我永远不会意识到 .Deny 什么都不做!

同样,所有这一切都源于必须处理具有“只读”角色的现有安全模型,该角色需要被拒绝访问,而不是相反,我只授予对角色的访问权限。

谢谢你的帮助!


快速跟进:

我实际上可以通过这样做使我的自定义属性起作用:

并装饰方法:

但这非常难看,因为我在同一个属性中同时指定了 Demand 和 Deny。但它确实有效......

另一个有趣的注意事项:我的自定义类扩展了 CodeAccessSecurityAttribute,而后者又只扩展了 SecurityAttribute。如果我让我的自定义类直接扩展 SecurityAttribute,那么什么都不起作用。因此,运行时似乎肯定只在元数据中寻找 CodeAccessSecurityAttribute 实例,并且对指定的 SecurityAction 做了一些有趣的事情,即使自定义构造函数覆盖它也是如此。

0 投票
1 回答
69 浏览

java - DD段落混淆中的认证类型

谁能告诉我为什么以下段落不正确:

如果您的部署描述符正确地声明了 BASIC 身份验证类型,则容器会在用户启动新会话时自动请求用户名和密码。

0 投票
1 回答
249 浏览

.net - .NET 3.5 中方法的声明性安全性 - 如何锁定方法的权限?

我正在使用.NET 3.5。假设我有一个访问特定文件和特定注册表项的方法。我想添加限制该方法的声明性安全定义,以便它只能访问指定的文件和注册表项,而不能访问其他任何内容。

当我尝试:

...它让我读取文件路径,但不是注册表项 - 我得到一个安全异常。

如果我使用:

...它可以让我读取文件和注册表项,还可以让我访问其他文件。

我是否遗漏了一些关于如何使用这些方法来实现这种效果的信息?

编辑:

我用来访问注册表项的代码是:

因此许可声明是:

谢谢。

0 投票
1 回答
3406 浏览

jakarta-ee - Java EE 声明性安全性,无法为 JDBC 领域用户加载组

这是我在这里的第一篇文章。关于声明式 Java EE 安全性,我有两个问题:(1) 基于文件的身份验证和 (2) 基于 DB 的身份验证。我为这两个问题附上了配置的相关部分。我在 Glassfish 3.1.1 上运行代码。也提前感谢您的帮助。

我也在寻找我的问题的答案,并找到了一些有用的例子,我也把它们放在了消息的底部。我尝试关注它们,以便配置的当前状态可以包含这些示例的详细信息,但它们并没有解决问题。

- 如果勾选了“默认主体到角色映射”,则基于文件的身份验证可以正常工作,否则即使将主体添加到映射中,它也不起作用。我可能以不正确的方式配置了一些东西。

-基于数据库的身份验证。就授权而言,它不起作用,因为无法读取组名。请参阅下面的详细信息。身份验证工作正常,即用户被识别。我什至尝试重命名表格以避免与 Glassfish 的一些内部内容发生潜在的名称冲突......

(1)基于文件的身份验证: 文件领域,2个用户:用户,管理员添加并分配给组:用户和管理员(configurations/server-config/security/realms/file -> Manage Users)

配置/服务器配置/安全默认主体到角色映射“已勾选”->它可以工作默认主体到角色映射“未勾选”->即使将其添加到安全映射中它也不起作用。


没有默认主体映射的记录错误:

  1. 没有映射到角色 [用户] 的主体。
  2. 没有映射到角色 [admin] 的委托人。

没有默认主体映射的记录错误: 1. 没有映射到角色 [用户] 的主体。2. 没有映射到角色 [admin] 的委托人。


(2)基于数据库的认证:

Realm 在 web.xml 中将上述领域更改为 jdbcRealm

  • 1)mn(用户和组表之间的多对多关系)

    SEC1111,无法为 JDBC 领域用户 [tamas] 加载组。

  • 2) 1-n 相同(用户和组表之间的一对多关系)

    SEC1111,无法为 JDBC 领域用户 [tamas] 加载组。

  • 3) 组名与用户名和密码在同一个表中

    SEC1111,无法为 JDBC 领域用户 [tamas] 加载组。

领域配置:( 我也尝试将“分配组”留空或填写“默认”,但结果是一样的。)

mn关系的DB ER图:

必须省略图像,但作为补偿 :-) 您可以在下面找到 SQL 脚本。

我在这里复制了一些有趣的谷歌链接,这些链接对我很有帮助。原来,我跟着第二个。也许其他人也会发现它们很有用。

感谢您到目前为止的阅读。最良好的祝愿,

塔马斯



第 2 部分 感谢您的回复。我创建了 2 个具有一对多关系的新表用户和组。在领域配置页面上,我为用户名、密码和组设置了表名和列。马特的评论也与链接一致(见下文我不能在这里发布)

[...] 这里有趣的部分是,对于用户表和组表,我使用 v_user_role 作为属性的值。v_user_role 是一个包含用户和组信息的数据库视图。我没有直接使用用户表的原因是因为 glassfish 假设用户表和组表都包含一个包含用户名的列,这会导致重复数据。[...]

出现同样的错误。我还尝试将主键放在组表中的 groupid 列上,但从问题的角度来看,我没有遇到任何变化。有趣的是,我尝试对 1 个用户名、密码、组所在的表执行相同操作,并且出现相同的错误。



走向解决方案和解决方案

来自 Matt 的评论帮助很大,感谢这篇精彩的帖子。综上所述,在我写关于基于数据库的身份验证的问题时,很明显无法加载用户组。server.log 中的错误消息表明了这一点。

然而,我的怀疑转向了表和它们的列名之间的链接。然而,在简化了用户组实体的数据模型后,我无法解释为什么即使使用包含用户、密码和组的简单表也无法工作。我继续朝这个方向进行调查。我假设列名也会影响这一点。当我应用马特的配置时,“无法加载组”消息从 server.log 中消失了,但现象仍然存在。因此,我假设这些组可能已经加载,但也存在不同的问题。然后我采用了马特的配置并开始逐步更改列名以接近原始配置,但“无法加载组”消息没有出现在日志中。当我用我的原始设置重现这个案例并且日志消息不存在时,我知道日志记录有问题,它已经以某种方式被关闭了。所以我开始调查整个配置。

当我查看已部署的应用程序时,我选择了部署描述符并将它们加载到 glassfish 控制台上。web.xml 没问题,它和我写的内容一样,但是glassfish-web.xml 的内容完全不同!它的生成就像我没有 glassfish-web.xml 一样。然后我注意到我的 glassfish-web.xml 没有放在 WEB-INF 目录中. 我将它移到那里并进行了“全部清理,构建”并部署了应用程序。之后我回到了 db 视图,它以多对多的关系表示 TBLUSERS 和 TBLGROUPS 之间的数据。我最喜欢这个解决方案,因为它从数据的角度显示了最清晰的画面。我在领域配置页面上设置了适当的列。我用两个用户“tamas”和“arpi”对其进行了测试。“tamas”被添加到用户和管理员组,同时“arpi”被添加到用户组。角色和用户组之间的映射在 glassfish-web.xml 中。授予“tamas”对用户和管理员资源的访问权限,而“arpi”仅获得对用户资源的访问权限。

感谢您的帮助。塔马斯

0 投票
0 回答
186 浏览

jakarta-ee - Java EE 声明式安全性,从应用程序客户端获取对安全 bean 的引用

关于 2 个问题,我想咨询您。

背景:我编写了一个测试、Java EE 应用程序并添加了声明式安全性。该应用程序部署在 Glassfish 3.1 上。对于单元测试,我将 JUnit 与嵌入式容器一起用于所有具有本地接口的 bean。对于应用程序的入口点 SessionFacde bean,它具有唯一的远程接口,我编写了一个简单的客户端来获取对 SessionFace bean 的引用。我只为 SessionFacade bean 应用了安全注释。

(问题 1:推荐的安全单元测试策略是什么?如果我为 sessionFacade 使用一个简单的应用程序客户端可以吗?(其他(本地)bean 不受影响,因为那里没有应用安全注释。))

问题2:我应该如何从应用程序客户端访问SessionFacde?如果您可以在此处复制 application-client.xml 的一些代码示例并获取对 JNDI 服务的引用,我将非常感激。这样可以节省我很多时间。这个问题类似于Java EE 6 Application Client login下的问题,但我找到了一个解释(http://docs.oracle.com/cd/E18930_01/html/821-2418/beacm.html),它不是真的推荐因为它将安全性负担重回开发人员而不是框架。请参阅以下文字:

“[...]程序化登录允许应用程序开发人员绕过 GlassFish Server 支持的身份验证机制,并将身份验证数据直接提供给安全服务。虽然很灵活,但如果不了解安全问题,则不应使用此功能。

由于这种机制绕过了容器管理的身份验证过程和顺序,因此应用程序开发人员必须非常小心地确保在访问任何受限资源或方法之前建立身份验证。验证登录尝试的状态并相应地更改应用程序的行为也是应用程序开发人员的责任。

程序化登录状态不一定会在会话中持续存在或参与单点登录。[...]"

感谢您到目前为止已阅读。亲切的问候,塔马斯

备注:由于我写了原帖后一直没有回应,我想说回答第二个问题就足够了。这将帮助我继续。谢谢, 塔马斯

0 投票
1 回答
1969 浏览

java - (isUserInRole()) 是将用户权限/安全性附加到 JSF 按钮的最简单方法吗?

我最近在 JSP 中开发了一个 tomcat Web 应用程序,它使用与公司的 Active Directory 相关联的声明性安全性 (server.xml/web.xml)。我被要求为这个刚刚起步的项目添加 JSF 支持。将登录表单转换为jsf是一件简单的事情,并且安全模型仍然有效。

一位同事问我是否可以允许更广泛的受众查看其中一个报告,但只为较小的群体呈现操作按钮。作为 JSF 的新手,我不得不做一些研究。

我花了大约四个小时在谷歌上搜索诸如“jsf 按钮安全”和“jsf 按钮权限”之类的东西,并尝试了各种建议,但这些建议大多是死胡同。另一位同事建议使用 Spring 安全模型,但如果有更简单的方法,我不想处理一大堆 Spring 库。

最终,我偶然发现了答案,这非常简单。我只需要使用 HttpServletRequest 方法:isUserInRole() 来确定当前登录的用户是否有权查看操作按钮。在过去的十年里,我经常使用 HttpServletRequests,但我不记得曾经学习过这种方法。有了jsf,到那个方法就很简单了,如下图:

我的问题具体是:关于这种方法我应该注意什么问题,还有另一种更简单的方法吗?

0 投票
1 回答
540 浏览

tomcat - 包含星号的声明性安全角色名称无法正常工作

我在 web.xml 中的声明性安全条目有问题。

下面的条目不允许我访问该页面,即使我是该组的成员*ADL - Education Group。我最终被定向到 login-noauth 页面。

我知道这应该可行——如果我将它更改为不同的组(如AT - Tech Support),它会很好用。我怀疑组名中的前导“*”并尝试在 web.xml 中使用 CDATA,但这没有用。我无法控制 Active Directory 条目,因此无法更改组的名称。其他带有破折号和空格的组名可以正常工作。

我已确认我是该组的成员*ADL - Education Group

这是在一个简单的 tomcat 6.0 服务器上。

有谁知道问题是什么以及如何解决?

0 投票
1 回答
775 浏览

unit-testing - 使用安全性对远程 EJB bean 进行单元测试

这个问题类似于Java EE 声明式安全性,从应用程序客户端获取对安全 bean 的引用,但更具体。

我可以使用 Glassfish 嵌入式容器对本地 bean 进行单元测试。对于远程 bean,我编写了应用程序客户端。在远程 bean 应用安全性之前,这是一个可行的解决方案。现在我遇到了向 Glassfish 3.1.1 验证应用程序客户端的问题。

现象:

  • 使用应用程序客户端在没有安全性的情况下测试远程 bean 是可以的。
  • 使用 ProgrammaticLogin 应用程序使用安全性的方法不起作用,我不确定它是否是解决单元测试问题的正确方法。(请参阅开头的附加链接。)

问题:

  • 您认为应该如何使用远程 bean 进行具有安全性的单元测试?
  • 需要将 glassfish-ejb-jar.xml 放在哪里?(在我的情况下这可能是错误的,这就是 ProgrammaticLogin 不起作用的原因。)