Printemps de Démarrage de Sécurité avec Vaadin de Connexion
J'essaie de construire une application basée sur Spring Boot (1.2.7.De presse) et Vaadin (7.6.3). Mon problème est que je ne suis pas en mesure d'intégrer la Sécurité Printemps avec Vaadin. Je veux une coutume Vaadin construit LoginScreen et le Printemps de contrôle de la Sécurité. Mon projet d'installation est la suivante:
@Configuration
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable().
exceptionHandling().authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/login")).accessDeniedPage("/accessDenied")
.and().authorizeRequests()
.antMatchers("/VAADIN/**", "/PUSH/**", "/UIDL/**", "/login", "/login/**", "/error/**", "/accessDenied/**", "/vaadinServlet/**").permitAll()
.antMatchers("/authorized", "/**").fullyAuthenticated();
}
}
Et voici mon Vaadin INTERFACE utilisateur de connexion
@SpringUI(path = "/login")
@Title("LoginPage")
@Theme("valo")
public class LoginUI extends UI {
TextField user;
PasswordField password;
Button loginButton = new Button("Login", this::loginButtonClick);
private static final String username = "username";
private static final String passwordValue = "test123";
@Override
protected void init(VaadinRequest request) {
setSizeFull();
user = new TextField("User:");
user.setWidth("300px");
user.setRequired(true);
user.setInputPrompt("Your username");
password = new PasswordField("Password:");
password.setWidth("300px");
password.setRequired(true);
password.setValue("");
password.setNullRepresentation("");
VerticalLayout fields = new VerticalLayout(user, password, loginButton);
fields.setCaption("Please login to access the application");
fields.setSpacing(true);
fields.setMargin(new MarginInfo(true, true, true, false));
fields.setSizeUndefined();
VerticalLayout uiLayout = new VerticalLayout(fields);
uiLayout.setSizeFull();
uiLayout.setComponentAlignment(fields, Alignment.MIDDLE_CENTER);
setStyleName(Reindeer.LAYOUT_BLUE);
setFocusedComponent(user);
setContent(uiLayout);
}
public void loginButtonClick(Button.ClickEvent e) {
//authorize/authenticate user
//tell spring that my user is authenticated and dispatch to my mainUI
}
}
Quand je commence ma demande de printemps me redirige vers ma connexion de l'INTERFACE utilisateur, ce qui est bien.
Mais je ne sais pas comment authentifier l'utilisateur à l'égard de au printemps, le mécanisme de sécurité et de l'expédition de mon mainUI.
Je suis également confronté à un problème avec les jetons csrf, si je ne désactive pas csrf je vais chercher le fec jeton est nulle exception. J'ai trouvé beaucoup d'exemples de la manipulation de ces problèmes, mais il n'y a pas de solution fournie avec Vaadin.
Merci pour l'aide.
Hey Roland, j'ai pris un coup d'oeil à votre projet et il a beaucoup aidé. Merci pour le partage.
Content d'avoir pu aider sans vraiment répondre à votre question 😉
OriginalL'auteur J. S. | 2016-03-10
Vous devez vous connecter pour publier un commentaire.
Après une semaine de lutte et de recherche, j'ai été en mesure d'obtenir ce travail. C'était très fatigant parce qu'il ya beaucoup d'informations et de solutions sur internet, la plupart d'entre eux à l'aide de xml de configuration basée sur une JSP ou à base de formulaire de connexion, jusqu'à maintenant, je ne pouvais pas trouver une autre solution sans un fichier de configuration xml en utilisant le framework Vaadin pour créer une page de connexion personnalisée.
Je ne peux pas garantir que c'est le meilleur de la pratique ou de la solution la plus simple. De plus je n'ai pas d'évaluer chaque partie, le mécanisme de connexion fonctionne aussi loin que je peux voir, mais peut-être il pourrait y avoir quelques problèmes que je n'ai pas encore découvert.
Peut-être que ça va aider quelqu'un qui font face au même problème, donc je vais poster ma réponse ici.
Tout d'abord, mes securityConfig:
Vous devez désactiver le fscc, mais c'est pas un problème, vaadin a son propre fscc protection.
En outre, vous devez permettre à certaines URIs afin de vaadin peut accéder à ses ressources:
/VAADIN/**
est absolument nécessaire, je voudrais également recommandons pour permettre/vaadinServlet/**
,/PUSH/**
et/HEARTBEAT/**
, mais cela dépend de ce que les parties de Vaadin vous utilisez.Deuxième mon
UserDetailsService
:La
DaoAuthenticationProvider
utilise leUserDetails
'loadUserByUserName
méthode pour obtenir un objet d'une classe qui implémente l'UserDetails
interface. Sachez que chaque attribut est décrit dans leUserDetailsInterface
ne doit pas être nul, sinon vous obtiendrez unNullPointerException
jeté par laDaoAuthenticationProvider
plus tard.J'ai créé une Entité JPA qui met en œuvre la UserDetails interface:
Plus les Autorités de l'Entité:
Évidemment, vous aurez à stocker les données de l'utilisateur dans la base de données avant que l'authentification fonctionne.
Dans Vaadin je ne pouvais pas sortir, il a travaillé en utilisant une INTERFACE utilisateur avec différents points de vue, je me suis donc retrouvé à l'aide de deux Isu un login et un autre pour l'application principale.
Dans Vaadin je pourrais définir le chemin de l'URI dans la classe d'annotation:
Avec cette configuration de mon écran de connexion est disponible à
localhost:port/login
et ma principale de l'application à
localhost:port/main
.Je de connexion de l'utilisateur par programme à l'intérieur d'un bouton.cliquez sur la méthode dans mon loginUI:
J'espère que cela a aidé certains d'entre vous.
OriginalL'auteur J. S.
Comme une alternative à l'approche donnée, vous pouvez également compter sur
vaadin4spring
, un "officieux" ensemble d'extensions à intégrer davantage Vaadin et le Printemps.Il offre actuellement deux façons à intégrer la Sécurité Printemps, qui semblent bien fonctionner (même si elles ne fonctionnent pas pour vous, les exemples de code devrait vous donner assez d'idées pour écrire personnalisé du code de l'intégration).
OriginalL'auteur Roland Ewald