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

Spring Boot Java Discussion :

Authentification avec Oracle 11g xe, org.springframework.security.authentication.BadCredentialsException: Bad


Sujet :

Spring Boot Java

  1. #1
    Membre du Club Avatar de fokaana
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2018
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2018
    Messages : 88
    Points : 53
    Points
    53
    Par défaut Authentification avec Oracle 11g xe, org.springframework.security.authentication.BadCredentialsException: Bad
    Salut tout le monde,

    je suis en train de développer une application sur spring boot avec le sgbd oracle 11g xe, tout marchait bien avec l'authentification jusqu'à ce que je me trouve avec cette erreur
    org.springframework.security.authentication.BadCredentialsException: Bad credentials
    après quelques recherches sur google, j'ai eu l'impression que le problème venait de PasswordEncoder sauf que depuis j'ai tout modifié avec des changements total sans succès et j'ai besoin de votre aide. Ci-dessous quelques fragment de mon code.

    1- fichier de configuration de sécurité
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    package com.probip.spring;
     
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.authentication.AuthenticationManager;
    import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
    import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.builders.WebSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    import org.springframework.security.core.session.SessionRegistry;
    import org.springframework.security.core.session.SessionRegistryImpl;
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    import org.springframework.security.crypto.password.PasswordEncoder;
    import org.springframework.security.web.authentication.AuthenticationFailureHandler;
    import org.springframework.security.web.authentication.RememberMeServices;
    import org.springframework.security.web.authentication.rememberme.InMemoryTokenRepositoryImpl;
    import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
     
    import com.probip.security.CustomRememberMeServices;
    import com.probip.security.MyAgentDetailsService;
     
     
    @Configuration
    @EnableWebSecurity
    public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
     
    	/** Public URLs. */
    	private static final String[] PUBLIC_MATCHERS = {
     
    			"/login*", "/logout*", "/webjars/**", "/forgerpassword", "/registrationConfirm*", "/expiredAccount*",
    			"/badUser*", "/user/resendRegistrationToken*", "/forgetPassword*", "/user/resetPassword*",
    			"/user/changePassword*", "/emailError*", "/", "/error/**/*", "/error", "/images/**", "/css/**", "/js/**", "/district/create" };
     
    	@Autowired
    	private MyAgentDetailsService myAgentDetailsService;
     
    	@Autowired
        private AuthenticationFailureHandler authenticationFailureHandler;
     
     
    	public SecSecurityConfig() {
    		super();
    	}
     
        @Bean
        @Override
        public AuthenticationManager authenticationManagerBean() throws Exception {
            return super.authenticationManagerBean();
        }
     
        @Override
        protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
            auth.authenticationProvider(authProvider());
        }
     
     
        @Override
        public void configure(final WebSecurity web) throws Exception {
            web.ignoring().antMatchers("/resources/**");
        }
     
    	@Override
    	protected void configure(HttpSecurity http) throws Exception {
    		// @formatter:off
    		http.csrf().disable()
    				.authorizeRequests().antMatchers(PUBLIC_MATCHERS).permitAll()
    				.antMatchers("/invalidSession*").anonymous()
    				.antMatchers("/user/updatePassword*", "/user/savePassword*", "/updatePassword*")
    				.hasAuthority("CHANGE_PASSWORD_PRIVILEGE").anyRequest().hasAuthority("READ_PRIVILEGE").and().formLogin()
    				.failureUrl("/login?error=true").defaultSuccessUrl("/home").loginPage("/login").permitAll()
    				// .successHandler(myAuthenticationSuccessHandler)
    				//.failureHandler(authenticationFailureHandler)
    				// .authenticationDetailsSource(authenticationDetailsSource)
    				.permitAll().and().sessionManagement().invalidSessionUrl("/invalidsession").maximumSessions(1)
    				.sessionRegistry(sessionRegistry()).and().sessionFixation().none().and().logout()
    				.logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/?logout")
    				.deleteCookies("JSESSIONID").permitAll().deleteCookies("JSESSIONID").permitAll().and().rememberMe()
    				.rememberMeServices(rememberMeServices()).key("theKey");
    	}
     
    	@Bean
        public DaoAuthenticationProvider authProvider() {
            final DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
            authProvider.setUserDetailsService(myAgentDetailsService);
            authProvider.setPasswordEncoder(encoder());
            return authProvider;
        }
     
    	@Bean
        public PasswordEncoder encoder() {
            return new BCryptPasswordEncoder(12);
        }
     
        @Bean
        public SessionRegistry sessionRegistry() {
            return new SessionRegistryImpl();
        }
     
        @Bean
        public RememberMeServices rememberMeServices() {
            CustomRememberMeServices rememberMeServices = new CustomRememberMeServices("theKey", myAgentDetailsService, new InMemoryTokenRepositoryImpl());
            return rememberMeServices;
        }
    }

    fichier de extension de loadUsername

    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
    package com.probip.security;
     
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.security.core.userdetails.User;
    import org.springframework.security.core.userdetails.UserDetails;
    import org.springframework.security.core.userdetails.UserDetailsService;
    import org.springframework.security.core.userdetails.UsernameNotFoundException;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
     
    import com.probip.persistence.entities.Agents;
    import com.probip.persistence.repositories.AgentsRepository;
     
    @Service
    @Transactional
    public class MyAgentDetailsService implements UserDetailsService {
     
    	@Autowired
    	private AgentsRepository agentsRepository;
     
     
    	public MyAgentDetailsService() {
    		super();
    	}
     
    	@Override
    	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
     
    		try {
    			final Agents agent = agentsRepository.findByUsername(username);
     
    			if (agent == null) {
    				throw new UsernameNotFoundException("No user found with username: " + username);
    			}
     
    			return new  User(agent.getUsername(), agent.getPassword(),agent.isEnabled(), true,true,true,agent.getAuthorities());
    		} catch (final Exception e) {
    			throw new RuntimeException(e);
    		}
    	}
    }


    et mon fichier html

    Code HTML : 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
    <form class="form-signin" name='f' th:action="@{/login}" method="post"
    		onsubmit="return validate();">
    		<img class="mb-4" th:src="@{images/login.png}" width="72" height="72" />
    		<h1 class="h3 mb-3 font-weight-normal" th:text="#{login.login.text}">Please
    			sign in</h1>
    		<label for="inputEmail" class="sr-only"
    			th:text="#{login.username.text}">Email address</label> <input
    			type="text" id="username" name="username" 
    			required="required" class="form-control" placeholder="Username"
    			autofocus> <label for="password" class="sr-only"
    			th:text="#{login.password.text}">Password</label> <input
    			type="password" id="password" class="form-control"
    			placeholder="Password" required>
    		<div class="checkbox mb-3">
    			<label> <input type="checkbox" value="remember-me"> <span
    				th:text="#{label.form.rememberMe}"></span>
    			</label> 
    			<a th:href="@{/forgerpassword}" th:text="#{message.resetPassword}">reset</a>
     
    		</div>
    		<button class="btn btn-sm btn-outline-info btn-block" type="submit"
    			th:value="#{navbar.login.text}">Sign in</button>
    	</form>

    et mon fichier de CommanderRunner

    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
    private final Agents createUserIfNotFound(final int id, final String nom, final String prenom, final Character sexe,
    			final String username, final String email, final String photo, final String dob, final String lieudob,
    			final String password, final int natid, final Collection<Groupes> superRole) {
    		Agents user = null;
    		if (agentsRepository.findByAgentemail(email) == null) {
     
    			Nationalities nat = nationalityService.findByNationalityid(natid);
     
    			user = new Agents();
    			user.setAgentid(id);
    			user.setAgentnom(nom);
    			user.setAgentprenom(prenom);
    			user.setAgentemail(email);
    			user.setAgentlieuxdob(lieudob);
    			user.setAgentsexe(sexe);
    			user.setAgentsexe(sexe);
    			user.setNationalitiesNationalityid(nat);
    			user.setUsername(username);
    			try {
    				user.setAgentdob(dateformat.parse(dob.replace("-", "/")));
    			} catch (ParseException e) {
    				e.printStackTrace();
    			}
    			user.setPassword(passwordEncoder.encode(password));
    			user.setGroupesList(superRole);
    			user.setEnabled(true);
    			user = agentsRepository.save(user);
    		}
    		return user;
    	}
     
     
    	@Override
    	public void run(String... args) throws Exception {
    		// == create initial user
    		createUserIfNotFound(1, "KANA", "Patrick", 'H', "fokana", "my@yahoo.fr", "1.png", "2999/05/05",
    				"Bamendou", "password", 7, new ArrayList<Groupes>(Arrays.asList(superRole, adminRole, agentRole)));
    		alreadySetup = true;
     
    		// == Create Init Nationality
     
    	}
    SVP j'ai besoin de votre aide pour résoudre mon problème

    En passant je rappelle que je n'ai pas d'erreur dans la console.

    Bien cordialement

  2. #2
    Membre confirmé Avatar de Kazh Du
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2011
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 152
    Points : 561
    Points
    561
    Par défaut
    Bonjour,

    En passant je rappelle que je n'ai pas d'erreur dans la console.
    C'est normal, ton erreur est remontée par spring-security. Si tu n'a pas activé spécifiquement les logs pour ça, tu ne le verras pas. En général, cette erreur est inutile car c'est un problème de droit d'accès et tu ne souhaites pas voir ton fichier de logs spammé d'erreur d'accès. Ces logs peuvent être activés via le fichier application.properties (si tu l'utilises) mais je ne connais plus la configuration.

    org.springframework.security.authentication.BadCredentialsException: Bad credentials
    Les autorisations de l'utilisateur ne sont pas suffisantes pour accéder à la ressource. Ton problème vient d'un "hasAuthority" mal configuré ou d'un rôle manquant.

    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
    	@Override
    	protected void configure(HttpSecurity http) throws Exception {
    		// @formatter:off
    		http.csrf().disable()
    				.authorizeRequests().antMatchers(PUBLIC_MATCHERS).permitAll()
    				.antMatchers("/invalidSession*").anonymous()
    				.antMatchers("/user/updatePassword*", "/user/savePassword*", "/updatePassword*")
    				.hasAuthority("CHANGE_PASSWORD_PRIVILEGE").anyRequest().hasAuthority("READ_PRIVILEGE").and().formLogin()
    				.failureUrl("/login?error=true").defaultSuccessUrl("/home").loginPage("/login").permitAll()
    				// .successHandler(myAuthenticationSuccessHandler)
    				//.failureHandler(authenticationFailureHandler)
    				// .authenticationDetailsSource(authenticationDetailsSource)
    				.permitAll().and().sessionManagement().invalidSessionUrl("/invalidsession").maximumSessions(1)
    				.sessionRegistry(sessionRegistry()).and().sessionFixation().none().and().logout()
    				.logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/?logout")
    				.deleteCookies("JSESSIONID").permitAll().deleteCookies("JSESSIONID").permitAll().and().rememberMe()
    				.rememberMeServices(rememberMeServices()).key("theKey");
    	}
    Tout ça me paraît bien gros et est source de confusion. Ça ne coûte rien de découper ta configuration en bloc (de recommencer depuis http).
    D'ailleurs, je vois 2 "permitAll" de suite dû aux lignes commentées.
    Et mieux vaut une configuration simpliste quand tu as des erreurs, cela te permet de voir ce qui est en cause.

    Un rapide coup d’œil et je vois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .anyRequest().hasAuthority("READ_PRIVILEGE")
    après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .antMatchers(PUBLIC_MATCHERS).permitAll()
    Ce qui me fait penser que tu as besoin de l'autorité "READ_PRIVILEGE" même si tu n'es pas encore identifié.

    Petit plus : je te conseillerais de passer par un outil comme Postman pour tester tes webservices. Les pages HTML peuvent brouiller la compréhension des erreurs et du cheminement nécessaire.
    Merci d'ajouter un sur les tags qui vous ont aidé

  3. #3
    Membre du Club Avatar de fokaana
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2018
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2018
    Messages : 88
    Points : 53
    Points
    53
    Par défaut
    Bonjour et Merci pour votre réponse
    j ai essaye de mettre de l ordre à ce niveau
    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
     
    	@Override
    	protected void configure(HttpSecurity http) throws Exception {
    		// @formatter:off
    		http.csrf().disable()
    				.authorizeRequests().antMatchers(PUBLIC_MATCHERS).permitAll()
    				.antMatchers("/invalidSession*").anonymous()
    				.antMatchers("/user/updatePassword*", "/user/savePassword*", "/updatePassword*").hasAuthority("CHANGE_PASSWORD_PRIVILEGE")
    				.anyRequest().hasAuthority("READ_PRIVILEGE")
    				.and()
    				.formLogin()
    				.failureUrl("/login?error=true").defaultSuccessUrl("/home").loginPage("/login").permitAll()
    				.failureHandler(authenticationFailureHandler)
    				.permitAll()
    				.and()
    				.sessionManagement()
    				.invalidSessionUrl("/invalidsession")
    				.maximumSessions(1)
    				.sessionRegistry(sessionRegistry())
    				.and()
    				.sessionFixation()
    				.none()
    				.and()
    				.logout()
    				.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
    				.logoutSuccessUrl("/?logout")
    				.deleteCookies("JSESSIONID").permitAll()
    				.and().rememberMe()
    				.rememberMeServices(rememberMeServices()).key("theKey");
    	}
    et j ai active le logging de spring security dans le fichier properties avec la ligne de code suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    logging.level.org.springframework.security = DEBUG
    bien que l erreur persiste j'ai maintenant des traces au niveau de la console
    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
     
    2019-10-01 07:40:36.278 DEBUG 2596 --- [nio-8082-exec-8] o.s.s.w.a.i.FilterSecurityInterceptor    : Secure object: FilterInvocation: URL: /images/login.png; Attributes: [permitAll]
    2019-10-01 07:40:36.278 DEBUG 2596 --- [nio-8082-exec-8] o.s.s.w.a.i.FilterSecurityInterceptor    : Previously Authenticated: org.springframework.security.authentication.AnonymousAuthenticationToken@26b9c5e9: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@166c8: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: 51918BFED39434E157F9524C62D22566; Granted Authorities: ROLE_ANONYMOUS
    2019-10-01 07:40:36.279 DEBUG 2596 --- [nio-8082-exec-8] o.s.s.access.vote.AffirmativeBased       : Voter: org.springframework.security.web.access.expression.WebExpressionVoter@5ada7ae8, returned: 1
    2019-10-01 07:40:36.279 DEBUG 2596 --- [nio-8082-exec-8] o.s.s.w.a.i.FilterSecurityInterceptor    : Authorization successful
    2019-10-01 07:40:36.279 DEBUG 2596 --- [nio-8082-exec-8] o.s.s.w.a.i.FilterSecurityInterceptor    : RunAsManager did not change Authentication object
    2019-10-01 07:40:36.279 DEBUG 2596 --- [nio-8082-exec-8] o.s.security.web.FilterChainProxy        : /images/login.png reached end of additional filter chain; proceeding with original chain
    2019-10-01 07:40:36.290 DEBUG 2596 --- [nio-8082-exec-8] o.s.s.w.header.writers.HstsHeaderWriter  : Not injecting HSTS header since it did not match the requestMatcher org.springframework.security.web.header.writers.HstsHeaderWriter$SecureRequestMatcher@7e17745e
    2019-10-01 07:40:36.290 DEBUG 2596 --- [nio-8082-exec-8] w.c.HttpSessionSecurityContextRepository : SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession.
    2019-10-01 07:40:36.292 DEBUG 2596 --- [nio-8082-exec-8] o.s.s.w.a.ExceptionTranslationFilter     : Chain processed normally
    2019-10-01 07:40:36.292 DEBUG 2596 --- [nio-8082-exec-8] s.s.w.c.SecurityContextPersistenceFilter : SecurityContextHolder now cleared, as request processing completed
    2019-10-01 07:40:36.300 DEBUG 2596 --- [nio-8082-exec-4] o.s.s.w.header.writers.HstsHeaderWriter  : Not injecting HSTS header since it did not match the requestMatcher org.springframework.security.web.header.writers.HstsHeaderWriter$SecureRequestMatcher@7e17745e
    2019-10-01 07:40:36.301 DEBUG 2596 --- [nio-8082-exec-4] w.c.HttpSessionSecurityContextRepository : SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession.
    2019-10-01 07:40:36.304 DEBUG 2596 --- [nio-8082-exec-4] o.s.s.w.a.ExceptionTranslationFilter     : Chain processed normally
    2019-10-01 07:40:36.304 DEBUG 2596 --- [nio-8082-exec-4] s.s.w.c.SecurityContextPersistenceFilter : SecurityContextHolder now cleared, as request processing completed
    et la j ai encore besoin d'aide pour une bonne compréhension de ce qu'il me faut faire pour que ça marche. car je constat juste le système me voir comme un utilisateur anonymes depuis

    cordialement

  4. #4
    Membre confirmé Avatar de Kazh Du
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2011
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 152
    Points : 561
    Points
    561
    Par défaut
    Les logs que tu nous donnes correspondent à la demande d'accès à l'image login.png

    A ce moment, tu n'es pas encore sensé être identifié (il s'agit de l'affichage de ta page de login). Tu apparais donc en temps qu'utilisateur anonyme, ce qui ne pose pas problème à mes yeux.

    Par contre, je constate des éléments qui me paraissent incorrectes dans la configuration de ton formLogin. Sur le site de Bealdung (bon, c'est anglophone mais ça reste une des meilleurs référence sur Spring), je trouve cette configuration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin()
          .loginPage("/login.html")
          .loginProcessingUrl("/perform_login")
          .defaultSuccessUrl("/homepage.html",true)
          .failureUrl("/login.html?error=true")
    }
    Le loginPage doit être l'url depuis laquelle tu souhaites te connecter (le fichier html que tu as mis en exemple).
    Le loginProcessingUrl doit être l'url vers lequel ton formulaire doit pointer (attention à ce qu'il soit bien dans ton PUBLIC_MATCHER).

    Je ne retrouve pas ça dans ta configuration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    				.formLogin()
    				.failureUrl("/login?error=true").defaultSuccessUrl("/home").loginPage("/login").permitAll()
    Merci d'ajouter un sur les tags qui vous ont aidé

  5. #5
    Membre du Club Avatar de fokaana
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2018
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2018
    Messages : 88
    Points : 53
    Points
    53
    Par défaut
    Baeldung utilise directement les fichiers html or moi j ai défini les contrôleurs pour accéder au page d ou les urls.

Discussions similaires

  1. [11gR2] DataMining avec Oracle 11G
    Par mohamedouabdallahi1 dans le forum Oracle
    Réponses: 0
    Dernier message: 22/01/2018, 14h35
  2. [11g] Problème connexion avec Oracle 11g Express Edition
    Par ClapTrap dans le forum Connexions aux bases de données
    Réponses: 0
    Dernier message: 17/09/2015, 16h35
  3. Fonctionnement DataGuard Oracle 11g avec cluster windows 2008
    Par delphinegl dans le forum Administration
    Réponses: 1
    Dernier message: 11/06/2010, 15h23
  4. [Integration] Package "org.springframework.mail" introuvable (avec Hudson/Nexus)
    Par 84mickael dans le forum Spring
    Réponses: 1
    Dernier message: 15/06/2009, 02h20
  5. probleme avec displey_row oracle 11g
    Par miloon dans le forum Débuter
    Réponses: 3
    Dernier message: 26/05/2009, 16h46

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