部署的Spring App在首次登录时未被路由到正确的URL

时间:2018-05-27 00:03:26

标签: spring spring-boot heroku jdbc spring-security

我向Heroku部署了一个Spring App。我正在使用Spring Security登录和注册。我的问题是,对于新用户,当他们最初登录时,会将他们带到基本URL(Heroku为我的网站提供的URL)。我的所有主要html文件都在名为" cheese"的文件夹中。问题是它引导我到主URL(而不是" / cheese / account",这是我指示它在我的SecurityConfig中路由的地方),我得到一个白标签错误。

这只是第一次发生。当他们再次登录时,会将他们带到正确的URL,即" / cheese / account"。此外,偶尔,我会点击heroku为我的网站提供的基本网址,它只给我一个网址,并没有指示我去" / cheese / login"。如果我尝试从隐身窗口访问该网址,就会发生这种情况。

在本地运行它时根本没有这个问题。这是相关的代码......如果您还需要任何东西,请告诉我。

SecurityConfig

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

import javax.sql.DataSource;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    DataSource dataSource;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.jdbcAuthentication().dataSource(dataSource)
                .usersByUsernameQuery("select email as principal, password as credentials, true from customer where email=?")
                .authoritiesByUsernameQuery("select customer_email as principal, role_id as role from user_roles where customer_email=?")
                .passwordEncoder(passwordEncoder()).rolePrefix("ROLE_");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception{
        http
                .csrf().disable()
                .authorizeRequests()
                .antMatchers(
                        "/**/webjars/**",
                        "/cheese/signup",
                        "/cheese/login",
                        "/cheese/success").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin().loginPage("/cheese/login")
                .defaultSuccessUrl("/cheese/account")
                .permitAll();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

UserController中

package com.example.demo.controllers;

import com.example.demo.models.Customer;
import com.example.demo.models.data.CustomerDao;
import com.example.demo.models.services.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("cheese")
public class UserController {

    @Autowired
    private CustomerDao customerDao;

    @Autowired
    UserService userService;

    @RequestMapping(value = "login")
    public String loginPage(Model model) {
        model.addAttribute("title", "Login Page");
        model.addAttribute("customer", new Customer());
        return "cheese/login";
    }

    @RequestMapping(value = "account")
    public String accountInfo(Model model) {

        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        Customer customer = customerDao.findByEmail(authentication.getName());

        model.addAttribute("name", customer.getName());
        model.addAttribute("customer", customer);

        return "cheese/account";
    }

    @GetMapping("signup")
    public String displaySignUpForm(Model model) {
        model.addAttribute("title", "Sign Up");
        model.addAttribute("customer", new Customer());
        return "cheese/signup";
    }

    @PostMapping(value = "signup")
    public String processSignUp(Model model, @ModelAttribute Customer customer, Errors errors) {

        if (errors.hasErrors()) {
            return "cheese/signup";
        }

        userService.createUser(customer);
        return "cheese/success";
    }
}

MainController

package com.example.demo.controllers;

import com.example.demo.models.Cheese;
import com.example.demo.models.data.CheeseDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

@RequestMapping(value = "cheese")
@Controller
public class MainController {

    @Autowired
    CheeseDao cheeseDao;

    @RequestMapping(value = "")
    public String hello(Model model) {
        model.addAttribute("title", "Grocery List");
        model.addAttribute("cheeses", cheeseDao.findAll());
        return "cheese/index";
    }

    @GetMapping("add")
    public String displayAddCheeseForm(Model model) {
        model.addAttribute("title", "Add Cheese");
        model.addAttribute("cheese", new Cheese());
        return "cheese/add";
    }

    @PostMapping("add")
    public String processAddCheeseForm(Model model,
                                       @ModelAttribute @Valid Cheese cheese,
                                       Errors errors) {
        if (errors.hasErrors()) {
            return "cheese/add";
        }

        cheeseDao.save(cheese);
        return "redirect:";
    }


    @RequestMapping(value = "remove", method = RequestMethod.GET)
    public String displayRemoveCheeseForm(Model model) {
        model.addAttribute("cheeses", cheeseDao.findAll());
        model.addAttribute("title", "Remove Cheese");
        return "cheese/remove";
    }

    @RequestMapping(value = "remove", method = RequestMethod.POST)
    public String processRemoveCheeseForm(Model model, @RequestParam int[] cheeseIds) {
        for (int id : cheeseIds) {
            cheeseDao.deleteById(id);
        }
        return "redirect:";
    }
}

0 个答案:

没有答案