Précédent   Forum des professionnels en informatique > Java > Général Java > Spring
Spring Forum d'entraide pour le framework Spring. Avant de poster -> FAQ Spring
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/12/2011, 18h54   #1
Rédacteur
 
Avatar de thierryler
 
Homme Thierry Leriche-Dessirier
Inscription : octobre 2007
Messages : 1 225
Détails du profil
Informations personnelles :
Nom : Homme Thierry Leriche-Dessirier
Localisation : France

Informations forums :
Inscription : octobre 2007
Messages : 1 225
Points : 3 460
Points : 3 460
Par défaut Logguer la connexion en base avec spring security

Bonjour à tous,

J'utilise Spring-Security pour la connexion de mes utilisateurs sur le site. Je vais chercher les droits/roles de mes utilisateurs en base dans un populator. Au passage, je veux logguer la connexion en base, ce que j'arrive à faire.

Ce qui me manque, c'est de pouvoir récupérer le "user-agent" (msie, firefox, etc.) qui a été utilisé.

Vous pouvez me dire si cette conception est bonne déjà, et comment récupérer mon user-agent, svp. ?

Voici à quoi ressemble actuellement mon code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 
public class MonPopulator implements LdapAuthoritiesPopulator {
 
@Autowired
private UserService userService;
 
@Override
public final Collection<? extends GrantedAuthority> getGrantedAuthorities(DirContextOperations userData, String username) {
 
	logger.debug("getGrantedAuthorities");
 
	final MonUser user = getMonUserByUsernameEnBase(username);
 
	final List<GrantedAuthority> authorities = newArrayList();
 
	// token
	final List<GrantedAuthority> grantedAuthorities = getAuthorities(user.getRoles());
	authorities.addAll(grantedAuthorities);
 
	// Register en base
	registerConnectionIntoDb(userData, username);
 
	return authorities;
}
 
/**
 * Enregistre en base le fait que l'utilisateur vient de se connecter.
 * 
 * @param userData
 * @param username
 */
private void registerConnectionIntoDb(DirContextOperations userData, String username) {
	logger.debug("registerConnectionIntoDb");
 
	final ApplicationEnum appEnum = getApplicationEnum();
 
	final String userAgent = getUserAgent(userData);
 
 
 
	userService.registerConnectionIntoDb(username, userAgent, appEnum);
}
 
private static String getUserAgent(DirContextOperations userData) {
 
	final String userAgent = "firefox"; // partie a changer
 
	return userAgent ;
}
__________________
Thierry Leriche-Dessirier
Ingénieur Architecte JEE Freelance
Rédacteur pour Developpez
Professeur de Génie Logiciel à l'ESIEA

Page sur Developpez : http://thierry-leriche-dessirier.developpez.com
Page perso / pro : http://www.thierryler.com / http://www.icauda.com
Page Linked'in : http://www.linkedin.com/in/thierryler
Page twitter : http://www.twitter.com/thierryleriche
thierryler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 20h00   #2
Expert Confirmé
 
Homme
Inscription : septembre 2006
Messages : 2 291
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : septembre 2006
Messages : 2 291
Points : 2 738
Points : 2 738
À ce niveau, les fonctionnalités de sécurité n'ont pas accès à cette information tout simplement parce qu'il n'y a aucune raison qu'elles ne soient appelées QUE à partir d'une connection Web.

Donc toute astuce (genre wormhole par AspectJ) qui permettrait d'y arriver devrait être conçue pour fonctionner aussi si le contexte appelant n'est pas celui d'une requête Web.

Par contre, le mécanisme des filtres a accès à cette information via le paramètre HttpServletRequest.
JeitEmgie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 08h13   #3
Rédacteur
 
Avatar de thierryler
 
Homme Thierry Leriche-Dessirier
Inscription : octobre 2007
Messages : 1 225
Détails du profil
Informations personnelles :
Nom : Homme Thierry Leriche-Dessirier
Localisation : France

Informations forums :
Inscription : octobre 2007
Messages : 1 225
Points : 3 460
Points : 3 460
J'avais pensé à un filtre que je mettais juste après celui de spring security dans le web.xml mais mes autowire netaient plus settés
__________________
Thierry Leriche-Dessirier
Ingénieur Architecte JEE Freelance
Rédacteur pour Developpez
Professeur de Génie Logiciel à l'ESIEA

Page sur Developpez : http://thierry-leriche-dessirier.developpez.com
Page perso / pro : http://www.thierryler.com / http://www.icauda.com
Page Linked'in : http://www.linkedin.com/in/thierryler
Page twitter : http://www.twitter.com/thierryleriche
thierryler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 08h53   #4
Expert Confirmé
 
Homme
Inscription : septembre 2006
Messages : 2 291
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : septembre 2006
Messages : 2 291
Points : 2 738
Points : 2 738
Citation:
Envoyé par thierryler Voir le message
J'avais pensé à un filtre que je mettais juste après celui de spring security dans le web.xml mais mes autowire netaient plus settés
il faut que le filtre soit aussi un bean.
JeitEmgie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 09h08   #5
Rédacteur
 
Avatar de thierryler
 
Homme Thierry Leriche-Dessirier
Inscription : octobre 2007
Messages : 1 225
Détails du profil
Informations personnelles :
Nom : Homme Thierry Leriche-Dessirier
Localisation : France

Informations forums :
Inscription : octobre 2007
Messages : 1 225
Points : 3 460
Points : 3 460
Je ne suis pas certain de comprendre.

J'ai fais un filtre qui est le suivant.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
public class ConnectionHistoryFilter implements Filter {
 
