【问题标题】:Authenticating users in Spring MVC - several types of users (different classes)在 Spring MVC 中对用户进行身份验证 - 几种类型的用户(不同的类)
【发布时间】:2014-04-17 11:00:33
【问题描述】:

我正在使用 Spring MVC + Hibernate 组合开发 Web 应用程序。今晚我来了一个很大的“但是……”:

我有两种不同类型的用户,有很多不同的属性。也就是说,我希望应用程序能够验证多种类型的用户对象。前几天我以为这不会有问题,就写了一个BaseUser实体,和一个IUser接口,所以得到了:

RegularUser extends BaseUser implements IUser;

PremiumUser extends BaseUser implements IUser;

现在,出现了几个问题:我有这个interface UserService

public interface UserService {
    public boolean authenticateUser(IUser user);
}

这个接口的实现是否应该与 IUser 实现一样多? 当我想对用户进行身份验证时,如何在创建用户对象进行身份验证之前区分普通用户和高级用户?

我的目标是让应用程序选择正确的对象进行身份验证,因为在所有用户实现中不可能有两个同名的用户。我有点困惑。

一些额外的信息:

authenticate(IUser user) 方法的示例实现是:

@Service("regularUserService")
public class RegularUserServiceImpl implements UserService {

@Autowired
RegularUserDAOImpl userDAO;

@Transactional
public boolean authenticateUser(IUser user) {
    if (user == null || !(user instanceof RegularUser)) {
        return false;
    } else {
        String name = user.getName();
        String pass = user.getPassword();       
        RegularUser existingUser = userDAO.findByName(name);

        if (existingUser == null) {
            return false;
        } else {
            if (pass.equals(existingUser.getPassword())) {
                if (existingUser.getIsEnabled()) {
                    return true;
                }
            }
        }
    }
    return false;
}
...
}

如果我有一个等效的 PremiumUserServiceImpl 和相同的 authenticate() 方法,Spring 怎么知道要代理哪个(即选择哪个 UserService 实现)?

提前致谢, 丹。

【问题讨论】:

  • 您是否有任何理由不使用 Spring Security 来为您执行此操作?它会从字面上消除所有这些问题。您需要做的就是在您的用户上添加一个名为 enabled 的布尔字段并添加一组角色名称。看看 Spring Security 的身份验证,它是一个非常好的包

标签: java spring hibernate spring-mvc authentication


【解决方案1】:

在创建 用户对象进行身份验证?

好的,你有

@Service("regularUserService")
public class RegularUserServiceImpl implements UserService {
    .....
}

还有一个像:

@Service("premiumUserService")
public class PremiumUserServiceImpl implements UserService {
    .....
}

好的,但是 Spring 会发现不止一个 UserService 的实现,使用 @Primary 注释告诉 Spring 当存在多个匹配的 bean 实例时首选哪个自动装配候选者。 例如,如果您想将RegularUserService 设为之前,则在其上添加@Primary

@Primary
@Service("regularUserService")
public class RegularUserServiceImpl implements UserService {
    .....
}


另请参阅:

【讨论】:

  • 感谢您的回答。我昨天在阅读有关@Primay@Named 的信息,但我认为这并不能解决问题:Spring 只会使用@Primary 注释的实现。也许我的问题没有得到如此清楚的解释 - 我正在研究一个解决方案,如果我找到一个干净的解决方案,我会发布它以明确问题和答案。
猜你喜欢
  • 2017-04-07
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多