Null被传递给Spring Security UserDetailsS​​ervice

时间:2013-11-07 20:42:53

标签: spring spring-mvc spring-security

我正在尝试使用spring security添加登录到我的webapp。

这是我第一次尝试使用纯代码配置添加spring-security 3.2(之前我已经多次使用xml配置和标准UserDetailsService实现)。

我还看到了关于转向3.2的其他类似问题,但都涉及到csrf的东西 - 我目前已经禁用它来统治这些更改。

我的配置如下:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired private UserDetailsServiceImpl userDetailsServiceImpl;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf()
                .disable()
            .authorizeRequests()
                .antMatchers("/resources/**").permitAll()
                .antMatchers("/dashboard").permitAll()
                .antMatchers("/sign-up").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/")
                .loginProcessingUrl("/loginprocess")
                .failureUrl("/?loginFailure=true")
                .permitAll()
                .and()
            .logout()
                .logoutUrl("/logout")
                .permitAll();
    }

     @Override
     protected void registerAuthentication(AuthenticationManagerBuilder auth) throws Exception {
         auth
            .userDetailsService(userDetailsServiceImpl)
            .passwordEncoder(bCryptPasswordEncoder());
     }

     @Bean 
     public BCryptPasswordEncoder bCryptPasswordEncoder(){
         return new BCryptPasswordEncoder();
     }

我的登录表单如下:

<form class="form-signin" action="loginprocess" method="POST">
    <h3 class="form-signin-heading">Already Registered?</h3>
    <input type="text" class="form-control" name='j_username' placeholder="User name">
    <input type="password" class="form-control" name='j_password' placeholder="Password"><br/>
    <input class="btn btn-lg btn-primary" name="submit" type="submit" value='Sign in' >
    <a class="btn btn-lg btn-primary" href="#" >Sign up</a>
</form>

最后,我尝试登录并在调试和处理代码时,在我的UserDetailsS​​ervice实现中:

@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {
    username = username.toLowerCase();

我看到在这里传递的用户名字符串总是为null - 因为这是由底层弹簧机制调用的所有内容我正在努力查看我提交的登录表单中的值发生了什么。

我之前已经看过并浏览了包含UsernamePasswordAuthenticationFilter类的spring代码,似乎getsUsername(request)调用刚刚从请求中获取null。

任何人都可以告知可能出现的问题或者开始寻找的好地方吗?春天在请求对象中设置用户名/密码在哪里?


更新

我还尝试更改表单的操作URL并发布到普通的MVC控制器 - 调试,发布的数据在参数Map中存在并且正确 - 所以它似乎是安全链中的某个东西从请求中删除我发布的数据?

1 个答案:

答案 0 :(得分:2)

文档建议用户名/密码字段必须具有特定名称: -

http://docs.spring.io/spring-security/site/docs/3.2.0.CI-SNAPSHOT/reference/htmlsingle/#jc

  

用户名必须作为名为username

的HTTP参数出现      

密码必须作为名为password

的HTTP参数出现

尝试一下,看看它是否有效?