2010-01-13 3 views
0

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é.

Répondre

2

Vous pouvez accéder à l'utilisateur connecté à l'aide de authenticateService. Pour obtenir l'instance de domaine utilisateur/personne, appelez authenticateService.userDomain() et juste pour obtenir l'authentification (qui a une méthode getUsername() qui peut être suffisante) appelez authenticateService.principal(). Si votre defaultTargetUrl est «/personne/mainpage » puis votre action « MainPage » de PersonController ressemblerait à quelque chose comme ceci:

class PersonController { 

    def authenticateService 

    def mainpage = { 
     def user = authenticateService.userDomain() 
     if (user) { 
     log.info "you're logged in as $user.username" 
     } 
     else { 
     log.info "you're not logged in" 
     } 
     [user: user] 
    } 
} 

et vous auriez le « utilisateur » disponible en mainpage.gsp pour rendre des données.

+0

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

+0

À 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

+0

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. –