Spring Security的UserServiceDetails不';行不通

Spring Security的UserServiceDetails不';行不通,spring,spring-security,userdetailsservice,Spring,Spring Security,Userdetailsservice,我正在通过阅读学习Spring4。现在,我遇到了一个关于Spring安全性的问题。当我请求“/主页”时,我得到了登录页面,但当我填写表单并提交时,我不能进入UserDetails服务,而是直接进入控制器,然后返回登录页面。我调试了它,发现SpitterUserDetails服务不是空的,它是自动连接的。所以我不知道问题出在哪里。这是我的代码。提前谢谢 @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigu

我正在通过阅读学习Spring4。现在,我遇到了一个关于Spring安全性的问题。当我请求“/主页”时,我得到了登录页面,但当我填写表单并提交时,我不能进入UserDetails服务,而是直接进入控制器,然后返回登录页面。我调试了它,发现SpitterUserDetails服务不是空的,它是自动连接的。所以我不知道问题出在哪里。这是我的代码。提前谢谢

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {


    @Autowired
    private UserDetailsService spitterUserDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception{
        http.formLogin().loginPage("/spitter/login").permitAll()
           .and().rememberMe()
           .and().authorizeRequests().antMatchers("/spitter/home").hasRole("SPITTER")
           .anyRequest().permitAll();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception{
        auth.userDetailsService(spitterUserDetailsService);
    }

}



@Service
public class SpitterUserDetailsService implements UserDetailsService {

    @Autowired
    private SpitterRepository spitterRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        System.err.println("---------- User Details Service start -----------");
        Spitter spitter = spitterRepository.findByUsername(username);
        if(spitter == null){
            throw new UsernameNotFoundException(username + " not found ");
        }
        List<SimpleGrantedAuthority> authorities = new ArrayList<SimpleGrantedAuthority>();
        authorities.add(new SimpleGrantedAuthority("ROLE_SPITTER"));
        System.out.println(spitter.getUsername() + " : ROLE_SPITTER");
        return new User(spitter.getUsername(), spitter.getPassword(), authorities);
    }

}



@Controller
@RequestMapping("/spitter")
public class SpitterController {

    @Autowired
    private SpitterRepository spitterRepository;

    @RequestMapping(value= "/login", method = RequestMethod.GET)
    public String login(Model model){
        model.addAttribute("spitter", new Spitter());
        return "spitter/login";
    }

    @RequestMapping(value= "/loginForm", method = RequestMethod.POST)
    public String login(@ModelAttribute("spitter") Spitter spitter){
        System.out.println(spitter.getUsername() + " logined..");
        return "redirect:home";
    }

    @RequestMapping(value = "/register", method = RequestMethod.GET)
    public String showRegistrationForm(Model model){
        model.addAttribute("spitter", new Spitter());
        return "spitter/registerForm";
    }

    @RequestMapping(value="/register", method = RequestMethod.POST)
    public String register(@ModelAttribute("spitter") Spitter spitter){
        spitterRepository.addSpitter(spitter);
        return "spitter/registerSuccessfully";
    }

    @RequestMapping("/home")
    public String hello(){
        return "spitter/helloWorld";
    }
}
@EnableWebSecurity
公共类SecurityConfig扩展了WebSecurity配置适配器{
@自动连线
私有用户详细信息服务SpitterUserDetails服务;
@凌驾
受保护的无效配置(HttpSecurity http)引发异常{
http.formLogin().loginPage(“/spitter/login”).permitAll()
.和().记住()
.and().authorizeRequests().antMatchers(“/spitter/home”).hasRole(“spitter”)
.anyRequest().permitAll();
}
@凌驾
受保护的无效配置(AuthenticationManagerBuilder auth)引发异常{
auth.userDetailsService(spitterUserDetailsService);
}
}
@服务
公共类SpitterUserDetailsService实现UserDetailsService{
@自动连线
私人SpitTerrespository SpitTerrespository;
@凌驾
public UserDetails loadUserByUsername(字符串用户名)引发UsernameNotFoundException{
System.err.println(“------------用户详细信息服务启动------------”;
Spitter Spitter=spitterRepository.findByUsername(用户名);
如果(spitter==null){
抛出新用户名NotFoundException(用户名+“未找到”);
}
列表权限=新建ArrayList();
添加(新的SimpleGrantedAuthority(“ROLE_SPITTER”);
System.out.println(spitter.getUsername()+“:ROLE_spitter”);
返回新用户(spitter.getUsername()、spitter.getPassword()、authorities);
}
}
@控制器
@请求映射(“/spitter”)
公共类Spitter控制器{
@自动连线
私人SpitTerrespository SpitTerrespository;
@RequestMapping(value=“/login”,method=RequestMethod.GET)
公共字符串登录(模型){
addAttribute(“spitter”,新spitter());
返回“spitter/login”;
}
@RequestMapping(value=“/loginForm”,method=RequestMethod.POST)
公共字符串登录(@modeldattribute(“spitter”)spitter-spitter){
System.out.println(spitter.getUsername()+“logined..”;
返回“重定向:主页”;
}
@RequestMapping(value=“/register”,method=RequestMethod.GET)
公共字符串showRegistrationForm(模型){
addAttribute(“spitter”,新spitter());
返回“spitter/RegisterPerform”;
}
@RequestMapping(value=“/register”,method=RequestMethod.POST)
公共字符串寄存器(@modeldattribute(“spitter”)spitter-spitter){
spitterRepository.addSpitter(spitter);
返回“spitter/registerSuccessfully”;
}
@请求映射(“/home”)
公共字符串hello(){
返回“spitter/helloWorld”;
}
}

这是您的解决方案。将SecurityConfig.configure方法中的“/spitter/home”替换为“/*”。您需要spring安全性来拦截除“/spitter/login”请求之外的所有请求。

这是我的github url:这是您告诉spring的。您的表单正在直接发布到控制器,并且绕过了Spring Security…我覆盖了WebSecurity配置适配器中的配置,并定义了一些规则。我不知道为什么我的表单直接发布到控制器。。。我只想在请求“/home”时,我可以通过UserDetailsService验证用户的角色。因为这就是您在表单中所做的。您应该发布
/login
,以便它由Spring Security处理……我想,您需要在某个地方声明,/*模式需要被Spring Security配置拦截,并且必须由SpitterUserDetailsService处理。那么/spitter/login和/spitter/home URL呢?他们是否也绕过了spring安全性?