User Management - Consistent error handling within

AuthenticationManagerImpl
This commit is contained in:
Benjamin Barth committed 2016-02-02 16:31:12 +01:00
1 parent 6b0f89903a
commit 5730b9e3ab
7 files changed
+110 -99

No files matched your search

@@ -1,39 +0,0 @@
package com.sap.sse.security.ui.authentication;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sse.security.ui.client.i18n.StringMessages;
import com.sap.sse.security.ui.shared.SuccessInfo;
public class AsyncLoginCallback implements AsyncCallback<SuccessInfo> {
private final ErrorMessageView view;
private final AuthenticationCallback callback;
private final boolean fireSignInSuccessfulEvent;
public AsyncLoginCallback(ErrorMessageView view, AuthenticationCallback callback, boolean fireSignInSuccessfulEvent) {
this.view = view;
this.callback = callback;
this.fireSignInSuccessfulEvent = fireSignInSuccessfulEvent;
}
@Override
public void onSuccess(SuccessInfo result) {
if (result.isSuccessful()) {
if (fireSignInSuccessfulEvent) {
callback.handleSignInSuccess();
}
} else {
if (SuccessInfo.FAILED_TO_LOGIN.equals(result.getMessage())) {
view.setErrorMessage(StringMessages.INSTANCE.failedToSignIn());
} else {
view.setErrorMessage(result.getMessage());
}
}
}
@Override
public void onFailure(Throwable caught) {
view.setErrorMessage(StringMessages.INSTANCE.failedToSignIn());
}
}
@@ -1,6 +1,5 @@
package com.sap.sse.security.ui.authentication;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sse.security.ui.authentication.app.AuthenticationContext;
import com.sap.sse.security.ui.shared.SuccessInfo;
import com.sap.sse.security.ui.shared.UserDTO;
@@ -8,15 +7,20 @@ import com.sap.sse.security.ui.shared.UserDTO;
public interface AuthenticationManager {
void createAccount(String name, String email, String password, String fullName,
String company, AsyncCallback<UserDTO> callback);
String company, SuccessCallback<UserDTO> callback);
void reqeustPasswordReset(String username, String eMailAddress, AsyncCallback<Void> callback);
void reqeustPasswordReset(String username, String eMailAddress, SuccessCallback<Void> callback);
void login(String username, String password, AsyncCallback<SuccessInfo> callback);
void login(String username, String password, SuccessCallback<SuccessInfo> callback);
void logout();
void refreshUserInfo();
AuthenticationContext getAuthenticationContext();
public interface SuccessCallback<T> {
void onSuccess(T result);
}
}
@@ -1,13 +1,19 @@
package com.sap.sse.security.ui.authentication;
import static com.sap.sse.security.shared.UserManagementException.CANNOT_RESET_PASSWORD_WITHOUT_VALIDATED_EMAIL;
import static com.sap.sse.security.shared.UserManagementException.USER_ALREADY_EXISTS;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.web.bindery.event.shared.EventBus;
import com.sap.sse.security.shared.UserManagementException;
import com.sap.sse.security.ui.authentication.app.AuthenticationContext;
import com.sap.sse.security.ui.authentication.app.AuthenticationContextImpl;
import com.sap.sse.security.ui.client.UserManagementServiceAsync;
import com.sap.sse.security.ui.client.UserService;
import com.sap.sse.security.ui.client.UserStatusEventHandler;
import com.sap.sse.security.ui.client.WithSecurity;
import com.sap.sse.security.ui.client.i18n.StringMessages;
import com.sap.sse.security.ui.shared.SuccessInfo;
import com.sap.sse.security.ui.shared.UserDTO;
@@ -18,6 +24,9 @@ public class AuthenticationManagerImpl implements AuthenticationManager {
private final EventBus eventBus;
private final String emailConfirmationUrl;
private final String passwordResetUrl;
private final StringMessages i18n = StringMessages.INSTANCE;
private final ErrorMessageView view = new ErrorMessageViewImpl();
/**
* Creates an {@link AuthenticationManagerImpl} instance based on the {@link UserService} and
@@ -80,20 +89,62 @@ public class AuthenticationManagerImpl implements AuthenticationManager {
}
@Override
public void createAccount(String name, String email, String password, String fullName,
String company, AsyncCallback<UserDTO> callback) {
userManagementService
.createSimpleUser(name, email, password, fullName, company, emailConfirmationUrl, callback);
public void createAccount(final String name, String email, String password, String fullName,
String company, SuccessCallback<UserDTO> callback) {
userManagementService.createSimpleUser(name, email, password, fullName, company, emailConfirmationUrl,
new AsyncCallbackImpl<UserDTO>(callback) {
@Override
public void onFailure(Throwable caught) {
if (caught instanceof UserManagementException) {
if (USER_ALREADY_EXISTS.equals(((UserManagementException) caught).getMessage())) {
view.setErrorMessage(i18n.userAlreadyExists(name));
}
} else {
view.setErrorMessage(i18n.errorCreatingUser(name, caught.getMessage()));
}
}
});
}
@Override
public void reqeustPasswordReset(String username, String eMailAddress, AsyncCallback<Void> callback) {
userManagementService.resetPassword(username, eMailAddress, passwordResetUrl, callback);
public void reqeustPasswordReset(final String username, String eMailAddress, SuccessCallback<Void> callback) {
userManagementService.resetPassword(username, eMailAddress, passwordResetUrl, new AsyncCallbackImpl<Void>(callback) {
@Override
public void onFailure(Throwable caught) {
if (caught instanceof UserManagementException) {
if (CANNOT_RESET_PASSWORD_WITHOUT_VALIDATED_EMAIL.equals(caught.getMessage())) {
view.setErrorMessage(i18n.cannotResetPasswordWithoutValidatedEmail(username));
} else {
view.setErrorMessage(i18n.errorResettingPassword(username, caught.getMessage()));
}
} else {
view.setErrorMessage(i18n.errorDuringPasswordReset(caught.getMessage()));
}
}
});
}
@Override
public void login(String username, String password, AsyncCallback<SuccessInfo> callback) {
userService.login(username, password, callback);
public void login(String username, String password, final SuccessCallback<SuccessInfo> callback) {
userService.login(username, password, new AsyncCallback<SuccessInfo>() {
@Override
public void onSuccess(SuccessInfo result) {
if (result.isSuccessful()) {
callback.onSuccess(result);
} else {
if (SuccessInfo.FAILED_TO_LOGIN.equals(result.getMessage())) {
view.setErrorMessage(StringMessages.INSTANCE.failedToSignIn());
} else {
view.setErrorMessage(result.getMessage());
}
}
}
@Override
public void onFailure(Throwable caught) {
view.setErrorMessage(StringMessages.INSTANCE.failedToSignIn());
}
});
}
@Override
@@ -111,4 +162,25 @@ public class AuthenticationManagerImpl implements AuthenticationManager {
public AuthenticationContext getAuthenticationContext() {
return new AuthenticationContextImpl(userService.getCurrentUser());
}
private abstract class AsyncCallbackImpl<T> implements AsyncCallback<T> {
private final SuccessCallback<T> successCallback;
private AsyncCallbackImpl(SuccessCallback<T> successCallback) {
this.successCallback = successCallback;
}
@Override
public final void onSuccess(T result) {
this.successCallback.onSuccess(result);
}
}
private class ErrorMessageViewImpl implements ErrorMessageView {
@Override
public void setErrorMessage(String errorMessage) {
Window.alert(errorMessage);
}
}
}
@@ -66,7 +66,7 @@ public class AuthenticationPlaceManagementController extends WrappedPlaceManagem
if (placeToUse instanceof SignInPlace) {
return new SignInActivity(clientFactory, callback, placeController);
} else if (placeToUse instanceof CreateAccountPlace) {
return new CreateAccountActivity(clientFactory, callback, placeController);
return new CreateAccountActivity(clientFactory, placeController);
} else if (placeToUse instanceof PasswordRecoveryPlace) {
return new PasswordRecoveryActivity(clientFactory, placeController);
} else if (placeToUse instanceof LoggedInUserInfoPlace) {
@@ -1,22 +1,17 @@
package com.sap.sse.security.ui.authentication.create;
import static com.sap.sse.security.shared.UserManagementException.USER_ALREADY_EXISTS;
import com.google.gwt.activity.shared.AbstractActivity;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.place.shared.PlaceController;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.sap.sse.security.shared.UserManagementException;
import com.sap.sse.security.ui.authentication.AsyncLoginCallback;
import com.sap.sse.security.ui.authentication.AuthenticationCallback;
import com.sap.sse.security.ui.authentication.AuthenticationClientFactory;
import com.sap.sse.security.ui.authentication.AuthenticationManager.SuccessCallback;
import com.sap.sse.security.ui.authentication.confirm.ConfirmationInfoPlace;
import com.sap.sse.security.ui.authentication.confirm.ConfirmationInfoPlace.Action;
import com.sap.sse.security.ui.authentication.signin.SignInPlace;
import com.sap.sse.security.ui.client.component.NewAccountValidator;
import com.sap.sse.security.ui.client.i18n.StringMessages;
import com.sap.sse.security.ui.shared.SuccessInfo;
import com.sap.sse.security.ui.shared.UserDTO;
public class CreateAccountActivity extends AbstractActivity implements CreateAccountView.Presenter {
@@ -27,14 +22,11 @@ public class CreateAccountActivity extends AbstractActivity implements CreateAcc
private final StringMessages i18n_sec = StringMessages.INSTANCE;
private final CreateAccountFormValues values = new CreateAccountFormValues();
private final AuthenticationCallback callback;
public CreateAccountActivity(AuthenticationClientFactory clientFactory, AuthenticationCallback callback,
PlaceController placeController) {
public CreateAccountActivity(AuthenticationClientFactory clientFactory, PlaceController placeController) {
this.clientFactory = clientFactory;
this.placeController = placeController;
this.view = clientFactory.createCreateAccountView();
this.callback = callback;
}
@Override
@@ -48,24 +40,13 @@ public class CreateAccountActivity extends AbstractActivity implements CreateAcc
public void createAccount() {
if (values.validate()) {
clientFactory.getAuthenticationManager().createAccount(values.username, values.email,
values.password, values.fullName, values.company, new AsyncCallback<UserDTO>() {
values.password, values.fullName, values.company, new SuccessCallback<UserDTO>() {
@Override
public void onSuccess(final UserDTO result) {
clientFactory.getAuthenticationManager().login(result.getName(), values.password,
new AsyncLoginCallback(view, callback, false));
new LoginAfterCreatingAccountSuccessCallback());
placeController.goTo(new ConfirmationInfoPlace(Action.ACCOUNT_CREATED, result.getName()));
}
@Override
public void onFailure(Throwable caught) {
if (caught instanceof UserManagementException) {
if (USER_ALREADY_EXISTS.equals(((UserManagementException) caught).getMessage())) {
Window.alert(i18n_sec.userAlreadyExists(values.username));
}
} else {
Window.alert(i18n_sec.errorCreatingUser(values.username, caught.getMessage()));
}
}
});
}
}
@@ -120,5 +101,11 @@ public class CreateAccountActivity extends AbstractActivity implements CreateAcc
return isValid;
}
}
private class LoginAfterCreatingAccountSuccessCallback implements SuccessCallback<SuccessInfo> {
@Override
public void onSuccess(SuccessInfo result) {
}
}
}
@@ -1,17 +1,13 @@
package com.sap.sse.security.ui.authentication.recover;
import static com.sap.sse.security.shared.UserManagementException.CANNOT_RESET_PASSWORD_WITHOUT_VALIDATED_EMAIL;
import com.google.gwt.activity.shared.AbstractActivity;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.place.shared.PlaceController;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.sap.sse.security.shared.UserManagementException;
import com.sap.sse.security.ui.authentication.AuthenticationClientFactory;
import com.sap.sse.security.ui.authentication.AuthenticationManager.SuccessCallback;
import com.sap.sse.security.ui.authentication.confirm.ConfirmationInfoPlace;
import com.sap.sse.security.ui.authentication.confirm.ConfirmationInfoPlace.Action;
import com.sap.sse.security.ui.client.i18n.StringMessages;
public class PasswordRecoveryActivity extends AbstractActivity implements PasswordRecoveryView.Presenter {
@@ -33,26 +29,12 @@ public class PasswordRecoveryActivity extends AbstractActivity implements Passwo
@Override
public void resetPassword(final String email, final String username) {
clientFactory.getAuthenticationManager().reqeustPasswordReset(username, email, new AsyncCallback<Void>() {
clientFactory.getAuthenticationManager().reqeustPasswordReset(username, email, new SuccessCallback<Void>() {
@Override
public void onSuccess(Void result) {
String name = (username == null || username.isEmpty()) ? email : username;
placeController.goTo(new ConfirmationInfoPlace(Action.RESET_REQUESTED, name));
}
@Override
public void onFailure(Throwable caught) {
StringMessages i18n = StringMessages.INSTANCE;
if (caught instanceof UserManagementException) {
if (CANNOT_RESET_PASSWORD_WITHOUT_VALIDATED_EMAIL.equals(caught.getMessage())) {
view.setErrorMessage(i18n.cannotResetPasswordWithoutValidatedEmail(username));
} else {
view.setErrorMessage(i18n.errorResettingPassword(username, caught.getMessage()));
}
} else {
view.setErrorMessage(i18n.errorDuringPasswordReset(caught.getMessage()));
}
}
});
}
}
@@ -4,13 +4,14 @@ import com.google.gwt.activity.shared.AbstractActivity;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.place.shared.PlaceController;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.sap.sse.security.ui.authentication.AsyncLoginCallback;
import com.sap.sse.security.ui.authentication.AuthenticationCallback;
import com.sap.sse.security.ui.authentication.AuthenticationClientFactory;
import com.sap.sse.security.ui.authentication.AuthenticationContextEvent;
import com.sap.sse.security.ui.authentication.AuthenticationManager.SuccessCallback;
import com.sap.sse.security.ui.authentication.create.CreateAccountPlace;
import com.sap.sse.security.ui.authentication.info.LoggedInUserInfoPlace;
import com.sap.sse.security.ui.authentication.recover.PasswordRecoveryPlace;
import com.sap.sse.security.ui.shared.SuccessInfo;
public class SignInActivity extends AbstractActivity implements SignInView.Presenter {
@@ -43,8 +44,12 @@ public class SignInActivity extends AbstractActivity implements SignInView.Prese
@Override
public void login(String loginName, String password) {
clientFactory.getAuthenticationManager().login(loginName, password,
new AsyncLoginCallback(view, callback, true));
clientFactory.getAuthenticationManager().login(loginName, password, new SuccessCallback<SuccessInfo>() {
@Override
public void onSuccess(SuccessInfo result) {
callback.handleSignInSuccess();
}
});
}
@Override