2011-09-23 5 views
0

J'utilise le plugin multi-locataires Grails avec le mode single-locataire. J'ai utilisé le noyau de sécurité de printemps pour l'authentification. J'ai utilisé le résolveur de nom de domaine. La table utilisateur n'est pas commune dans la base de données par défaut. Chaque locataire db a ses propres tables utilisateur. Cela fonctionne bien sauf avec les 2 problèmes suivants. Lorsque l'utilisateur client (locataire) tente de se connecter, il arrive parfois qu'il accède à la base de données par défaut et indique "Utilisateur introuvable". Si j'essaie après l'actualisation de la page (en entrant l'URL et en appuyant sur CTRL + F5), il se connecte correctement.Grails Multi-tenant et Spring Security Core plugins

  • J'ai un utilisateur commun parmi les locataires avec différentes autorisations d'accès. D'abord, j'ouvre mon application dans un navigateur avec une URL de locataire, je me connecte avec les informations d'identification et je me connecte avec succès. Ensuite, j'ouvre un autre onglet dans le même navigateur, entrez la deuxième URL et les informations d'identification de connexion. Ici, je suis en mesure de me connecter à l'application, mais je reçois les autorisations du 1er locataire. Si je me déconnecte et réactualise la page comme mentionné ou si je rafraîchis la page avant de me connecter et que j'essaie, cela fonctionne très bien. Lorsque j'ai débogué, j'ai trouvé qu'avant de résoudre le locataire, la sécurité de printemps frappe la base de données avec la session db précédente.

    Comment puis-je résoudre ce problème?

  • Répondre

    1

    Lorsque la demande frappe ma page de connexion, je reçois le TenantID et le garder dans la session

    Integer tenantId = tenantResolver?.getTenantFromRequest(request) 
    if (session.tenantId == null) { 
        session.tenantId = tenantId 
    } 
    

    Pour l'utilisateur connecté dans les détails de l'utilisateur, je passer outre la méthode « loadUserByUsername » par la mise en œuvre GrailsUserDetailsService et appelé à l'intérieur la transaction.

    UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
        def requst = SecurityRequestHolder.request 
        def httpSession = requst.getSession(false) 
        Integer tenant = httpSession.tenantId 
        TenantUtils.doWithTenant (tenant) { 
    User.withTransaction { status -> 
         User user = User.findByUsername(username) 
        } 
        } 
    } 
    

    Maintenant, mon problème est résolu.

    +0

    Salut ramesh, pouvez-vous ping-moi mail id..je fais face à un problème similaire – Vish

    0

    Vous devez vous assurer que le filtre de servlet multi-tenant est enregistré avant le filtre de sécurité de printemps. Je ne suis pas sûr comment faire ceci sans recompiler le plugin.

    Questions connexes