7.7.2. 实施 UserQueryProvider
如果不实施 UserQueryProvider,管理控制台将无法查看和管理我们的示例提供者加载的用户。我们来看一下实施此界面。
PropertyFileUserStorageProvider
@Override
public int getUsersCount(RealmModel realm) {
return properties.size();
}
@Override
public List<UserModel> getUsers(RealmModel realm) {
return getUsers(realm, 0, Integer.MAX_VALUE);
}
@Override
public List<UserModel> getUsers(RealmModel realm, int firstResult, int maxResults) {
List<UserModel> users = new LinkedList<>();
int i = 0;
for (Object obj : properties.keySet()) {
if (i++ < firstResult) continue;
String username = (String)obj;
UserModel user = getUserByUsername(username, realm);
users.add(user);
if (users.size() >= maxResults) break;
}
return users;
}
getUsers () 方法迭代属性文件的密钥集,委派为 getUserByUsername () 来加载用户。请注意,我们根据 第一个 结果和 maxResults 参数索引了这个调用。如果您的外部存储不支持分页,则您必须执行类似的逻辑。
PropertyFileUserStorageProvider
@Override
public List<UserModel> searchForUser(String search, RealmModel realm) {
return searchForUser(search, realm, 0, Integer.MAX_VALUE);
}
@Override
public List<UserModel> searchForUser(String search, RealmModel realm, int firstResult, int maxResults) {
List<UserModel> users = new LinkedList<>();
int i = 0;
for (Object obj : properties.keySet()) {
String username = (String)obj;
if (!username.contains(search)) continue;
if (i++ < firstResult) continue;
UserModel user = getUserByUsername(username, realm);
users.add(user);
if (users.size() >= maxResults) break;
}
return users;
}
searchForUser () 的第一个声明采用 String 参数。这应该是字符串,用于搜索用户名和电子邮件属性来查找用户。这个字符串可以是子字符串,这也是我们在进行搜索时使用 String.contains () 方法的原因。
PropertyFileUserStorageProvider
@Override
public List<UserModel> searchForUser(Map<String, String> params, RealmModel realm) {
return searchForUser(params, realm, 0, Integer.MAX_VALUE);
}
@Override
public List<UserModel> searchForUser(Map<String, String> params, RealmModel realm, int firstResult, int maxResults) {
// only support searching by username
String usernameSearchString = params.get("username");
if (usernameSearchString == null) return Collections.EMPTY_LIST;
return searchForUser(usernameSearchString, realm, firstResult, maxResults);
}
采用 Map 参数的 searchForUser () 方法可以根据第一个、姓、用户名和电子邮件搜索用户。我们只存储用户名,因此我们只根据用户名进行搜索。我们委派给 搜索ForUser ()。
PropertyFileUserStorageProvider
@Override
public List<UserModel> getGroupMembers(RealmModel realm, GroupModel group, int firstResult, int maxResults) {
return Collections.EMPTY_LIST;
}
@Override
public List<UserModel> getGroupMembers(RealmModel realm, GroupModel group) {
return Collections.EMPTY_LIST;
}
@Override
public List<UserModel> searchForUserByUserAttribute(String attrName, String attrValue, RealmModel realm) {
return Collections.EMPTY_LIST;
}
我们不存储组或属性,因此其他方法会返回一个空列表。