#spring #spring-boot #spring-mvc #spring-security
#spring #spring-загрузка #spring-mvc #spring-безопасность
Вопрос:
homeControler
package com.book.controller;
import java.util.Locale;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.book.entity.User;
import com.book.entity.security.UserToken;
import com.book.entity.security.service.SecurityService;
import com.book.entity.security.service.UserTokenService;
@Controller
public class HomeController {
@Autowired
private UserTokenService userTokenService;
@Autowired
private SecurityService securityService;
@RequestMapping("/")
public String getHome() {
return "index";
}
@RequestMapping("/myaccount")
public String myAccount() {
return "myAccount";
}
@RequestMapping("/login")
public String login(Model model) {
model.addAttribute("classActiveLogin", true);
return "myAccount";
}
@RequestMapping("/forgetPassword")
public String forgetPassword(Model model) {
model.addAttribute("classActiveForgetPassword", true);
return "myAccount";
}
@RequestMapping("/newUser")
public String newUser(Locale locale, @RequestParam("token") String token, Model model) {
UserToken userToken = userTokenService.getPasswordResetToken(token);
if (userToken == null) {
String msg = "Invalid Token";
model.addAttribute("msg", msg);
return "redirect:/badRequest";
}
User user = userToken.getUser();
String username = user.getUsername();
UserDetails userDetails = securityService.loadUserByUsername(username);
Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(),
userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
model.addAttribute("classActiveEdit", true);
return "myProfile";
}
}
Пользовательский токен
package com.book.entity.security;
import java.util.Calendar;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import com.book.entity.User;
@Entity
public class UserToken {
private static final int EXPIRATION = 60 * 24;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String token;
@OneToOne(targetEntity = User.class, fetch = FetchType.EAGER)
@JoinColumn(nullable=false, name="user_id")
private User user;
private Date expiryDate;
public UserToken(final String token, final User user) {
super ();
this.token = token;
this.user = user;
this.expiryDate = calculateExpiryDate(EXPIRATION);
}
private Date calculateExpiryDate (final int expiryTimeInMinutes) {
final Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(new Date().getTime());
cal.add(Calendar.MINUTE, expiryTimeInMinutes);
return new Date(cal.getTime().getTime());
}
public void updateToken(final String token) {
this.token = token;
this.expiryDate = calculateExpiryDate(EXPIRATION);
}
@Override
public String toString() {
return "P_Token [id=" id ", token=" token ", user=" user ", expiryDate=" expiryDate "]";
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Date getExpiryDate() {
return expiryDate;
}
public void setExpiryDate(Date expiryDate) {
this.expiryDate = expiryDate;
}
public static int getExpiration() {
return EXPIRATION;
}
}
UserTokenService
package com.book.entity.security.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.book.entity.User;
import com.book.entity.security.UserToken;
import com.book.entity.security.repo.PasswordResetRepo;
import com.book.entity.security.repo.UserTokenRepo;
@Service("userTokenService")
public class UserTokenService implements UserTokenRepo{
@Autowired
private PasswordResetRepo repo;
@Override
public UserToken getPasswordResetToken(final String token) {
return repo.findByToken(token);
}
@Override
public void createPasswordResetTokenForUser(final User user, final String token) {
final UserToken myToken = new UserToken(token, user);
repo.save(myToken);
}
}
UserTokenRepo
package com.book.entity.security.repo;
import com.book.entity.User;
import com.book.entity.security.UserToken;
public interface UserTokenRepo {
UserToken getPasswordResetToken(final String token);
void createPasswordResetTokenForUser(final User user, final String token);
}
SecurityService
package com.book.entity.security.service;
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;
import com.book.entity.User;
import com.book.entity.security.repo.SecurityUserRepository;
@Service
public class SecurityService implements UserDetailsService {
@Autowired
private SecurityUserRepository securityUserRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = securityUserRepository.findByUsername(username);
if (null == user) {
throw new UsernameNotFoundException("Username not found");
}
return user;
}
}
PasswordResetRepo
package com.book.entity.security.repo;
import java.util.Date;
import java.util.stream.Stream;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import com.book.entity.User;
import com.book.entity.security.UserToken;
public interface PasswordResetRepo extends JpaRepository<UserToken, Long > {
UserToken findByToken(String token);
UserToken findByUser(User user);
Stream<UserToken> findAllByExpiryDateLessThan(Date now);
@Modifying
@Query("delete from P_Token t where t.expirydate <= ?1")
void deleteAllExpiredSince(Date now);
}
Ошибка:—>
org.springframework.beans.factory.Исключение UnsatisfiedDependencyException: ошибка при создании компонента с именем ‘HomeController’: Неудовлетворенная зависимость, выраженная через поле ‘userTokenService’; вложенным исключением является org.springframework.beans.factory.Исключение UnsatisfiedDependencyException: ошибка при создании компонента с именем ‘userTokenService’: Неудовлетворенная зависимость, выраженная через поле ‘repo’; вложенным исключением является org.springframework.beans.factory.Исключение BeanCreationException: ошибка при создании компонента с именем ‘passwordResetRepo’: не удалось вызвать метод init; вложенным исключением является java.lang.Ошибка NoClassDefFoundError: исключение antlr / RecognitionException
Комментарии:
1. Можете ли вы предоставить код для PasswordResetRepo? Помечено ли оно как компонент?
2. это интерфейс
Ответ №1:
Возможно, проблема кроется в HomeController
приведенном ниже коде:
@Autowired
private UserTokenService userTokenService;
Замените этот код приведенным ниже кодом:
@Autowired
private UserTokenRepo userTokenService;
Ваша основная ошибка заключается в:
Неудовлетворенная зависимость, выраженная через поле ‘repo’; вложенным исключением является org.springframework.beans.factory.Исключение BeanCreationException: ошибка при создании компонента с именем ‘passwordResetRepo’: не удалось вызвать метод init; вложенным исключением является java.lang.Ошибка NoClassDefFoundError: исключение antlr / RecognitionException
Здесь не удалось создать компонент passwordResetRepo
, потому что antlr/RecognitionException
Его решением является java.lang.Исключение ClassNotFoundException: antlr.Исключение RecognitionException показывает, что библиотека antlr отсутствует.
Добавьте его, и все готово 🙂
Вы можете попробовать добавить следующую зависимость. Это решит вашу проблему.
<dependency>
<groupId>org.antlr</groupId>
<artifactId>antlr-complete</artifactId>
<version>3.5.2</version>
</dependency>
Другое возможное соображение:
Пожалуйста, проверьте все запросы JPA в PasswordResetRepo
репозитории. Иногда, если запрос не соответствует имени переменной сущности, Spring не может создать компонент для этого репозитория
Надеюсь, это решит вашу проблему.
Спасибо 🙂
Ответ №2:
Взгляните на трассировку стека. Проблема в том, что контейнеру spring IoC не удается создать homeController
компонент; потому что контейнеру не удается создать userTokenService
компонент; и это потому, что контейнеру не удается создать passwordResetRepo
компонент с java.lang.NoClassDefFoundError
помощью.
Добавление следующего в ваш конфигурационный файл должно решить вашу проблему:
<jpa:repositories base-package="com.book.entity.security.repo" />
Поскольку вы используете Spring Boot, пожалуйста, ознакомьтесь с этим руководством по доступу к данным с помощью JPA.
Из вышеупомянутого руководства:
По умолчанию Spring Boot включает
JPA
поддержку репозитория и просматривает пакет (и его подпакеты), где@SpringBootApplication
находится. Если в вашей конфигурации естьJPA
определения интерфейса репозитория, расположенные в невидимом пакете, вы можете указать альтернативные пакеты, используя@EnableJpaRepositories
и его типобезопасныйbasePackageClasses=MyRepository.class
параметр.
Комментарии:
1. сэр, но я использую spring Boot, и я полностью новичок в spring… пожалуйста, дайте мне ценные предложения. большое спасибо, сэр. пожалуйста, скажите мне, что такое файл confg в моем проекте?
2. @JahadulRakib, я обновил ответ в соответствии с вашим комментарием. Пожалуйста, взгляните.
3. большое спасибо, сэр … я запрашиваю вас в fb, когда вижу, что вы остаетесь в Дакке.