我正在使用Spring Security开发一个简单的Spring启动应用程序。我硬编码了用户名和密码,但问题是我可以用任何用户名登录,只有密码由Spring Security检查。
以下是代码:
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter {
public final MyUserDetailsService userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
MyUserDetails服务类:
@Service
public class MyUserDetailsService implements UserDetailsService {
private static final String USERNAME = "john";
private static final String PASSWORD = "$2a$10$5yPLXyd0J2TEHhsbD3Azjumpn6OePKsiV1XPpFaZfytT33mRAn3N6";
@Override
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
return new org.springframework.security.core.userdetails
.User(USERNAME, PASSWORD, new ArrayList<>());
}
}
Rest控制器类:
@RestController
public class ApiController {
@GetMapping("/hello")
public String sendMoney() {
return "Hello World!";
}
}
我将用户名“john”和密码“test”硬编码为BCrypt加密。但问题是,我可以用任何用户名登录,只有密码应该是“test”。谁能解释一下原因吗?为什么Spring Security只检查密码为“test”,而不检查用户名为“john”?任何反馈都将受到重视。非常感谢。
您似乎忽略了参数s
to:
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
换句话说,无论代码被要求检索什么用户细节,它都会检索硬编码的细节。用户“不是约翰”?我们当然有。用户“不存在”?我们也有,等等。
我猜您的目的是检查s
是否等于“john”
,如果请求的用户名是“john”
,则只返回硬编码的用户详细信息。
这是故意的<代码>用户详细信息服务。loadUserByUsername(字符串用户)应提供与用户
对应的记录。使用硬编码记录是可以接受的,但您有责任控制用户名是否正确。
但事实上,如果您希望SpringSecurity同时测试用户名和密码,则不应该实现自定义的UserDetailService
,而应该直接使用一个现成的InMemoryUserDetailsManager
。
IntelliJ似乎认为我的代码有一个潜在的错误,我不太明白为什么。这与注释有关;我告诉IntelliJ,有些字段不能为空,我确保它们永远不被允许为空,但是IntelliJ仍然不喜欢它。 下面是一个有问题的代码示例。 当我这样做时,IntelliJ的检查员会在setId(Long)方法原型的参数上生成一个警告,警告我的类字段用注释。这是在尽管我手动检查null在身体的方法 但是,如果我将方法更改为
我试图检查密码,我加密之前,但我得到一个例外,我不知道为什么。 这里是我用来加密密码的方法: 加密工作成功。 此处为错误日志: 有什么想法吗?感谢你的帮助.
问题内容: 谁能推荐一个Java库,其中包含适用于在Webapp中执行服务器端密码强度检查的方法。理想情况下,检查程序应为: 可配置的,允许部署者提供不同的字典,调整不同标准的权重,等等 可扩展,允许在需要时实施新标准 用纯Java实现 根本没有与标记库,UI组件或“密码管理”功能交织在一起 与GPL 3项目兼容 与弹簧接线兼容 Mavenized(可通过Maven Central获得) 问题答案
我在我的应用程序中使用LDAP身份验证。我使用以下代码: 使用空密码进行身份验证。我知道我需要插入一个空密码检查,因为在这种情况下并不是所有的LDAP服务器都返回错误。如何以及在哪里插入空白密码的检查更好?
问题内容: 我想检查一个变量是否具有多个值之一。我对为什么在这种情况下不起作用感到困惑。我正在按照给出该示例的教程进行操作,但是当我尝试执行此操作时,它只会根据第一个值检查变量。我的支票怎么了? 问题答案: (“Jesse” or “jesse”) 上面的表达式测试是否评估为。如果是这样,则表达式将返回它;否则,它将返回。该表达式等同于编写: 因为是一个非空字符串,所以它将 始终 求值为并因此返回