在创建新用户时自动生成带有用户名和随机密码的电子邮件 [英] Auto-generation of email with username and random password on creation of new user

查看:22
本文介绍了在创建新用户时自动生成带有用户名和随机密码的电子邮件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个类 NewUserEmail 以在创建新用户时自动生成带有用户名和密码的电子邮件.我能够创建密码,但是每当我尝试使用该密码登录时,它都无法登录.我无法生成我的邮件.请指导我,让我知道我的代码有什么问题:

I have created a class NewUserEmail to auto generate an email with username and password while creating a new user. I am able to create the password but whenever I am trying to log in with that password, its not logging in. I am not able to generate my mail. Please guide me and let me know what is wrong with my code:

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.jscript.ClasspathScriptLocation;
import org.alfresco.repo.node.NodeServicePolicies;
import org.alfresco.repo.policy.JavaBehaviour;
import org.alfresco.repo.policy.PolicyComponent;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.security.PersonService;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.apache.log4j.Logger;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;

public class NewUserEmail implements NodeServicePolicies.OnCreateNodePolicy {

    private Logger logger = Logger.getLogger(NewUserEmail.class);
    private PolicyComponent policyComponent;
    private NodeService nodeService;
    private PersonService personService;
    private ServiceRegistry serviceRegistry;
    protected String userName = null;
    protected String password = null;
    protected String email = null;
    protected String subject = null;
    protected String body = null;

    private static final String NEW_USER_EMAIL_TEMPLATE = "alfresco/module/demoact1-repo/template/new_user_email.ftl";
    private static final String EMAIL_FROM = "no-reply@eisenvault.com";

    public void init() {
        this.email = "";
        this.userName = "";
        this.password = "";
        this.subject = "New User Alfresco";
        this.body = "";
        this.policyComponent.bindClassBehaviour(
                QName.createQName(NamespaceService.ALFRESCO_URI, "onCreateNode"),
                ContentModel.TYPE_PERSON,
                new JavaBehaviour(this, "ReportUser", org.alfresco.repo.policy.JavaBehaviour.NotificationFrequency.EVERY_EVENT)
        );
    }

    public void onCreateNode(ChildAssociationRef childAssocRef) {
        if (logger.isInfoEnabled()) logger.info(" NewUserEmail Node create policy fired");
    }

    public void setNodeService(NodeService nodeService) {
        this.nodeService = nodeService;
    }

    public void setPolicyComponent(PolicyComponent policyComponent) {
        this.policyComponent = policyComponent;
    }

    public void setServiceRegistry(ServiceRegistry serviceRegistry) {
        this.serviceRegistry = serviceRegistry;
    }

    public String getSubject() {
        return this.subject;
    }

    public String getBody() {
        return this.body;
    }

    public String getEmail() {
        return this.email;
    }

    public String getUserName() {
        return this.userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }


    public void ReportUser(ChildAssociationRef childAssocRef) {
        NodeRef personRef = childAssocRef.getChildRef();
        this.userName = (String) this.nodeService.getProperty(personRef, ContentModel.PROP_USERNAME);
        this.email = (String) this.nodeService.getProperty(personRef, ContentModel.PROP_EMAIL);
        sendEmail();
    }


    public void sendEmail() throws AlfrescoRuntimeException {
        Map<String, Object> templateModel = new HashMap<String, Object>();
        if (getEmail() != null && getEmail() != "") {
            Set<NodeRef> result = serviceRegistry.getPersonService().getPeopleFilteredByProperty(ContentModel.PROP_EMAIL, getEmail(), 1);
            if (result.size() == 1) {
                changePassword(getUserName());
                ClasspathScriptLocation location = new ClasspathScriptLocation(NEW_USER_EMAIL_TEMPLATE);
                try {
                    if (location.getInputStream() != null) {
                        // Check that there is a template
                        templateModel.put("userName", getUserName());
                        templateModel.put("password", getPassword());
                        this.body = serviceRegistry.getTemplateService().processTemplate("freemarker", NEW_USER_EMAIL_TEMPLATE, templateModel);
                    }
                } catch (AlfrescoRuntimeException e) {
                    // If template isn't found, email is constructed "manually"
                    logger.error("Email Template not found " + NEW_USER_EMAIL_TEMPLATE);
                    this.body = "<html> <body> <p> A new User has been created.</p>" +
                            "<p>Hello, </p><p>Your username is " + getUserName() + " and your " +
                            "password is " + getPassword() + "</p> " +
                            "<p>We strongly advise you to change your password when you log in for the first time.</p>" +
                            "Regards</body> </html>";
                    //send();
                }
            }
        }
    }