	@Autowired
	private UserService userService;
 
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("init");
 
	}
 
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println("doFilter");
 
	}
 
	@Override
	public void destroy() {
		System.out.println("destroy");
 
	}
 
	public UserService getUserService() {
		return userService;
	}
 
	public void setUserService(UserService userService) {
		this.userService = userService;
	}
 
}
Mais quand je suis dans le doFilter(), la variable userService reste null...
__________________
Thierry Leriche-Dessirier
Ingénieur Architecte JEE Freelance
Rédacteur pour Developpez
Professeur de Génie Logiciel à l'ESIEA

Page sur Developpez : http://thierry-leriche-dessirier.developpez.com
Page perso / pro : http://www.thierryler.com / http://www.icauda.com
Page Linked'in : http://www.linkedin.com/in/thierryler
Page twitter : http://www.twitter.com/thierryleriche
thierryler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 09h18   #6
Expert Confirmé
 
Homme
Inscription : septembre 2006
Messages : 2 291
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : septembre 2006
Messages : 2 291
Points : 2 738
Points : 2 738
soit vous annotez ConnectionHistoryFilter avec
Code :
@Component("connHistoryFilter")
et votre applicationContext.xml spécifie que le package qui contient cette classe est bien scanné par Spring,

soit vous avez
Code :
1
2
3
4
 
<bean id="connHistoryFilter" class="….ConnectionHistoryFilter"></bean>
et dans les 2 cas vous mettez le filtre là où vous le voulez dans le <security>

Code :
1
2
3
4
 
<security:http use-expressions="true" auto-config="true" >
	<security:custom-filter before="WHERE_YOU_WANT_IT" ref="connHistoryFilter" />
dans votre applicationContext.xml
JeitEmgie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 10h05   #7
Rédacteur
 
Avatar de thierryler
 
Homme Thierry Leriche-Dessirier
Inscription : octobre 2007
Messages : 1 225
Détails du profil
Informations personnelles :
Nom : Homme Thierry Leriche-Dessirier
Localisation : France

Informations forums :
Inscription : octobre 2007
Messages : 1 225
Points : 3 460
Points : 3 460
Ah ok.

J'ai donc fais comme ça :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
@Component("connectionHistoryFilter")
public class ConnectionHistoryFilter implements Filter {
 
	@Autowired
	private UserService userService;
 
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
 
		System.out.println("doFilter ");
		System.out.println("[userService] " + userService);
	}
 
}
Ce qui me donne bien la trace :

Code :
1
2
3
 
doFilter 
[userService] com.carrefour.lineopen.service.user.UserService@223c8087
Donc je dirais que c'est bon.

Dans le security-app-context.xml, j'ai mis

Code :
1
2
3
4
5
 
<http use-expressions="true">
    ...
    <custom-filter ref="connectionHistoryFilter" after="SECURITY_CONTEXT_FILTER"/>
    ...
