0

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

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

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

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

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

谢谢。

4

2 回答 2

1

你可以考虑。

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

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

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

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

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

于 2013-05-19T19:54:54.223 回答
1

(老问题!对新用户的回应)当您在问题中标记 SHIRO 时,您可以通过扩展和 @Override 添加自己的逻辑
org.apache.shiro.realm.jdbc.JdbcRealm

getRoleNamesForUser(...) , getPermissions(..), doGetAuthenticationInfo(..)
这是一个示例:

@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 注释的完整示例..还有更多

于 2015-05-16T20:58:27.510 回答