    protected void send() {
        MimeMessagePreparator mailPreparer = new MimeMessagePreparator() {
            public void prepare(MimeMessage mimeMessage) throws MessagingException {
                MimeMessageHelper message = new MimeMessageHelper(mimeMessage);
                message.setTo(getEmail());
                message.setSubject(getSubject());
                message.setText(getBody(), true);
                message.setFrom(EMAIL_FROM);
            }
        };
    }

    public void changePassword(String password) {
        AuthenticationUtil.setRunAsUserSystem();
        Set<NodeRef> result = serviceRegistry.getPersonService().getPeopleFilteredByProperty(ContentModel.PROP_EMAIL, getEmail(), 1);
        if (result.size() == 1) {
            Object[] userNodeRefs = result.toArray();
            NodeRef userNodeRef = (NodeRef) userNodeRefs[0];
            String username = (String) serviceRegistry.getNodeService().getProperty(userNodeRef, ContentModel.PROP_USERNAME);
            // Generate random password
            String newPassword = Password.generatePassword();
            char[] cadChars = new char[newPassword.length()];
            for (int i = 0; i < newPassword.length(); i++) {
                cadChars[i] = newPassword.charAt(i);
            }
            serviceRegistry.getAuthenticationService().setAuthentication(username, newPassword.toCharArray());
            setPassword(newPassword);
            System.out.println("Password is :" + newPassword);
        }
    }

}

推荐答案

以下是一个可行的解决方案.

Below is a working solution.

resource/alfresco/extension/new-user-email-context.xml:

resource/alfresco/extension/new-user-email-context.xml:

<?xml version='1.0' encoding='UTF-8'?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">    
    <bean id="newUserEmail" class="demo.NewUserEmail">
        <property name="policyComponent" ref="policyComponent"/>
        <property name="nodeService" ref="nodeService"/>
        <property name="personService" ref="personService"/>
        <property name="passwordGenerator" ref="passwordGenerator"/>
        <property name="authenticationService" ref="authenticationService"/>
    </bean>
</beans>

demo.NewUserEmail.java:

demo.NewUserEmail.java:

package demo;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.node.NodeServicePolicies;
import org.alfresco.repo.policy.*;
import org.alfresco.repo.security.authentication.PasswordGenerator;
import org.alfresco.service.cmr.repository.*;
import org.alfresco.service.cmr.security.*;
import org.alfresco.util.PropertyCheck;
import org.springframework.beans.factory.InitializingBean;

public class NewUserEmail implements 
    NodeServicePolicies.OnCreateNodePolicy, InitializingBean {

    @Override
    public void onCreateNode(ChildAssociationRef childAssocRef) {
        notifyUser(childAssocRef);
    }

    private void notifyUser(ChildAssociationRef childAssocRef) {
        NodeRef personRef = childAssocRef.getChildRef();
        // get the user name
        String username = (String) this.nodeService.getProperty(
            personRef, ContentModel.PROP_USERNAME);
        // generate the new password (Alfresco's rules)
        String newPassword = passwordGenerator.generatePassword();
        // set the new password
        authenticationService.setAuthentication(username, newPassword.toCharArray());
        // send default notification to the user
        personService.notifyPerson(username, newPassword);
    }

    private PolicyComponent policyComponent;
    private NodeService nodeService;
    private PersonService personService;
    private PasswordGenerator passwordGenerator;
    private MutableAuthenticationService authenticationService;

    public void setPolicyComponent(PolicyComponent policyComponent) {
        this.policyComponent = policyComponent;
    }

    public void setNodeService(NodeService nodeService) {
        this.nodeService = nodeService;
    }

    public void setPersonService(PersonService personService) {
        this.personService = personService;
    }

    public void setPasswordGenerator(PasswordGenerator passwordGenerator) {
        this.passwordGenerator = passwordGenerator;
    }

    public void setAuthenticationService(AuthenticationService authenticationService) {
        if (authenticationService instanceof MutableAuthenticationService) {
            this.authenticationService = (MutableAuthenticationService) authenticationService;
        }
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        PropertyCheck.mandatory(this, "policyComponent", policyComponent);
        PropertyCheck.mandatory(this, "nodeService", nodeService);
        PropertyCheck.mandatory(this, "passwordGenerator", passwordGenerator);
        PropertyCheck.mandatory(this, "authenticationService", authenticationService);
        PropertyCheck.mandatory(this, "personService", personService);

        this.policyComponent.bindClassBehaviour(
                NodeServicePolicies.OnCreateNodePolicy.QNAME,
                ContentModel.TYPE_PERSON,
                new JavaBehaviour(this,
                        NodeServicePolicies.OnCreateNodePolicy.QNAME.getLocalName(),
                        Behaviour.NotificationFrequency.TRANSACTION_COMMIT
                )
        );
    }


}

这篇关于在创建新用户时自动生成带有用户名和随机密码的电子邮件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