Mais du coup, c'est lancé à chaque page. Ce que j'aimerais faire, idéalement, c'est déclencher le filtre après une connexion réussi uniquement.

Sur le web, j'ai trouvé AuthenticationSuccessHandler, avec la méthode onAuthenticationSuccess, mais je ne vois pas trop comment définir ce composant... Une idée ? Est ce une bonne piste déjà ?
__________________
Thierry Leriche-Dessirier
Ingénieur Architecte JEE Freelance
Rédacteur pour Developpez
Professeur de Génie Logiciel à l'ESIEA

Page sur Developpez : http://thierry-leriche-dessirier.developpez.com
Page perso / pro : http://www.thierryler.com / http://www.icauda.com
Page Linked'in : http://www.linkedin.com/in/thierryler
Page twitter : http://www.twitter.com/thierryleriche
thierryler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 10h25   #8
Rédacteur
 
Avatar de thierryler
 
Homme Thierry Leriche-Dessirier
Inscription : octobre 2007
Messages : 1 225
Détails du profil
Informations personnelles :
Nom : Homme Thierry Leriche-Dessirier
Localisation : France

Informations forums :
Inscription : octobre 2007
Messages : 1 225
Points : 3 460
Points : 3 460
J'ai testé le code suivant :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
 
@Component("connectionHistoryHandler")
public class ConnexionHistoryHandler implements AuthenticationSuccessHandler {
 
	@Autowired
	private UserService userService;
 
	@Override
	public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException,
			ServletException {
 
 
		System.out.println("onAuthenticationSuccess");
		System.out.println("[userService] " + userService);
 
	}
}
Et dans mon security-app-context.xml :

Code :
1
2
3
4
5
6
7
8
 
<http use-expressions="true">
    ...
    <form-login login-processing-url="/login_check" login-page="/login"
    default-target-url="/home" authentication-failure-url="/login?login_error=1"
    authentication-success-handler-ref="connectionHistoryHandler"  />
 
    ...
Mais j'ai du manquer une étape importante car ça n'affiche plus rien dans Firefox. Un peu comme lorsqu'on oublie de faire chain.doFilter dans un filtre. ou alors j'aurais du faire un extends à la place d'un implements, mais de quelle classe ?
__________________
Thierry Leriche-Dessirier
Ingénieur Architecte JEE Freelance
Rédacteur pour Developpez
Professeur de Génie Logiciel à l'ESIEA

Page sur Developpez : http://thierry-leriche-dessirier.developpez.com
Page perso / pro : http://www.thierryler.com / http://www.icauda.com
Page Linked'in : http://www.linkedin.com/in/thierryler
Page twitter : http://www.twitter.com/thierryleriche
thierryler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 10h31   #9
Rédacteur
 
Avatar de thierryler
 
Homme Thierry Leriche-Dessirier
Inscription : octobre 2007
Messages : 1 225
Détails du profil
Informations personnelles :
Nom : Homme Thierry Leriche-Dessirier
Localisation : France

Informations forums :
Inscription : octobre 2007
Messages : 1 225
Points : 3 460
Points : 3 460
Bon en fait, je fais les questions et les réponses tout seul ;-)

J'ai finalement fait :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
@Component("connectionHistoryHandler")
public class ConnexionHistoryHandler extends SimpleUrlAuthenticationSuccessHandler { // implements AuthenticationSuccessHandler {
 
	@Autowired
	private UserService userService;
 
	@Override
	public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException,
			ServletException {
 
 
		System.out.println("onAuthenticationSuccess");
		System.out.println("[userService] " + userService);
 
		super.onAuthenticationSuccess(request, response, authentication);
 
	}
Et ça a l'air de fonctionner.
__________________
Thierry Leriche-Dessirier
Ingénieur Architecte JEE Freelance
Rédacteur pour Developpez
Professeur de Génie Logiciel à l'ESIEA

Page sur Developpez : http://thierry-leriche-dessirier.developpez.com
Page perso / pro : http://www.thierryler.com / http://www.icauda.com
Page Linked'in : http://www.linkedin.com/in/thierryler
Page twitter : http://www.twitter.com/thierryleriche
thierryler est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h22.


 
 
 
 
Partenaires

Hébergement Web