【问题标题】:JAX-RS: Authenticate with multiple principals (more than just username)JAX-RS:使用多个主体进行身份验证(不仅仅是用户名)
【发布时间】:2013-05-13 19:18:05
【问题描述】:

使用 Jersey 服务,除了用户名和密码之外,验证用户身份的最优雅方法是什么?比如说,一个企业 ID,用户名作为 Principals,密码作为唯一的凭证。

我有一个带有用户表的 postgres 数据库,多个业务实体可以存在相同的用户名字符串。 (唯一约束属于两列,Business id 和 username 一起)。

我使用基本身份验证,让客户端为业务 ID 发送额外的 HTTP 标头。我该如何从这里继续?

现在,关于授权,如果角色是专门为每个业务实体创建的(每个企业都可以定义自己的角色并将其连接到权限),我将如何设置角色和权限?权限是静态的。

apache shiro(或任何其他可插入的安全扩展)在这种情况下是否提供解决方案?

谢谢。

【问题讨论】:

    标签: java jakarta-ee jersey ws-security shiro


    【解决方案1】:

    你可以考虑。

    1. 在旧的 servlet 过滤器中实现身份验证逻辑。 JAX-RS 应用程序只是普通的 WWW 应用程序,因此过滤器非常适合作为一种简单的授权机制。

    2. JAX-RS 拦截器 (PreProcessInterceptor),您可以在其中根据需要实现身份验证逻辑(调用数据库等)。这在使用 JAX-RS 时“更惯用”。

    3. 使用Spring Security。如果您准备学习一点 Spring Framework,这是一个不错的选择。 Spring Security 提供了全功能的身份验证和访问控制机制,所以你可以实现你需要的任何东西。请注意,应用程序的其余部分不需要使用 Spring。

    4. 您也可以使用 CDI 装饰器 (example) 来实现身份验证逻辑,但鉴于 CDI 采用率仍然很低,这将是一种奇特的做法。

    我个人会选择 1. 或 2,用于简单的情况,而 3 用于更高级的情况。

    【讨论】:

    • 1 和 2 正是我试图避免的,必须在 servlet 过滤器中实现我自己的身份验证方法。但我想我别无选择。我找不到一种方法来“弯曲” Shiro/Spring 以满足我对身份验证和授权的要求。
    【解决方案2】:

    (老问题!新用户的回复)当您在问题中标记 SHIRO 时,您可以通过扩展
    org.apache.shiro.realm.jdbc.JdbcRealm
    和 @Override:
    getRoleNamesForUser(...) , getPermissions(..), doGetAuthenticationInfo(..)
    添加自己的逻辑br>这是一个例子:

    @Override
    protected Set<String> getRoleNamesForUser(Connection conn, String username) throws SQLException {
        Set<String> roleNames = new LinkedHashSet<>();
    
        Collection<UserRole> roles = /* Get roles from your DB, this example use  JPA entity, **but you put here any logic you want**...*/
        for(UserRole userRole:roles){
            roleNames.add(userRole.getRole().getName());
        }
        return roleNames; // return roles so Shiro is 'aware' of roles to add them to current user
    }
    

    *请注意,相同的逻辑适用于您覆盖的其他方法。
    ** 您不需要 2 个 http 调用来记录用户,您只需使用 Shiro 编程身份验证即可。

    这是一个启用了 Shiro 注释的Complete example..还有更多

    【讨论】:

      猜你喜欢
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      • 2018-09-08
      • 2018-01-25
      • 2014-08-30
      • 2012-12-03
      • 1970-01-01
      相关资源
      最近更新 更多