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

尽管用户名和密码正确,Spring Security登录仍失败

闻人树
2023-03-14

早上好,我在登录使用Spring Security的应用程序时遇到了问题。每次我尝试登录时(即使用户名和密码正确),应用程序都会将我重定向到失败url(在我的情况下是:/login?error=true)。密码是用BCrypt加密的,我使用MySQL数据库来存储它们。

应用程序基于Spring in Action 5:https://github.com/habuma/spring-in-action-5-samples/tree/master/ch04/tacos的代码

我的代码:

用户类

@Entity
@Data
@NoArgsConstructor
@Table(name = "Users")
public class User implements UserDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private String password;
    private String email;

    public User(String username, String password, String email) {
        this.username = username;
        this.password = password;
        this.email = email;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return null;
    }

    @Override
    public boolean isAccountNonExpired() {
        return false;
    }

    @Override
    public boolean isAccountNonLocked() {
        return false;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return false;
    }

    @Override
    public boolean isEnabled() {
        return false;
    }

}

安全配置

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Qualifier("userService")
    @Autowired
    private UserDetailsService userDetailsService;

    @Bean
    public PasswordEncoder encoder() {
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception{
        auth.userDetailsService(userDetailsService)
            .passwordEncoder(encoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception{
        http.authorizeRequests()
                .antMatchers("/calendar")
                    .hasRole("USER")
                .antMatchers("/","/**").permitAll()
                .and()
                    .formLogin()
                        .loginPage("/login")
                        .defaultSuccessUrl("/calendar")
                        .failureUrl("/login?error=true")
                .and()
                    .logout()
                        .logoutSuccessUrl("/");
    }

}

用户服务

@Service
public class UserService implements UserDetailsService {

    private UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository){
        this.userRepository = userRepository;
    }

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username);
        if(user != null){
            return user;
        }
        throw new UsernameNotFoundException("Username not found: "+username);
    }
}

控制器

@Controller
@RequestMapping("/register")
public class UserController {

    private UserRepository userRepository;
    private PasswordEncoder passwordEncoder;

    @Autowired
    public UserController(UserRepository userRepository, PasswordEncoder passwordEncoder){
        this.userRepository = userRepository;
        this.passwordEncoder = passwordEncoder;
    }

    @ModelAttribute
    public void calendar(Model model){
        model.addAttribute("user", new User());
    }

    @GetMapping
    public String register(){
        return "register";
    }

    @PostMapping
    public String addUser(@ModelAttribute User user){
        User newUser = new User(user.getUsername(),passwordEncoder.encode(user.getPassword()),user.getEmail());
        userRepository.save(newUser);
        return "redirect:/login";
    }

}

登录表格(Thymeleaf)

    <form th:method="POST" th:action="@{/login}">
        <div class="formInputs">
            <label for="username">Username</label>
            <input id="username" name="username" type="text">
        </div>
        <div class="formInputs">
            <label for="password">Password</label>
            <input id="password" name="password" type="password">
        </div>
        <div style="clear: both"></div>
        <input type="submit" value="Log in">
    </form>

登记表

<form method="POST" th:action="@{/register}" th:object="${user}">
            <div class="formInputs">
                <label for="username">Username</label>
                <input id="username" type="text" th:field="*{username}">
            </div>
            <div class="formInputs">
                <label for="password">Password</label>
                <input id="password" type="password" th:field="*{password}">
            </div>
            <div class="formInputs">
                <label for="email">Email</label>
                <input id="email" type="email" th:field="*{email}">
            </div>
            <div style="clear: both"></div>
            <input type="submit" value="Register">
            <input type="reset" value="Reset">
        </form>

如果有人能帮我找到解决方案,我将不胜感激,提前谢谢。

共有1个答案

公良奇
2023-03-14

确保您的用户返回启用=true,以及isAccount tNonExpired=true(以及所有其他人,如isAccount tNonLocked)。还返回一个空的权限列表,而不是null。

否则,Spring Security会将您的用户视为已禁用/锁定/无论什么,并且不允许您登录。

 类似资料:
  • 我正在为Dynamics GP编写加载项,并尝试运行自定义存储过程,但当我尝试打开连接时,我收到一条错误消息,显示“用户登录失败:”。 如果手动使用系统管理员用户名和密码,则所有操作都会正确执行。但是,我想使用登录Dynamics GP的人的用户名和密码。 这是完整堆栈跟踪: 如果我将中的更改为使用,它看起来根本找不到网络上的数据源并给出错误: 如果我将连接字符串打印到屏幕上,它看起来是正确的,正

  • 我已经安装了Jenkins ver。OSX 10.11.3上的1.653,使用标准安装程序并添加git插件。我试着从github为公共项目创建一个作业,它成功了。现在,我试图创建私人回购作业使用用户名和密码,但它总是失败。这是日志: 在工作区中构建/Users/Shared/Jenkins/Home/workspace/MyProject git rev-parse --is-inside-wor

  • 本文向大家介绍php+MySQL实现登录时验证登录名和密码是否正确,包括了php+MySQL实现登录时验证登录名和密码是否正确的使用技巧和注意事项,需要的朋友参考一下 直入主题,先看php校验登录名和密码是否正确的代码: 效果图: 以上就是本文的全部内容,希望对大家学习php程序设计有所帮助。

  • 我喜欢用户按公司名称、用户名和密码登录-他们需要输入所有这些字段。 和字段在表中。在表中。 可以在表中重复,但是每个用户名属于不同的公司名。在表中定义。 如何根据公司名称、用户名和密码进行身份验证? 我查看了方法。 我不能覆盖它,因为我需要传递属于公司的特定用户,然后进行身份验证检查。 更新:

  • 问题内容: 我需要输入USER表的USER_ID字段作为另一个表中的外键。因此,我认为我需要在用户登录时启动一个会话。我很难让它在任何地方回显。我能够启动一个会话,该会话允许我回显USERNAME,但无法将其复制为ID。 请帮忙吗?我的处理代码如下。我还粘贴了本节,我暂时尝试对其进行回显以进行测试。 处理脚本: 我希望USER_ID出现在哪里: 问题答案: 使用FETCH_ASSOC而不是FETC

  • 首次登陆的用户名和密码有二个,分别为: 用户名:admin     密码 :admin 用户名:user0     密码:user0 账号admin是系统管理员权限,账号user0是普通用户,属于设计角色,拥有设计权限。 在登录后,注意更改账号密码。