JAX-RS:使用多个主体进行身份验证(不仅仅是用户名)

时间:2013-05-18 21:21:05

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

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

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

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

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

在这种情况下,

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

感谢。

2 个答案:

答案 0 :(得分:1)

您可以考虑。

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

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

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

  4. 您也可以使用CDI装饰器(example)来实现身份验证逻辑,但鉴于CDI采用率较低,这种情况会很奇怪。

  5. Personaly我会选择1或2,简单的情况和3的更高级的东西。

答案 1 :(得分:1)

(老问题!对新用户的回复)当您在问题中标记SHIRO时,您可以通过直接履行org.apache.shiro.realm.jdbc.JdbcRealm和@Override来添加自己的逻辑:
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 programatic auth。

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