[英]Forgot password implementation spring security
我正在嘗試使用Spring Security實現“ 忘記密碼 ”字段。 但是我嘗試解決一個錯誤,但是找不到解決方案。 我知道JpaRepository會執行一些批處理和CRUD操作。 我的user.java
模型類具有所有字段(.... email,resetToken)。
UserRepositoryDao:
@Repository("userRepository")
public interface UserRepositoryForgetPassword extends JpaRepository<User, Long>{
Optional<User> findByEmail(String email);
Optional<User> findByResetToken(String resetToken);
}
UserServiceForgotPassword:
public interface UserServiceForgetPassword {
public Optional<User> findUserByEmail(String email);
public Optional<User> findUserByResetToken(String resetToken);
public void save(User user);
}
UserServiceForgotPasswordImpl:
@Service("userServiceForgetPassword")
public class UserServiceForgetPasswordImpl implements UserServiceForgetPassword {
@Autowired
UserRepositoryForgetPassword userRepositoryForgetPassword;
@Override
@Transactional
public Optional<User> findUserByEmail(String email) {
return userRepositoryForgetPassword.findByEmail(email);
}
@Override
@Transactional
public Optional<User> findUserByResetToken(String resetToken) {
return userRepositoryForgetPassword.findByResetToken(resetToken);
}
@Override
@Transactional
public void save(User user) {
userRepositoryForgetPassword.save(user);
}
}
錯誤:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'fogetPasswordController': Unsatisfied dependency expressed through field 'userServiceForgetPassword'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userServiceForgetPassword': Unsatisfied dependency expressed through field 'userRepositoryForgetPassword'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.pulseBeatMaster.dao.UserRepositoryForgetPassword' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
控制器:
@RestController
public class FogetPasswordController {
@Autowired
UserServiceForgetPassword userServiceForgetPassword;
@Autowired
EmailServiceForgetPassword emailServiceForgetPassword;
@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;
//Do the stuffs
}
我希望擴展JpaRepository
。
已編輯
@Configuration
@PropertySource(value = { "classpath:application.properties" })
public class ApplicationContextConfig {
// To get properties from application.properties
// Import @PropertySource(value = { "classpath:application.properties" })
// Have to use environment.getRequiredProperty();
@Autowired
private Environment environment;
@Bean(name = "dataSource")
public DataSource getDataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName"));
dataSource.setUrl(environment.getRequiredProperty("jdbc.url"));
dataSource.setUsername(environment.getRequiredProperty("jdbc.username"));
dataSource.setPassword(environment.getRequiredProperty("jdbc.password"));
// normally
// dataSource.setDriverClassName("com.mysql.jdbc.Driver");
return dataSource;
}
private Properties getHibernateProperties() {
Properties properties = new Properties();
properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect"));
properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql"));
properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql"));
properties.put("hibernate.id.new_generator_mappings",
environment.getRequiredProperty("hibernate.new_generator_mappings"));
properties.put("current_session_context_class", "org.springframework.orm.hibernate5.SpringSessionContext");
return properties;
}
@Autowired
@Bean(name = "sessionFactory")
public SessionFactory getSessionFactory(DataSource dataSource) {
LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);
sessionBuilder.addProperties(getHibernateProperties());
sessionBuilder.addAnnotatedClasses(Employee.class);
sessionBuilder.addAnnotatedClasses(Department.class);
sessionBuilder.addAnnotatedClasses(Company.class);
sessionBuilder.addAnnotatedClasses(User.class);
sessionBuilder.addAnnotatedClasses(UserProfile.class);
sessionBuilder.addAnnotatedClasses(UserProfileType.class);
sessionBuilder.addAnnotatedClasses(PersistentLogin.class);
sessionBuilder.addAnnotatedClasses(GaugeCategory.class);
sessionBuilder.addAnnotatedClasses(Survey.class);
sessionBuilder.addAnnotatedClasses(PreferredUrl.class);
sessionBuilder.addAnnotatedClasses(Gauge.class);
sessionBuilder.addAnnotatedClasses(GaugeFeedback.class);
sessionBuilder.addAnnotatedClasses(Customer.class);
sessionBuilder.addAnnotatedClasses(Phone.class);
return sessionBuilder.buildSessionFactory();
}
@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(getDataSource());
sessionFactory.setPackagesToScan(new String[] { "com.pulseBeatMaster.model" });
sessionFactory.setHibernateProperties(getHibernateProperties());
return sessionFactory;
}
@Autowired
@Bean(name = "transactionManager")
public HibernateTransactionManager getTransactionManager(SessionFactory sessionFactory) {
HibernateTransactionManager transactionManager = new HibernateTransactionManager(sessionFactory);
return transactionManager;
}
@Bean
public JavaMailSender getMailSender() {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
// Using gmail
mailSender.setHost(environment.getRequiredProperty("mailSender.host"));
mailSender.setPort(587);
mailSender.setUsername(environment.getRequiredProperty("mailSender.username"));
mailSender.setPassword(environment.getRequiredProperty("mailSender.password"));
Properties javaMailProperties = new Properties();
javaMailProperties.put("mail.smtp.starttls.enable", "true");
javaMailProperties.put("mail.smtp.auth", "true");
javaMailProperties.put("mail.transport.protocol", "smtp");
javaMailProperties.put("mail.debug", "true");// Prints out everything on
// screen
mailSender.setJavaMailProperties(javaMailProperties);
return mailSender;
}
}
你需要
@EnableJpaRepositories
批注對ApplicationContextConfig
類進行批注來啟用Spring Data JPA。 base packages
。 因此,請在您的配置文件( ApplicationContextConfig
)中添加:
@EnableJpaRepositories(basePackages = {"com.pulseBeatMaster.dao"})
請檢查以下配置類。 正如M. Denium所建議的那樣,您不必直接使用SessionFactory。 JPA適用於EntityManager的概念。 我進行了必要的更改以使其通過Java配置工作。 如果您正在使用spring-boot,則可以使用application.properties來完成大部分配置。
@Configuration
@PropertySource(value = { "classpath:application.properties" })
@EnableJpaRepositories(basePackages = "com.pulseBeatMaster.dao", entityManagerFactoryRef = "myEntityManagerFactory", transactionManagerRef = "myTransactionManager")
public class ApplicationContextConfig {
// To get properties from application.properties
// Import @PropertySource(value = { "classpath:application.properties" })
// Have to use environment.getRequiredProperty();
@Autowired
private Environment environment;
@Bean(name = "dataSource")
public DataSource getDataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName"));
dataSource.setUrl(environment.getRequiredProperty("jdbc.url"));
dataSource.setUsername(environment.getRequiredProperty("jdbc.username"));
dataSource.setPassword(environment.getRequiredProperty("jdbc.password"));
// normally
// dataSource.setDriverClassName("com.mysql.jdbc.Driver");
return dataSource;
}
private Properties getHibernateProperties() {
Properties properties = new Properties();
properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect"));
properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql"));
properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql"));
properties.put("hibernate.id.new_generator_mappings",
environment.getRequiredProperty("hibernate.new_generator_mappings"));
properties.put("current_session_context_class", "org.springframework.orm.hibernate5.SpringSessionContext");
return properties;
}
@Autowired
@Bean(name = "transactionManager")
public HibernateTransactionManager getTransactionManager(SessionFactory sessionFactory) {
HibernateTransactionManager transactionManager = new HibernateTransactionManager(sessionFactory);
return transactionManager;
}
@Primary
@Bean(name="myEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean myEntityManagerFactory() throws ClassNotFoundException {
final LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(getDataSource());
// mention packae scan your classes annotated as @Entity
entityManagerFactoryBean.setPackagesToScan(new String[] { "com.pulseBeatMaster.model" });
entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class);
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setShowSql(true);
entityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter);
entityManagerFactoryBean.setJpaProperties(getHibernateProperties());
entityManagerFactoryBean.afterPropertiesSet();
entityManagerFactoryBean.setLoadTimeWeaver(new InstrumentationLoadTimeWeaver());
return entityManagerFactoryBean;
}
@Primary
@Bean(name = "myTransactionManager")
public PlatformTransactionManager myTransactionManager() {
final JpaTransactionManager transactionManager = new JpaTransactionManager();
try {
transactionManager.setEntityManagerFactory(myEntityManagerFactory().getObject());
transactionManager.setDataSource(getDataSource());
transactionManager.setJpaDialect(new HibernateJpaDialect());
transactionManager.setJpaProperties(getHibernateProperties());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return transactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
@Bean
public HibernateExceptionTranslator hibernateExceptionTranslator() {
return new HibernateExceptionTranslator();
}
@Bean
public JavaMailSender getMailSender() {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
// Using gmail
mailSender.setHost(environment.getRequiredProperty("mailSender.host"));
mailSender.setPort(587);
mailSender.setUsername(environment.getRequiredProperty("mailSender.username"));
mailSender.setPassword(environment.getRequiredProperty("mailSender.password"));
Properties javaMailProperties = new Properties();
javaMailProperties.put("mail.smtp.starttls.enable", "true");
javaMailProperties.put("mail.smtp.auth", "true");
javaMailProperties.put("mail.transport.protocol", "smtp");
javaMailProperties.put("mail.debug", "true");// Prints out everything on
// screen
mailSender.setJavaMailProperties(javaMailProperties);
return mailSender;
}
}
要通過spring-boot屬性進行最少的配置,只需檢查一下spring-boot-jpa教程。
您需要使用@Repository
您的UserRepositoryForgetPassword
接口。 並在您的ApplicationContaxt.xml
文件配置中添加@EnableJpaRepositories(basePackages = {"com.demo.test.repository"})
來掃描存儲庫類,並使用<context:component-scan annotation-config="true" base-package="com.demo.test" />
您的ApplicationContaxt.xml
文件中的<context:component-scan annotation-config="true" base-package="com.demo.test" />
可以掃描基本包和類注釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.