Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法使用Spring引导安全性登录_Java_Spring_Spring Boot_Spring Security - Fatal编程技术网

Java 无法使用Spring引导安全性登录

Java 无法使用Spring引导安全性登录,java,spring,spring-boot,spring-security,Java,Spring,Spring Boot,Spring Security,我有一个带有MySQL的Spring Boot应用程序。我可以将用户保存在数据库中,但当我尝试登录时,它总是说用户名或密码不正确。即使我硬编码一个用户,它仍然不起作用 我使用及其上的代码创建了设置 这是我正在使用的代码 安全配置: @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired UserDetailsService userDetai

我有一个带有MySQL的Spring Boot应用程序。我可以将用户保存在数据库中,但当我尝试登录时,它总是说用户名或密码不正确。即使我硬编码一个用户,它仍然不起作用

我使用及其上的代码创建了设置

这是我正在使用的代码

安全配置:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    UserDetailsService userDetailsService;

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

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests(authorize -> authorize
                        .antMatchers("/static/**", "/index").permitAll()
                        .antMatchers("/premium/**").hasAuthority("PREMIUM")
                        .antMatchers("/user/**").hasAuthority("USER")
                )
                .formLogin(formLogin -> formLogin
                        .loginPage("/login")
                        .failureUrl("/login-error")
                );
    }

    @Bean
    public PasswordEncoder getPasswordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }
}
我的用户详细信息服务

public class MyUserDetailsService implements UserDetailsService {

    @Autowired
    UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Optional<User> user = userRepository.findByUsername(username);
        user.orElseThrow(() -> new UsernameNotFoundException("Can't find user " + username));
        return user.map(MyUserDetails::new).get();
    }
}
@Service("userDetailsService")
public class MyUserDetailsService implements UserDetailsService {
...
登录页面上的登录表单

<p th:if="${loginError}" class="error">Wrong user or password</p>
<form th:action="@{/login}" method="post" class="login100-form validate-form p-l-55 p-r-55 p-t-178">
        <span class="login100-form-title">
            Sign In
        </span>

    <div class="wrap-input100 validate-input m-b-16" data-validate="Please enter username">
        <input class="input100" type="text" name="username" placeholder="Username">
        <span class="focus-input100"></span>
    </div>

    <div class="wrap-input100 validate-input" data-validate = "Please enter password">
        <input class="input100" type="password" name="password" placeholder="Password">
        <span class="focus-input100"></span>
    </div>

    <div class="text-right p-t-13 p-b-23">
            <span class="txt1">
                Forgot
            </span>

        <a href="#" class="txt2">
            Username / Password?
        </a>
    </div>

    <div class="container-login100-form-btn">
        <button class="login100-form-btn">
            Sign in
        </button>
    </div>
</form>

错误的用户或密码

登录 忘记 登录
我没有登录的POST映射,因为它应该由SpringSecurity提供。然而,我怀疑问题一定在哪里,因为我在UserDetails和UserDetails服务中都有log语句,但没有一个被调用


你能帮我找出这里的问题吗

我明白了。有两个问题

系统使用默认设置

inMemoryUserDetailsManager 
而不是我的UserDetailsService实现。我不知道如何关闭inMemoryUserDetailsManager,但我发现了如何使用我的实现。您需要使用@service(“userDetailsService”)对服务进行注释

第二个问题是用户。它们需要将“enabled”的值设置为true。如果设置为false,则弹簧将其视为非活动状态

public void saveUser(User user) {
    user.setAuthorities("USER");
    user.setEnabled(true);
    ...

现在它对我起作用了。

您提供的示例没有初始数据库,所以可以假设您直接在数据库中手动添加用户,对吗?在这种情况下,必须对密码进行编码(默认为bcrypt)。尝试使用online generator获取纯文本密码的哈希值,然后将此哈希值插入数据库:我正在使用应用程序的另一部分存储调用userRepository.save(user)的用户。在SecurityConfig中,我使用的是NoOpPasswordEncoder。密码以未加密的纯文本形式保存到数据库中。你确定我需要使用加密吗?在在线教程中,他们总是使用NoOpPasswordEncoder,它对他们有效。不,对你来说没关系。此示例基于较旧的Spring Boot,在最新版本中,“NoOpPasswordEncoder”已弃用,默认情况下进行密码加密。我将代码更改为使用BCryptPasswordEncoder。密码现在在数据库中散列,但日志记录仍然不起作用。
inMemoryUserDetailsManager 
@Service("userDetailsService")
public class MyUserDetailsService implements UserDetailsService {
...
public void saveUser(User user) {
    user.setAuthorities("USER");
    user.setEnabled(true);
    ...