我在注册过程中从用户那里得到了一些信息。我希望每个用户名都是唯一的。我称我的方法如下。
if(!nameRegister.isEmpty() && !surnameRegister.isEmpty()
&& !usernameRegister.isEmpty() && !emailRegister.isEmpty()
&& !passwordRegister.isEmpty() && !passwordConfirmRegister.isEmpty()){
if (passwordRegister.equals(passwordConfirmRegister)) {
isUsernameTaken = checkUsernameIsExist(nameRegister, surnameRegister, usernameRegister, emailRegister, passwordRegister);
if(!isUsernameTaken)
isMailAuthenticationSuccess = createUserWithEmailAndPassword(nameRegister, surnameRegister, usernameRegister, emailRegister, passwordRegister);
}else{
passwordConfirm.setError("Passwords does not match.");
passwordConfirm.requestFocus();
}
if(isMailAuthenticationSuccess)
saveUserToFirebase(newUser);
}
其内容如下。
private boolean checkUsernameIsExist(final String nameRegister, final String surnameRegister, final String usernameRegister, final String emailRegister, final String passwordRegister) {
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
DocumentReference docIdRef = rootRef.collection("users").document(usernameRegister);
docIdRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
isUsernameTaken = true;
Log.d(TAG, "Document exists!");
Toast.makeText(Register.this, "User name already taken", Toast.LENGTH_LONG).show();
} else {
Log.d(TAG, "Document does not exist!");
Toast.makeText(Register.this, "User can be taken", Toast.LENGTH_LONG).show();
}
} else {
Log.d(TAG, "Failed with: ", task.getException());
}
}
});
return isUsernameTaken;
}
private boolean createUserWithEmailAndPassword(final String nameRegister, final String surnameRegister, final String usernameRegister, final String emailRegister, String passwordRegister) {
auth.createUserWithEmailAndPassword(emailRegister, passwordRegister)
.addOnCompleteListener(Register.this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(!task.isSuccessful()){
email.setError("Mail is already taken");
email.requestFocus();
}else{
newUser = new User(nameRegister, surnameRegister, usernameRegister, emailRegister);
isMailAuthenticationSuccess = true;
auth.signOut();
startActivity(new Intent(Register.this, Login.class));
finish();
}
}
});
return isMailAuthenticationSuccess;
}
private static void saveUserToFirebase(User newUser) {
FirebaseFirestore firebaseFirestore = FirebaseFirestore.getInstance();
firebaseFirestore.collection("users").document(newUser.getUsername())
.set(newUser)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d(TAG, "User add success.");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.w(TAG, "user can not be added.", e);
}
});
}
方法无法向我的变量添加真布尔值。我想,addOnCompleteListener在为我的布尔值赋值时并没有结束。
但是,如果用户名控制后可以获得用户名,则用户身份验证成功,但不会写入Firebase。这可能是什么原因?我在等待您的帮助。
一个简单的建议是,您可以在设置isMailAuthentiation成功=true之前调用
createUserWitEmailAndPassword()
函数中的SaveUserToFirebase(newUser)
或者在内部调用该函数
if(! isUsernameTake){
isMailAuthenticationSuccess=createUserWithEmailAndPassword(姓名注册、姓氏注册、用户名注册、电子邮件注册、密码注册)
if(isMailAuthenticationSuccess)
saveUserToFirebase(newUser);]
那可能会解决你的问题。
或者你可以试试下面的代码
if(!nameRegister.isEmpty() && !surnameRegister.isEmpty() && !usernameRegister.isEmpty() && !emailRegister.isEmpty() && !passwordRegister.isEmpty() && !passwordConfirmRegister.isEmpty()){
if (passwordRegister.equals(passwordConfirmRegister)) {
checkUsernameIsExist(nameRegister, surnameRegister, usernameRegister, emailRegister, passwordRegister);
}else{
passwordConfirm.setError("Passwords does not match.");
passwordConfirm.requestFocus();
}
}
//checkUsernameIsExist
private void checkUsernameIsExist(final String nameRegister, final String surnameRegister, final String usernameRegister, final String emailRegister, final String passwordRegister) {
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
DocumentReference docIdRef = rootRef.collection("users").document(usernameRegister);
docIdRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
isUsernameTaken = true;
Log.d(TAG, "Document exists!");
Toast.makeText(Register.this, "User name already taken", Toast.LENGTH_LONG).show();
} else {
Log.d(TAG, "Document does not exist!");
Toast.makeText(Register.this, "User can be taken", Toast.LENGTH_LONG).show();
createUserWithEmailAndPassword(nameRegister, surnameRegister, usernameRegister, emailRegister, passwordRegister);
}
} else {
Log.d(TAG, "Failed with: ", task.getException());
}
}
});
}
// createUserWithEmailAndPassword
private void createUserWithEmailAndPassword(final String nameRegister, final String surnameRegister, final String usernameRegister, final String emailRegister, String passwordRegister) {
auth.createUserWithEmailAndPassword(emailRegister, passwordRegister)
.addOnCompleteListener(Register.this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(!task.isSuccessful()){
email.setError("Mail is already taken");
email.requestFocus();
}else{
newUser = new User(nameRegister, surnameRegister, usernameRegister, emailRegister);
saveUserToFirebase(newUser);
isMailAuthenticationSuccess = true;
auth.signOut();
startActivity(new Intent(Register.this, Login.class));
finish();
}
}
});
}
private static void saveUserToFirebase(User newUser) {
FirebaseFirestore firebaseFirestore = FirebaseFirestore.getInstance();
firebaseFirestore.collection("users").document(newUser.getUsername())
.set(newUser)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d(TAG, "User add success.");
Toast.makeText(Register.this, "User added successfully", Toast.LENGTH_LONG).show();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.w(TAG, "user can not be added.", e);
Toast.makeText(Register.this, "Couldn't add User. Try again later.", Toast.LENGTH_LONG).show();
}
});
}
将此方法调用"createUserWitEmailAndPassword",在成功的时候将此方法调用为"check UsernameIsExist",并确保返回类型无效。
我想知道socket.io身份验证的最佳实践是什么。 Alice发出事件'message',参数包括Bobs、唯一标识符等。Bob在监听Socket.on('message')事件时接收消息。
于是我在这里看到:https://firebase . Google . com/docs/auth/web/account-linking # link-auth-provider-credentials-to-a-user-account现在可以在Firebase中链接用户账号了。我还看到Firebase提供了匿名认证的功能,它为一个用户创建一个用户会话,不需要任何凭证。 在我们的应用程序中,
我已经实现了keycloak用户存储SPI流。它针对外部源进行身份验证。Keycloak是用外部存储属性更新的,如果它在getUserByUsername方法中更新,它就可以工作。 我正在isValid方法中验证userValidation,并更新UserModel和LocalHashMap中的userAttributes。 从日志中,我看到UserStoreProviderFactory创建了两
我的管理员控制器扩展了控制器类,在那里我使用方法加载视图页面并传递保护。config/auth.php也通过添加管理员保护和提供程序进行了修改。在app/Actions/Fortify文件夹中,我添加了AttemptToAuthenticate和ReDirectIfTwoFactorAuthenticate类,并更改了命名空间。我的管理员控制器还扩展了Guard。用户的重定向中间件和管理员的重定向
我一直在寻找使用各种AWS服务来处理我们下一个主要项目的基础设施。我们开始研究EC2实例上的docker容器,但在进一步研究AWS Lambda之后,这似乎是一条值得探索的道路。 使用AWS Lambda范例,我们只需使用Lambda函数作为逻辑粘合剂,将数据和事件(来自其他AWS服务)保存在一起。 例如,如果我们产品的用户创建了一个新记录,AWS Lambda可以在该事件中触发,我们可以调用La
根据Spring Security,如果身份验证由外部身份验证提供者完成,则使用身份验证提供者。认证后,Spring Security将获得封装用户信息的认证对象。 如果Spring Security框架进行身份验证,则用户信息被封装在User接口的实例中(例如作为默认实现的User细节类)。 我的问题是——为什么Spring Security框架不能使用一致的方法?为什么他们不能在所有情况下使用