我是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
注释的。
我尝试使用用户名和密码连接到我的一个网络服务,每次更改用户名时,即使用户名与我在我的属性文件中的用户名不同,也会验证请求
答案 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,则具有该角色的用户将被授予访问权限,对于任何其他角色,它将发送访问被拒绝响应。 因此,它不会使用任何密码对用户进行身份验证。