【问题标题】:How to implement permission control in java?java中如何实现权限控制?
【发布时间】:2011-11-04 13:31:30
【问题描述】:

我们开发了一个应用,需要实现权限控制,也就是说只能搜索到数据库中的特定记录:

  1. 员工只能搜索自己的记录。
  2. 主管可以查询下属的记录。
  3. 主管可以看到“批准”按钮批准申请
  4. 而工作人员只能提交申请。

我知道spring security,但实际上我们如何使用spring security来实现上面的功能呢?

我们可以用SQL实现权限控制,也就是先选择他的角色,然后再选择他下属的所有记录,如下:

select * from table where staffid in (.......)   

但这种方法似乎太原始了,而且难以维护。所以我的问题是:有没有什么框架和实践可以用来实现一个像样的权限控制机制?如何在应用中实现权限控制?

【问题讨论】:

    标签: java permissions spring-security


    【解决方案1】:

    1) 员工只能搜索自己的记录。 2) 主管可以查询下属的记录。

    这些似乎是您必须在 DAO 层实施的规则

    3) 主管可以看到“批准”按钮批准申请

    --这可以通过JSF中基于角色的UI渲染来完成

    4) 员工只能提交申请。

    Spring Security 方法拦截器可以在这里使用:http://static.springsource.org/spring-security/site/docs/3.0.x/reference/secure-object-impls.html

    【讨论】:

    • 你的意思是在DAO层控制访问吗?传一个主管,然后在 DAO 中做所有的事情?
    • 这些规则的性质似乎只能通过基于角色的查询结果过滤或直接限制查询来实现。我认为以后做会更有意义。
    • 感谢您的建议,好像权限控制有三种不同的类型,您有没有遇到过其他情况?
    • 您可以在 Web 应用程序的每一层提供安全性。对于保护服务调用等中间层,Spring Security 是一个很好的解决方案。您对每一层使用的内容取决于您的堆栈实现。您的开发堆栈是什么样的?
    • 你的意思是我应该在 DAO 层添加一个函数,比如:getApplicationsBySupervisorID(String id)?并用我自己的逻辑实现它?
    【解决方案2】:

    使用 postgres 数据库, 您可以从表中继承表。即:

    CREATE TABLE access{
      admin bool default false,
      supervisor bool default false,
      staff_user_id bigint default null,
       ...
    }
    CREATE TABLE flower(
      flower_id serial,
      name varchar(24)
    )inherits (access)
    

    然后您可以创建更新/删除触发器,并区分连接用户。

    这可能是一个解决方案。

    【讨论】:

      【解决方案3】:

      正如您所说,实体“角色”和“业务数据”必须在数据库中保持独立 - 您的选择查询可以加入角色表并仅选择适当的数据,而不是多次调用数据库。

      【讨论】:

        【解决方案4】:

        如果您还没有确定它太复杂,您可能应该查看Spring Security ACLs

        【讨论】:

          猜你喜欢
          • 2012-05-04
          • 2016-07-26
          • 1970-01-01
          • 2020-03-20
          • 1970-01-01
          • 1970-01-01
          • 2021-07-30
          • 2010-09-21
          • 2011-01-15
          相关资源
          最近更新 更多