如何向JAX-RS服务添加动态授权?

时间:2018-03-26 15:34:45

标签: authorization jax-rs jersey-2.0 tomcat8

我正在尝试通过添加授权来保护REST服务。例如,允许所有客户拨打/rest/{custno}/machines/{machno},但他们只能看到他们拥有的机器。

我看到有@RolesAllowed之类的注释,但在这种情况下无效。

我尝试过使用拦截器,这似乎可以在Websphere8.5上运行,但是不能在Tomcat 7或8上运行。拦截器能够从会话和路径获取客户信息,并确保它们是相同的或者用户具有管理员权限。能够使用注释生成概述以查看每个服务的安全性是非常好的。

解决此类问题的典型方法是什么?

1 个答案:

答案 0 :(得分:1)

您应该使用 / 来提供

  1. 架构
  2. 政策语言(XACML或
  3. 查询授权的请求/响应协议。
  4. 让我们从政策开始。

      

    例如,允许所有客户呼叫/休息/ {custno} / machines / {machno},但他们只能看到他们拥有的机器。

    在伪政策中,使用ALFA,这将成为

    /**
     * Control access to machines
     */
    policyset machines{
        target clause objectType == "machine"
        apply firstApplicable
        /**
         * View machines
         */
        policy viewMachines{
            target clause actionId == "view"
            apply firstApplicable
            /**
             * Users are only allowed to see the machines which they own.
             */
            rule usersCanViewTheirOwnMachines{
                permit
                condition machine.owner == username
            }
        }
    }
    

    这种方法的好处是你不需要为此编写任何代码。所有授权逻辑都在策略内完成。

    现在,让我们谈谈架构。你需要:

    1. 拦截器或策略执行点(PEP),在您的情况下,它将是JAX-RS过滤器或拦截器。拦截器将调用授权服务来验证策略。
    2. 授权服务,也称为策略决策点(PDP),它将根据您所知道的政策处理您发送的请求,例如您刚刚撰写的政策。
    3. 补充阅读