J'ai sécurisé mon application Grails en utilisant le plugin ACEGI et j'utilise des annotations sur mes méthodes de contrôleur pour inviter l'utilisateur à se connecter.Comment passer l'identifiant de l'utilisateur connecté à mon contrôleur choisi dans grails en utilisant acegi
Mon application a une page d'accueil HTML statique avec un lien de connexion qui redirige vers la page login/auth
. Sur une connexion réussie, je veux charger ma propre page personnalisée pour l'utilisateur authentifié, appelé person/mainpage
.
Dans mon LoginController
il y a le code suivant ...
def index = {
if (isLoggedIn()) {
redirect uri: '/'
}
else {
redirect action: auth, params: params
}
}
/**
* Show the login page.
*/
def auth = {
nocache response
if (isLoggedIn()) {
redirect uri: '/'
return
}
String view
String postUrl
def config = authenticateService.securityConfig.security
if (config.useOpenId) {
view = 'openIdAuth'
postUrl = "${request.contextPath}/login/openIdAuthenticate"
}
else if (config.useFacebook) {
view = 'facebookAuth'
postUrl = "${request.contextPath}${config.facebook.filterProcessesUrl}"
}
else {
view = 'auth'
postUrl = "${request.contextPath}${config.filterProcessesUrl}"
}
render view: view, model: [postUrl: postUrl]
}
Cette redirige la connexion réussie revenir à la page principale de l'application (/), ce qui est pas ce que je veux. Googler un peu de temps je trouve que je pouvais définir une cible par défaut pour mon authentification dans comme ça ..
defaultTargetUrl = "/person/mainpage"
Ma question est de savoir comment identifier quel utilisateur connecté quand je tombe sur mon action mainpage
dans mon PersonController
?
Au début, je changé mon action d'index dans LoginController pour rediriger vers ma page comme ça ...
def index = {
if (isLoggedIn()) {
redirect controller: person, action: mainpage, params: params
}
else {
redirect action: auth, params: params
}
}
mais l'identifiant de l'utilisateur connecté en personne ne figure pas dans la params
(que je pense que je suis content car il semble fou de pouvoir remonter des pages en définissant simplement un identifiant de ligne utilisateur comme paramètre url).
Alors, quelle est la bonne façon de faire cela? Fondamentalement, je veux que mon action person/mainpage
soit capable de résoudre l'utilisateur actuellement connecté.
J'y étais presque arrivé. J'utilisais authenticateService.principal() qui semble être une classe différente. J'ai cherché de la documentation pour l'interface authenticateService, pouvez-vous me pointer vers elle? – Simon
À titre d'intérêt, est-ce l'approche acceptée pour ce genre de problème? Cela ressemble à un hack et le contexte de l'utilisateur devrait être disponible sans avoir à revenir au service d'authentification manuellement. – Simon
Le principal est disponible à partir de SecurityContext et l'instance du domaine utilisateur y est attachée. Vous pouvez y accéder directement, mais AuthenticateService cache les détails d'implémentation pour vous. Le plugin injecte également une méthode 'getAuthUserDomain()' dans les contrôleurs qui font la même chose. –