Spring boot basic auth 用户名未验证

Spring boot basic auth username is not validated

我是 spring 安全的新手,我已经为我的 spring 引导应用程序创建了一个基本身份验证来试用它

我已经创建了 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 注释。

每次我更改用户名时,我都会尝试邮递员使用用户名和密码连接到我的一项 Web 服务,即使用户名与我在属性文件中输入的用户名不同,请求也会得到验证

这是因为您在所有情况下都returning 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() 方法中创建用户时使用的密码。在此方法中,您只能通过用户名和 return 找到用户,此处未进行身份验证,但身份验证是由 spring 在内部完成的,并且它与您在创建用户时传递的密码相匹配(和 returning) 以及您在请求中传递的密码。它还会验证您正在访问的 url 的用户角色,如果 url 映射到任何特定角色,则具有该角色的用户将获得访问权限,对于任何其他角色,它将发送拒绝访问响应. 因此,它不会使用任何密码对用户进行身份验证。