【发布时间】: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