Je souhaite utiliser SpringSecurity4 dans un environnement CDI / EJB. Est-ce possible? SpringSecurity peut-il être utilisé sans utiliser Spring?

Ce que je veux faire, c'est utiliser SpringSecurity avec mes composants EJB et CDI.

0
Nebrass Lamouchi 23 déc. 2015 à 17:29

2 réponses

Meilleure réponse

Spring Security est essentiellement une machine de filtrage, filtrant toutes les demandes entrantes. Cependant, une grande partie de ses fonctionnalités dépend de Spring-core. Il est possible d'utiliser Spring dans une application CDI, mais le cœur de Spring est lourd et sa fonctionnalité est amusante par rapport à CDI. Ce serait un déclassement et il n'y aurait aucun intérêt à utiliser CDI.

Ce que vous pouvez faire est de jeter un œil à certains projets de sécurité pour le monde JEE.

  • Apache DeltaSpike et son module de sécurité.
  • Keycloak - La solution absolue. Keycloak va bien au-delà des fonctionnalités de Spring Security. Il s'agit d'une évolution des anciennes bibliothèques PicketLink développées par JBoss, mais ceux-ci sont abandonnés et fusionnés dans Keycloak à la place. Un exemple de la simplicité d'utilisation de Keycloak peut être trouvé ici.

Il n'est pas non plus si difficile d'écrire son propre intercepteur de sécurité en utilisant @WebFilter et @Inject :), il existe plusieurs projets sur GitHub:

4
Community 20 juin 2020 à 09:12

J'utilise Spring Security avec CDI mais je peux dire que ce n'est pas très sain puisque Spring Security est basé sur Spring et que Spring joue avec les beans CDI.

Voici ce qui m'est arrivé. J'ai personnalisé le AuthenticationProvider de Spring Security afin d'authentifier les utilisateurs via mon serveur d'authentification. Lors de la mise en œuvre de ce mécanisme, j'ai utilisé mes beans CDI prédéfinis en les injectant à l'aide de l'annotation (@Inject). À ce stade, spring intercepte l'injection et crée son propre bean, ce qui signifie que vous ne pouvez utiliser aucune des valeurs que vous avez précédemment définies pour le bean CDI.

Afin de résoudre ce problème, j'ai fait une astuce comme celle-ci:

@Inject
private LoginController loginController;

public Authentication authenticate(Authentication authentication) throws AuthenticationException {
    //Here, the injected bean is empty, I am requesting my old bean from CDI and assign it back.
    LoginController bm = (LoginController) CDI.current().select(LoginController.class).get();
    loginController = bm;

Je ne sais pas si c'est la réponse que vous recherchez mais j'espère que cela vous aidera ...

0
Cem Hünerkar 19 sept. 2017 à 15:00