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 映射到任何特定角色,则具有该角色的用户将获得访问权限,对于任何其他角色,它将发送拒绝访问响应.
因此,它不会使用任何密码对用户进行身份验证。
我是 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 映射到任何特定角色,则具有该角色的用户将获得访问权限,对于任何其他角色,它将发送拒绝访问响应. 因此,它不会使用任何密码对用户进行身份验证。