LoginSignup
ttf1998seiya
@ttf1998seiya (せいや)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【Spring Security】 LoginUserDetailsのコンストラクターでエラーが発生する

実現したいこと

現在、【はじめてのSpringBoot[改訂版]】を使用し、ログイン機能を作成しようとしています。

DBマイグレーションはFlywayを使用しています。

しかし、SpringBootのバージョンアップに伴い、リポジトリのfindOneメソッドが、

findByIdメソッドに代わり、Optional<※※※>をつけて使用しているのですが、

LoginUserDetailsのコンストラクターでエラーが発生してしまい、うまく動作ができない状況です。

Spring Boot初学者です。

使用環境

ー Mac OS
ー Java11
ー SpringBoot 2.5.4
ー SpringToolSuite 4.0

コード

LoginUserDetails.java
import com.example.hajibootthymeleaf.domain.User;
import lombok.Data;

import java.util.Optional;

import org.springframework.security.core.authority.AuthorityUtils;

@Data
public class LoginUserDetails extends org.springframework.security.core.userdetails.User {
    private final Optional<User> user;

    public LoginUserDetails(Optional<User> user) {
        super(user.getUsername(), user.getEncodedPassword(), 
                       ⬆︎エラー                                ⬆︎エラー
AuthorityUtils.createAuthorityList("ROLE_USER"));
        this.user = user;
    }
}

error
The method getEncodedPassword() is undefined for the type Optional<User>
LoginUserDetailsService.java
import com.example.hajibootthymeleaf.domain.User;
import com.example.hajibootthymeleaf.repository.UserRepository;

import java.util.List;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

public class LoginUserDetailsService implements UserDetailsService {
    @Autowired
    UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Optional<User> user = userRepository.findById(username);
        if (user == null) {
            throw new UsernameNotFoundException("The requested user is not found.");
        }
        return new LoginUserDetails(user);
    }
}

userRepository.java
import com.example.hajibootthymeleaf.domain.User;

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, String> {
}

user.java
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import javax.persistence.*;
import java.util.List;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "users")
@ToString(exclude = "customers")
public class User {
    @Id
    private String username;
    @JsonIgnore
    private String encodedPassword;
    @JsonIgnore
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "user")
    private List<Customer> customers;
}
aprication.properties
spring.datasource.driver-class-name=net.sf.log4jdbc.DriverSpy
spring.datasource.url=jdbc:log4jdbc:h2:file:./target/db/customer
logging.level.jdbc=OFF
logging.level.jdbc.sqltiming=DEBUG
spring.jpa.hibernate.ddl-auto=validate

security.basic.enabled=false

かなり詰まっていまして、どうにも解決できません。

ご教授いただければ幸いです。

どうぞよろしくお願い致します。

0

No Answers yet.

Your answer might help someone💌