当前位置: 首页 > 知识库问答 >
问题:

为什么这个Spring Security实现只检查密码而不检查用户名?

葛季萌
2023-03-14

我正在使用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”?任何反馈都将受到重视。非常感谢。

共有2个答案

梁渊
2023-03-14

您似乎忽略了参数sto:

    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {

换句话说,无论代码被要求检索什么用户细节,它都会检索硬编码的细节。用户“不是约翰”?我们当然有。用户“不存在”?我们也有,等等。

我猜您的目的是检查s是否等于“john”,如果请求的用户名是“john”,则只返回硬编码的用户详细信息。

梁丘宏硕
2023-03-14

这是故意的<代码>用户详细信息服务。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”) 上面的表达式测试是否评估为。如果是这样,则表达式将返回它;否则,它将返回。该表达式等同于编写: 因为是一个非空字符串,所以它将 始终 求值为并因此返回