簡體   English   中英

忘記密碼實現彈簧安全性

[英]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。
  • 配置當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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM