使用Jersey服务,使用多个用户名和密码对用户进行身份验证的最优雅方法是什么?比如,一个业务ID,用户名作为主体,密码作为唯一的凭证。
我有一个带有用户表的postgres数据库,多个商业实体可以存在相同的用户名字符串。 (唯一约束属于两列,业务ID和用户名一起)。
我使用基本身份验证,让客户端为业务ID发送额外的HTTP标头。我怎么从这里继续?
现在,关于授权,如果专门为每个业务实体创建角色,我将如何设置角色和权限(每个企业都可以定义自己的角色并将其连接到权限。)?权限是静态的。
在这种情况下,apache shiro(或任何其他可插入的安全扩展)是否提供解决方案?
感谢。
答案 0 :(得分:1)
您可以考虑。
在旧的servlet过滤器中实现auth逻辑。 JAX-RS应用程序只是普通的WWW应用程序,因此过滤器非常适合作为一种简单的授权机制。
JAX-RS拦截器(PreProcessInterceptor),您可以根据需要实现auth逻辑(调用数据库等)。使用JAX-RS时,这是“更惯用”。
使用Spring Security。如果您准备好学习一点Spring Framework,这是一个不错的选择。 Spring Security提供全功能的身份验证和访问控制机制,因此您可以实现您需要的任何功能。请注意,应用程序的其余部分不需要使用Spring。
您也可以使用CDI装饰器(example)来实现身份验证逻辑,但鉴于CDI采用率较低,这种情况会很奇怪。
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注释......还有更多