6
votes

Sécurité de printemps uniquement pour l'autorisation. Authentification externe

Le titre indique, je développe une application Web qui reçoit des infos d'authentification utilisateur à partir d'une application externe. Un contrôleur de ressort de mon application reçoit des informations utilisateur et le stocke en session. Je souhaite authentifier cet utilisateur à l'intérieur de la sécurité de printemps, puis utiliser ses rôles pour accorder / refuser l'accès aux URL comme xxx

J'ai lu quelques tutoriels parlant de pré_auth_filter et userDétailsService mais je ne peux pas obtenir le point . Quel est le cycle de vie de l'application de la sécurité du printemps? Quelles classes sont impliquées? J'ai besoin d'échantillons de travail complètes.


3 commentaires

Pourriez-vous nous donner plus de détails sur la façon dont vous souhaitez authentifier vos utilisateurs? Vous pouvez implicitement définir un jeton d'authentification pour chaque utilisateur, mais je ne sais pas si c'est ce que vous voulez. Que fournit l'application externe?


J'ai déjà essayé avec ce code: Liste autorités = nouvelle arrayliste (); autorités.Ajouter (Nouveau CervesedAuthorityImpl ("U")); USERNAMPASSWAMLESWORDAuthentiollingToken tok = nouvelle nom d'utilisateurpasswordAuthentiollationToken ("nom d'utilisateur", "mot de passe", autorités); SecurityContextholder.getContext (). Setauthentication (TOK); Les valeurs du nom d'utilisateur, du mot de passe et du rôle proviennent de l'application externe.


Vous pouvez essayer d'ajouter le SecurityContext à la session comme celle-ci. Séance httpSession finale = Demande.Getsession (VRAI); session.settatTtribute ("printemps_security_context", contexte); rendre le SecurityContexistSistFilter au courant du contexte


3 Réponses :


1
votes

Il y a beaucoup de tuts là-bas pour la même chose, juste besoin de Google correctement.

De toute façon, le meilleur que j'ai trouvé jusqu'à la date (pour presque tous les tuts de printemps) est krams et voici celui-ci pour la sécurité de base de base.

http://krams915.blogspot.com/2010/12/spring-security-mvc-integration_18.html

Pour implémenter userDétailsService, voici le lien

http: //krams915.blogspot.in/2012/01/spring-security-31-implément_5023.html

Certains autres sont:

  1. Spring par exemple
  2. MK Young
  3. et Springsource Site lui-même

    edit

    Voici comment ma propre application fait l'authentification (veuillez noter que je n'utilise pas d'authentification externe, j'ai simpplement obtenir des détails de db mais je suppose Il ne devrait pas s'agir d'une grande partie d'un problème).

    mon Security-context.xml : xxx

    maintenant comme vous le voyez J'ai spécifié un haricot nommé logiservice comme fournisseur d'authentification qui est un haricot pour la classe com.indyaah.service.loginservice .

    Le code pour la même chose est: PL Remarque J'ai tronqué Code inutile xxx

    notez 2 choses sur ici.

    1. Je reçois les détails de l'utilisateur (dans mon cas à partir de DB, le vôtre peut être diff.) et le mettre sous un nouveau org.springframework.security.core.userdetails.utilisateur objet qui est ensuite renvoyé par la méthode de sécurité de printemps.
    2. Les autorités, (que je charge séparément de la DB selon mes architectures de base de données, encore une fois votre scénario peut varier) et transmettez-la à la sécurité de printemps via un même objet utilisateur.

0 commentaires

0
votes

Vous pouvez implémenter votre propre personnalisation authentificationManager et personnalisé USERNAMPasswordAuthenticationfilter . C'est un exemple simple, mais cela peut également vous donner une idée aussi pour vos informations, c'est une partie très sensible du contexte de sécurité :)

Créez simplement des haricots dans votre ressort_security.xml: p>

public final class CustomAuthentication implements Authentication {

        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        private transient String userName;
        private transient boolean authenticated;
        private transient Object details;
        private static final transient String ROLE = "ROLE_LDAP_AUTHENTICATED";

        /*
         * (non-Javadoc)
         * 
         * @see java.security.Principal#getName()
         */
        @Override
        public String getName() {
            return this.userName; //for dynamic username logic here
        }



     //IF ROLES DYNAMICALLY ALLOCATED ASSIGN IT HERE, HERE IS WHERE YOU READ FROM INTERCEPT URL

        /*
         * (non-Javadoc)
         * 
         * @see org.springframework.security.core.Authentication#getAuthorities()
         */
        @Override
        public Collection<GrantedAuthority> getAuthorities() {
            Collection<GrantedAuthority> auths = new ArrayList<GrantedAuthority>();
            auths.add(new GrantedAuthority() {

                /**
                 * 
                 */
                private static final long serialVersionUID = 1L;

                @Override
                public String getAuthority() {
                    if (authenticated) {

                        return ROLE;
                    }
                    return null;
                }
            });
            return auths;
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.springframework.security.core.Authentication#getCredentials()
         */
        @Override
        public Object getCredentials() {
            //TODO: a specific algorithm can be stored
            return userName + " is ldap authenticated user";
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.springframework.security.core.Authentication#getDetails()
         */
        @Override
        public Object getDetails() {
            return this.details;
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.springframework.security.core.Authentication#getPrincipal()
         */
        @Override
        public Object getPrincipal() {
            return userName;
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.springframework.security.core.Authentication#isAuthenticated()
         */
        @Override
        public boolean isAuthenticated() {

            return this.authenticated;
        }

        /*
         * (non-Javadoc)
         * 
         * @see
         * org.springframework.security.core.Authentication#setAuthenticated(boolean
         * )
         */
        @Override
        public void setAuthenticated(boolean arg0) {
            this.authenticated = arg0;

        }

        public String getUserName() {
            return userName;
        }

        public void setUserName(String userName) {
            this.userName = userName;
        }

        public void setDetails(Object details) {
            this.details = details;
        }

    }


0 commentaires

0
votes

Implémenter un service contenant les informations de l'utilisateur.

public class CustomerUserDetailsService implements UserDetailsService {
    @Autowired
    private UserAuthenticationInfoService service;

     public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException, DataAccessException {
        UserInfo info = service.getUserInfo(userName);
        return new User(info.getUsername(), info.getPassword(), info.getAuthorities());
    }
}


2 commentaires

Merci, cela fonctionne, mais je ne peux pas vous rendre au travail automativé dans le contrôleur qui remplit les informations utilisateur. J'ai plutôt utilisé une classe statique parce que je manque de temps. Que se passerait-il si des milliers d'utilisateurs se connectent mais ne se déconnectent jamais? UserAuthentiollingInfoservice va devenir indéfiniment?


Jetez un coup d'œil aux bibliothèques de Guava de Google, il contient un constructeur de cache qui vous permet de créer des caches qui expirent entiers basé sur le dernier temps d'accès ou le temps de création.