Spring boot基本身份验证用户名未经过验证

时间:2017-03-09 22:03:31

标签: spring spring-boot spring-security basic-authentication

我是Spring安全的新手,我为我的春季启动应用程序创建了一个基本的auth来试用它

我创建了MYGlobalAuthenticationConfigurerAdapter 像这样:

@Value("${username}")
    String username;

    @Value("${password}")
    String password;

    @Override
    public void init(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService());
    }

    @Bean
    public UserDetailsService userDetailsService() {
        return new UserDetailsService() {

            @Override
            public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
                return new User(username, password, true, true, true, true,
                        AuthorityUtils.createAuthorityList("USER"));
            }
        };
    }

请注意,我从属性文件加载用户名和密码,然后验证值

和MyWebSecurityConfigurerAdapter是这样的:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().anyRequest().fullyAuthenticated().and().
    httpBasic().and().
    csrf().disable();
} 
带有@EnableWebSecurity注释的

我尝试使用用户名和密码连接到我的一个网络服务,每次更改用户名时,即使用户名与我在我的属性文件中的用户名不同,也会验证请求

1 个答案:

答案 0 :(得分:2)

这是因为您在所有情况下都返回User对象,而不检查参数中收到的对象。请尝试以下代码:

@Value("${username}")
    String username;

    @Value("${password}")
    String password;

    @Override
    public void init(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService());
    }

    @Bean
public UserDetailsService userDetailsService() {
    return new UserDetailsService() {

        @Override
        public UserDetails loadUserByUsername(String name) throws UsernameNotFoundException {
            if(name.equals(username)){
                return new User(username, password, true, true, true, true,
                    AuthorityUtils.createAuthorityList("USER"));
            }else{
                throw new UsernameNotFoundException("Could not find the user '" + name + "'");
            }

        }
    };
}

<强>更新

用户不会被任何密码验证,只能使用您在loadUserByUsername()方法内的用户创建中使用的密码。在此方法中,您只能通过用户名和返回找到用户,此处不会进行身份验证,但是身份验证是在春季内部完成的,它与您在创建用户(并返回)时使用的密码相匹配,密码由您传递请求。它还验证用户对您正在访问的URL的角色,如果为任何特定角色映射了url,则具有该角色的用户将被授予访问权限,对于任何其他角色,它将发送访问被拒绝响应。 因此,它不会使用任何密码对用户进行身份验证。