草庐IT

java - ejb有关角色和身份验证的安全性问题

coder 2024-03-05 原文

如果有人可以帮助我解决以下问题,我将不胜感激:

  • @RolesAllowed和@DeclareRoles批注之间有什么区别?
  • 我开发了一个登录功能来根据数据库中的信息检查用户名和密码。但是,我想问一下如何将角色分配给经过身份验证的用户,以与上述批注一起使用。
  • 最佳答案

    What are the differences between @RolesAllowed and @DeclareRoles annotations?


    @RolesAllowed批注用于指定实际上允许访问业务方法的角色列表。此注释的存在会影响EJB在运行时的行为,因为EJB容器会主动验证调用者是否处于允许的角色中。同样,可以在TYPEMETHOD上定义此批注,从而使您可以定义在类或方法级别上允许的角色列表。您可以在单个方法的级别覆盖类的所有方法所允许的角色列表。

    另一方面,@DeclareRoles注释仅用于声明角色列表。它等效于security-role-ref文件中的ejb-jar.xml元素。 EJB容器不需要了解这些角色即可对EJB的业务方法执行访问控制检查。相反,bean提供者/开发人员可以在isCallerInRole测试中使用这些角色,以确保程序安全性。

    EJB 3.1规范声明了有关@DeclareRoles注释的以下内容:

    17.2.5.3 Declaration of Security Roles Referenced from the Bean’s Code

    The Bean Provider is responsible for using the DeclareRoles annotation or the security-role-ref elements of the deployment descriptor to declare all the security role names used in the enterprise bean code. The DeclareRoles annotation is specified on a bean class, where it serves to declare roles that may be tested by calling isCallerInRole from within the methods of the annotated class. Declaring the security roles allows the Bean Provider, Application Assembler, or Deployer to link these security role names used in the code to the security roles defined for an assembled application. In the absence of this linking step, any security role name as used in the code will be assumed to correspond to a security role of the same name.



    问题的第二部分指出:

    I developed a login function to check username and password against information in the database. However, I'd like to ask how I can assign a role to an authenticated user to use with the above annotations.



    在这种情况下,需要指出的一般要点是,我的首选方法是不使用组合安全性,除非您的用例实际需要它。在大多数情况下,如果可以使用声明性安全性满足要求,则最好使用它,因为程序安全性要求您跟踪isCallerInRole方法调用,而没有这样的调用可能会导致安全漏洞。无论哪种情况,您都需要容器首先识别数据库中的组和主体,作为可能用于访问控制检查的角色。

    用简单的话来说,EJB客户端(一个Java SE应用程序,一个servlet或另一个EJB)必须首先根据容器的安全性机制对自己进行身份验证,以建立调用者的Principal。因此,成功使用声明性或程序性安全性取决于成功的身份验证过程。在您的情况下,您将需要配置容器以识别数据库中的组和用户,并将其转换为Principal对象,这些对象可用于以声明性或编程方式实现访问控制。为此,大多数容器都支持一种或多种JAAS登录模块。例如,Glassfish 3.1允许使用JDBCRealm进行此操作,而JBoss 6.0支持使用DatabaseServerLoginModule进行此操作。因此,您将需要确定您的容器是否支持这种登录模块,并将其配置为使用数据库。

    请注意,在某些情况下,容器提供的登录模块可能不足以满足您的需求。在这种情况下,您需要编写自己的登录模块(如果需要,请针对容器的接口(interface))。

    另外,您还需要将应用程序使用的角色映射到JAAS领域中的用户和组。例如,如果您的数据库由JAAS领域使用:
  • 包含用户U1U2U3U4U5以及
  • 包含组G1G2G3,分别包含U1U2U3
  • 和您的EJB允许角色R1R2R3(通过@RolesAllowed批注定义)的用户访问其方法

  • 那么您需要将角色映射到JAAS领域中的主体(用户和组)。即使角色名称与主体名称相同,也必须进行映射。 Glassfish simplifies this by supporting the default principal to role mapping将名称相似的主体(用户或组)直接映射到角色。另外,映射的过程是特定于容器的,并且您已经猜到了,该映射是在特定于容器的部署描述符中而不是在EJB部署描述符(ejb-jar.xml)中执行的。

    要完成答案,您需要为创建的每个用户分配一个角色。为了简单起见,您可以创建一个所有用户都可能属于的单个用户组。当用户针对JAAS领域对自己进行身份验证时,Principal对象将包含该组。然后,可以将JAAS领域中的组映射到EJB角色,并且可以在@RolesAllowed批注中指定角色名称。 EJB容器将阻止数据库中不在该组中的任何用户访问带注释的方法。

    关于java - ejb有关角色和身份验证的安全性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7219312/

    有关java - ejb有关角色和身份验证的安全性问题的更多相关文章

    1. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

      我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

    2. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

      我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

    3. java - 等价于 Java 中的 Ruby Hash - 2

      我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

    4. java - 从 JRuby 调用 Java 类的问题 - 2

      我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

    5. ruby - 如何安全地删除文件? - 2

      在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

    6. java - 我的模型类或其他类中应该有逻辑吗 - 2

      我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

    7. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

      什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

    8. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

      这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

    9. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

      HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

    10. 【Java入门】使用Java实现文件夹的遍历 - 2

      遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

    随机推荐