IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AngularJS Discussion :

Authentification et autorisation avec Spring security et AngularJS


Sujet :

AngularJS

  1. #1
    Membre habitué
    Femme Profil pro
    Architecte de système d'information
    Inscrit en
    Février 2012
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2012
    Messages : 404
    Points : 127
    Points
    127
    Par défaut Authentification et autorisation avec Spring security et AngularJS
    Bonjour,

    J'ai fait l'autorisation d'accéder à des ressources pour chaque utilisateurs de la BD avec spring security:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    @Configuration
    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
         @Autowired
         protected void globalConfig(AuthenticationManagerBuilder auth, DataSource dataSource) throws Exception {
         //auth.inMemoryAuthentication().withUser("user").password("123").roles("USER");
             auth.jdbcAuthentication()
                 .dataSource(dataSource)
                 .usersByUsernameQuery("select username as principal, password as credentials, etat as actived from utilisateurs where username=?")
                 .authoritiesByUsernameQuery("select u.username as principal, ur.nom_role as role from utilisateurs u inner join roles ur on(u.roles_id=ur.id_role) where u.username=?")
                 .rolePrefix("ROLE_");
         }
     
     protected void configure(HttpSecurity http) throws Exception {
              http
             .csrf().disable()
               .sessionManagement().maximumSessions(100).maxSessionsPreventsLogin(false).expiredUrl("/Login");
              http
               .authorizeRequests()
               .antMatchers("/AppJS/**","/images/**","/pdf/**","/Template/**","/Views/**","/MainApp.js").permitAll()
               .antMatchers("/Users/**").access("hasRole('ADMIN')")
               .antMatchers("/Dashbord/**").access("hasRole('ADMIN')")
               .antMatchers("/Login*").anonymous()
               .anyRequest().authenticated()
               .and()
             .formLogin().loginPage("/Login").permitAll()
               .defaultSuccessUrl("/home")
               .failureUrl("/Login?error=true")
               .and().exceptionHandling().accessDeniedPage("/Access_Denied")
               .and()
             .logout()
                .invalidateHttpSession(true)
                .clearAuthentication(true)
                .logoutUrl("/logout")
                .permitAll()
               .logoutSuccessUrl("/Login");
     
     
         }
     
    }
    Par la suite, j'ai spécifié les views pour chaque URL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Configuration
    public class MvcConfig  extends WebMvcConfigurerAdapter{
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
          registry.addViewController("/Login").setViewName("Login");
           registry.addViewController("/Dashbord").setViewName("home");
           registry.addViewController("/logout").setViewName("Login");
           registry.addViewController("/Users").setViewName("Views/ListUsers");
        }
    }
    J'ai utilisé le AngularJS routeProvider pour garder la trace des URL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var app = angular.module('Mainapp', ['ngRoute','file-model','ui.bootstrap','ngMessages']);
    app.config(function($routeProvider) {
        $routeProvider
            .when('/Users', {
                    controller:'UsersController', 
                    templateUrl: 'Views/ListUsers'
            })     
          .when('/Dashbord', {
                  controller: 'ResultController',
                 templateUrl: 'Views/home.html'
            });  
    });
    Mon problème est comment faire le lien de l'autorisation des accès à des ressources que je défini dans le back-office (spring security) avec les URL de AngularJS($routeProvider):

    J'ai pas trouvé la bonne solution pour faire fonctionner le probléme.

    Merci de m'aider mes amis.

  2. #2
    Invité
    Invité(e)
    Par défaut
    C'est supeeer chaud !

    Pour restreindre l'accès aux vues angularjs :

    Tout ce que je peux te donner, c'est un code que j'avais fait pour une restriction de page si un utilisateur est loggé ou pas, ce code marche sur (testé en prod) .
    En fait, AngularJS demande à un service AngularJs 'serviceEtatConnexion' si la personne est loggée ou pas, si oui, elle laisse l'accès à la page ... Sinon, tu es re dirigé vers l'accueil.

    Le service AngularJs pointe sur une fonction dans le back end PHP qui retourne 1 ou 0.

    Peut être cela te donnera des idées, mais c'est en front end.

    Il faudrait que tu crées un service angularjs qui demande à java(back end) si ton user est loggé ou pas ... Le service pourrait aussi retourner les variables que tu décris dans ton code java... Mais au moins 1 si il est loggé, ou 0 si pas loggé, pour commencer.

    Code exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    50
    51
    52
    53
    monApp.config(function ($routeProvider, $locationProvider){
     
        var rsf = { // Cette fonction permet de tester si l'utilisateur est loggé ou pas.
    			"check":function($window,serviceEtatConnexion,$location,$q){
     
    				var deferred = $q.defer();
    				serviceEtatConnexion.getEtatConnexion()
    					.then(function(result) {
     
    						if (result.data.statuslogin === 1) {
    							// Everything is okay, resolve the promise with the result
    							deferred.resolve(result);
     
    						} else {
    							// Something went wrong, not logged in. Reject the promise
    							 deferred.reject(result);
    							$window.location.href ='http://xxxxxx.lan/dev/login.phtml?mlog=&domain=stuff';   
    						}
    					});
    				return deferred.promise;
     
    			}
            };
     
     
      $routeProvider
     
    	.when('/liste', {
    		templateUrl: 'vues/liste.html',
    		controller: 'liste',
    		resolve:rsf // On vérifie si l'utilisateur est loggé avant le lancement de la vue...
    	 })  
     
    	.when('/modifier/:idPassation', {
    		templateUrl: 'vues/modifier.html',
    		controller: 'modifier',
    		resolve:rsf
    	})
     
    	.when('/statistiques_passation', {
    		templateUrl: 'vues/statistiques_passation.html',
    		controller: 'statistiques_passation',
    		resolve:rsf
    	})
     
    	.when('/statistiques_digicontact', {
    		templateUrl: 'vues/statistiques_digicontact.html',
    		controller: 'statistiques_d',
    		resolve:rsf
    	})
     
    	.otherwise({redirectTo: '/liste'});
    })
    Malheuseument,j'ai perdu la partie back end (en php), mais le script faisait une requête SQL et retournait 1 si l'user est loggé , 0 si il était pas loggé.
    Dans le script, le $q permet de spécifier qu'il faut attendre la réponse du back end.


    POur restreindre à un utilisateur le droit d'écrire ou de lire ...

    Moi j'ai ce truc :

    1. Créer un service angularJs 'utilisateur' qui stocke les paramêtres de ton user qui s'est loggé . (Pour Ton exemple angularjs , le service retournerait les 3 vars suivantes :username as principal, password as credentials, etat as actived)

    2. Dans ta vue faire un code de ce style (exemple)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    app.controller('citernesCtrl', function($scope,$http,notifier,stockeUtilisateur) {
     
    u = stockeUtilisateur.getUtilisateur();
     
    /* DELETE */
    $scope.supprimer = function(idBdd){
        if(u.role=='admin'){
            $scope.citernes.splice(id,1);
                $http.post('crud.php?action=delete_citerne',{'id':idBdd}).success(function(data){
                $scope.liste();
            }).error(function(data){ $scope.infos = " Pas de données ou pb de connexion"});
            $scope.citerne = {};
        }
        else{
            notifier.notify('Vous devez être admin pour supprimer un élément');
        }
    }
     
    /* FIN DU CONTROLEUR */
     
    })
    Dans l'exemple, si l'utilisateur est admin, il a le droit de faire un delete, sinon non. On sait qu'il est admin grâce au service utilisateur qui a chargé les caractéristiques de l'utilisateur lors de son login.

    Mais attention tout ça c'est dans le front end... Donc si faut sécuriser cest pas forcément top ou alors faut prendre ses dispos dans le back end.
    Dernière modification par Invité ; 27/04/2017 à 19h43.

  3. #3
    Membre habitué
    Femme Profil pro
    Architecte de système d'information
    Inscrit en
    Février 2012
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2012
    Messages : 404
    Points : 127
    Points
    127
    Par défaut
    Bonjour,

    Merci pour ta réponse. Je vais voir comment appliquer le principe de base

Discussions similaires

  1. [Security] Plusieurs types d'authentification avec spring security
    Par soumayachouchene dans le forum Spring
    Réponses: 0
    Dernier message: 10/04/2013, 18h45
  2. [Security] Authentification avec Spring Security
    Par tiamo dans le forum Spring
    Réponses: 1
    Dernier message: 11/09/2012, 14h01
  3. [Security] Authentification LDAP avec Spring Security
    Par tiamo dans le forum Spring
    Réponses: 3
    Dernier message: 24/08/2012, 14h48
  4. [Security] Utiliser l'authentification avec Spring Security
    Par wadjaawbk dans le forum Spring
    Réponses: 4
    Dernier message: 21/11/2011, 18h23
  5. Réponses: 1
    Dernier message: 19/12/2010, 12h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo