J'ai créé un projet simple en utilisant des tutoriels sur Springboot et mongodb. Actuellement, j'ai une page comme celle-ci : première page

Comme vous le voyez, c'est une page de recherche. Jusqu'à hier, il n'incluait pas l'option de recherche et l'utilisateur pouvait simplement cliquer sur se connecter, puis rechercher quelque chose Si l'utilisateur clique sur le bouton login et se connecte au système, il peut rechercher les éléments et le résultat est affiché sur une page appelée searchResults.html sans aucun problème. Cependant, ce que je dois faire, c'est laisser l'utilisation de la recherche sur la première page (la page a été remplacée par l'image ci-dessus pour inclure l'option de recherche) et voir les résultats. C'est-à-dire qu'il y a deux options : 1) L'utilisateur se connecte au système, recherche les éléments et voit les résultats et 2) L'utilisateur recherche quelque chose sans se connecter au système. L'implémentation actuelle correspond à la première partie, mais pas à la deuxième partie. Je ne sais pas comment je dois modifier mon implémentation. Voici le code pertinent (si je dois partager d'autres parties du code, veuillez me le faire savoir):

Code de la première page :

    <body>
        <div layout:fragment="content">
            <h1>Welcome!</h1>
            <form action="/search" method="POST">
    <div class="form-group row">
<div class="col-sm-6" id="category_search">
<div class="dropdown">
                            <div class="input-group justify-content-center">
                                <div class="input-group-btn">
                                    <button class="btn btn-md dropdown-toggle" type="button"
                                        id="dropdownMenuButton" data-toggle="dropdown"
                                        aria-haspopup="true" aria-expanded="false">Select a category</button>
<div class="dropdown-menu" onchange="selectMenu1"
                                        aria-labelledby="dropdownMenuButton">
                                        <a class="dropdown-item" href="#" data="Hotel">Hotel</a> <a
                                            class="dropdown-item" href="#" data="Food">Fast food</a>
                                    </div>
                                </div>
                            </div>
                        </div>
</div>
                    <div class="col-sm-3" id="search_city_id">
                    </div>  
                </div>   
                <div class="form-group row">   
                    <div class="col-sm-3">
                        <input type="text" name="search" id="search"
                            class="form-control coloredInput" th:value="${search}" />
                    </div>
    
                    <button type="submit" class="btn btn-primary" value="search">Search</button>
    
                </div>    
            </form>   
        </div>
    </body>
    </html>

Voici ma classe de contrôleur:

@Controller
public class RController {

    @Autowired
    private CustomUserDetailsService userService;

    
    @RequestMapping("/home")
    public String home(Model model) {
        model.addAttribute("pointList", rRepository.findAll());
        return "home";
    }

    
    @RequestMapping(value = "/search")
    public ModelAndView search(Model model, @RequestParam("search") String search,
            @RequestParam ("search-entityType-value") String searchEntityTypeValue,
            @RequestParam("selected_category") String selected_category
            ) {

        List<RAggrResults> result = RSearchRepository.searchRs(search, searchEntityTypeValue, selected_category);

        
        LinkedHashMap<String, List<R>> hashMap = new LinkedHashMap<String, List<R>>();

        for (int i = 0; i < result.size(); i++) {
             List<R> rs_of_one_group = result.get(i).getRs();
            
                hashMap.put(rs_of_one_group.get(0).getPlace().getPlace_name(), result.get(i).getRs());
            
        }

        model.addAttribute("searchResult", hashMap);
        model.addAttribute("search", search);

        ModelAndView modelAndView = new ModelAndView();
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        User user = userService.findUserByEmail(auth.getName());
        modelAndView.addObject("currentUser", user);
        modelAndView.addObject("fullName", "Welcome " + user.getFullname());
        modelAndView.addObject("adminMessage", "Content Available Only for Users with Admin Role");

        modelAndView.setViewName("searchResults");

        return modelAndView;
    }

}

Et voici ma classe de configuration :

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;

    @Autowired
    CustomizeAuthenticationSuccessHandler customizeAuthenticationSuccessHandler;

    @Bean
    public UserDetailsService mongoUserDetails() {
        return new CustomUserDetailsService();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        UserDetailsService userDetailsService = mongoUserDetails();
        auth
                .userDetailsService(userDetailsService)
                .passwordEncoder(bCryptPasswordEncoder);

    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/login").permitAll()
                .antMatchers("/signup").permitAll()
                .antMatchers("/dashboard/**").hasAuthority("ADMIN").anyRequest()
                .authenticated().and().csrf().disable().formLogin().successHandler(customizeAuthenticationSuccessHandler)
                .loginPage("/login").failureUrl("/login?error=true")
                .usernameParameter("email")
                .passwordParameter("password")
                .and().logout()
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                .logoutSuccessUrl("/").and().exceptionHandling();
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web
                .ignoring()
                .antMatchers("/resources/**", "/static/**", "/css/**", "/js/**", "/images/**");
    }

}

Votre aide serait appréciée.

0
user13578 4 sept. 2020 à 18:57

1 réponse

Meilleure réponse

Définissez l'autorisation pour votre point de terminaison /search : .antMatchers("/search").permitAll(). Et deuxièmement, dans votre cas, je vous recommande de vérifier si l'utilisateur est connecté au contrôleur avant d'ajouter les détails de l'utilisateur à afficher.

1
Seldo97 5 sept. 2020 à 16:13