【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