This commit is contained in:
MaxKey
2022-04-25 23:24:37 +08:00
parent 9e431ec564
commit ffa1607c6f
7 changed files with 152 additions and 190 deletions

View File

@@ -115,10 +115,9 @@ public class ForgotPasswordContorller {
@RequestParam String email,
@RequestParam String state,
@RequestParam String captcha) {
_logger.debug("forgotpassword /forgotpassword/produceEmailOtp.");
_logger.debug("Email {} : " , email);
_logger.debug("/forgotpassword/produceEmailOtp Email {} : " , email);
if (!authJwtService.validateCaptcha(state,captcha)) {
_logger.debug("login captcha valid error.");
_logger.debug("captcha valid error.");
return new Message<ChangePassword>(Message.FAIL).buildResponse();
}

View File

@@ -18,39 +18,33 @@
package org.maxkey.web.contorller;
import java.io.IOException;
import java.util.Date;
import java.util.regex.Pattern;
import javax.servlet.ServletException;
import org.apache.commons.mail.DefaultAuthenticator;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.maxkey.authn.jwt.AuthJwtService;
import org.maxkey.configuration.ApplicationConfig;
import org.maxkey.constants.ConstsStatus;
import org.maxkey.crypto.password.PasswordReciprocal;
import org.maxkey.entity.Register;
import org.maxkey.entity.Message;
import org.maxkey.entity.UserInfo;
import org.maxkey.persistence.service.RegisterService;
import org.maxkey.password.onetimepwd.AbstractOtpAuthn;
import org.maxkey.password.onetimepwd.OtpAuthnService;
import org.maxkey.persistence.service.UserInfoService;
import org.maxkey.util.DateUtils;
import org.maxkey.util.StringUtils;
import org.maxkey.web.WebContext;
import org.maxkey.web.message.Message;
import org.mybatis.spring.SqlSessionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
@Controller
@@ -58,183 +52,81 @@ import org.springframework.web.servlet.ModelAndView;
public class RegisterController {
private static Logger _logger = LoggerFactory.getLogger(RegisterController.class);
Pattern mobileRegex = Pattern.compile("^[1][3,4,5,7,8][0-9]{9}$");
@Autowired
RegisterService registerService;
AuthJwtService authJwtService;
@Autowired
@Qualifier("applicationConfig")
protected ApplicationConfig applicationConfig;
@Autowired
@Qualifier("userInfoService")
private UserInfoService userInfoService;
@Autowired
@Qualifier("otpAuthnService")
OtpAuthnService otpAuthnService;
@Autowired
private PasswordEncoder passwordEncoder;
@RequestMapping(value={"/forward"})
public ModelAndView forward() {
_logger.debug("register /register/register.");
return new ModelAndView("register/register");
}
@RequestMapping(value={"/forward/email"})
public ModelAndView forwardEmail() {
_logger.debug("register /register/register.");
return new ModelAndView("register/registerInst");
}
//邮件验证注册
@RequestMapping(value={"/register"})
public ModelAndView reg(@ModelAttribute("register") Register register) {
_logger.debug("register /register/register.");
_logger.debug(""+register);
ModelAndView modelAndView= new ModelAndView("register/registered");
UserInfo userInfo = registerService.findByEmail(register.getWorkEmail());
if(userInfo!=null){
modelAndView.addObject("registered", 1);
return modelAndView;
}
register.setId(register.generateId());
registerService.insert(register);
HtmlEmail email = new HtmlEmail();
try {
email.setHostName(applicationConfig.getEmailConfig().getSmtpHost());
email.setSmtpPort(applicationConfig.getEmailConfig().getPort());
email.setAuthenticator(new DefaultAuthenticator(
applicationConfig.getEmailConfig().getUsername(),
applicationConfig.getEmailConfig().getPassword()
));
email.addTo(register.getWorkEmail(), register.getDisplayName());
email.setFrom(applicationConfig.getEmailConfig().getSender(), "MaxKey");
email.setSubject("MaxKey Identity & Access Registration activate Email .");
String activateUrl=WebContext.getHttpContextPath()+"/register/forward/activate/"+register.getId();
// set the html message
String emailText="<html>";
emailText+="<a href='"+activateUrl+"'>activate</a><br>";
emailText+=" or copy "+activateUrl+" to brower.";
emailText+="</html>";
email.setHtmlMsg(emailText);
// set the alternative message
email.setTextMsg("Your email client does not support HTML messages");
// send the email
email.send();
} catch (EmailException e) {
e.printStackTrace();
}
modelAndView.addObject("registered", 0);
return modelAndView;
}
@GetMapping(value={"/forward/activate/{id}"})
public ModelAndView confirm(@PathVariable("id") String id) {
_logger.debug("register /register/forward/activate.");
Register register=registerService.get(id);
ModelAndView mav=new ModelAndView("register/activate");
if(register!=null){
mav.addObject("model", register);
}
return mav;
}
@PostMapping(value={"/activate/{id}"})
public ModelAndView setPassWord(@PathVariable("id") String id,
@RequestParam String password,
@RequestParam String confirmpassword) {
_logger.debug("register /register/setpassword.");
ModelAndView modelAndView=new ModelAndView("register/activated");
if(password.equals(confirmpassword)){
Register register=registerService.get(id);
if(register!=null){
SqlSession sqlSession = SqlSessionUtils.getSqlSession(
WebContext.getBean("sqlSessionFactory",SqlSessionFactory.class));
sqlSession.commit(false);
UserInfo userInfo=new UserInfo();
userInfo.setUsername(register.getWorkEmail());
userInfo.setDisplayName(register.getDisplayName());
userInfo.setWorkPhoneNumber(register.getWorkPhone());
userInfo.setEmail(register.getWorkEmail());
userInfo.setStatus(ConstsStatus.ACTIVE);
userInfo.setDecipherable(PasswordReciprocal.getInstance().encode(password));
password = passwordEncoder.encode(password );
userInfo.setPassword(password);
//default InstId
if(StringUtils.isEmpty(userInfo.getInstId())) {
userInfo.setInstId("1");
}
userInfo.setPasswordLastSetTime(DateUtils.format(new Date(), DateUtils.FORMAT_DATE_YYYY_MM_DD_HH_MM_SS));
userInfoService.insert(userInfo);
registerService.remove(id);
sqlSession.commit(true);
modelAndView.addObject("activate", 1);
}else{
modelAndView.addObject("activate", 2);
}
}else{
modelAndView.addObject("activate", 0);
}
return modelAndView;
}
@ResponseBody
@RequestMapping(value = { "/produceOtp" }, produces = {MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<?> produceOtp(
@RequestParam String mobile) {
_logger.debug("/signup/produceOtp Mobile {}: " ,mobile);
_logger.debug("Mobile Regex matches {}",mobileRegex.matcher(mobile).matches());
if(StringUtils.isNotBlank(mobile) && mobileRegex.matcher(mobile).matches()) {
UserInfo userInfo = new UserInfo();
userInfo.setUsername(mobile);
userInfo.setMobile(mobile);
AbstractOtpAuthn smsOtpAuthn = otpAuthnService.getByInstId(WebContext.getInst().getId());
smsOtpAuthn.produce(userInfo);
return new Message<UserInfo>(userInfo).buildResponse();
}
return new Message<UserInfo>(Message.FAIL).buildResponse();
}
//直接注册
@RequestMapping(value={"/registeron"})
@RequestMapping(value={"/register"})
@ResponseBody
public Message registeron(UserInfo userInfo,@RequestParam String emailMobile) throws ServletException, IOException {
if(StringUtils.isEmpty(emailMobile)) {
return new Message(WebContext.getI18nValue("register.emailMobile.error"),"1");
public ResponseEntity<?> register(
@ModelAttribute UserInfo userInfo,
@RequestParam String captcha) throws ServletException, IOException {
UserInfo validateUserInfo = new UserInfo();
validateUserInfo.setUsername(userInfo.getMobile());
validateUserInfo.setMobile(userInfo.getMobile());
AbstractOtpAuthn smsOtpAuthn = otpAuthnService.getByInstId(WebContext.getInst().getId());
if (smsOtpAuthn !=null
&& smsOtpAuthn.validate(validateUserInfo, captcha)){
UserInfo temp = userInfoService.findByEmailMobile(userInfo.getEmail());
if(temp != null) {
return new Message<UserInfo>(Message.FAIL).buildResponse();
}
temp = userInfoService.findByUsername(userInfo.getUsername());
if(temp != null) {
return new Message<UserInfo>(Message.FAIL).buildResponse();
}
//default InstId
if(StringUtils.isEmpty(userInfo.getInstId())) {
userInfo.setInstId("1");
}
String password = userInfo.getPassword();
userInfo.setDecipherable(PasswordReciprocal.getInstance().encode(password));
password = passwordEncoder.encode(password );
userInfo.setPassword(password);
userInfo.setStatus(ConstsStatus.INACTIVE);
if(userInfoService.insert(userInfo)) {
return new Message<UserInfo>().buildResponse();
}
}
if(StringUtils.isValidEmail(emailMobile)) {
userInfo.setEmail(emailMobile);
}
if(StringUtils.isValidMobileNo(emailMobile)) {
userInfo.setMobile(emailMobile);
}
if(!(StringUtils.isValidEmail(emailMobile)||StringUtils.isValidMobileNo(emailMobile))) {
return new Message(WebContext.getI18nValue("register.emailMobile.error"),"1");
}
UserInfo temp = userInfoService.findByEmailMobile(emailMobile);
if(temp!=null) {
return new Message(WebContext.getI18nValue("register.emailMobile.exist"),"1");
}
temp = userInfoService.findByUsername(userInfo.getUsername());
if(temp!=null) {
return new Message(WebContext.getI18nValue("register.user.error"),"1");
}
//default InstId
if(StringUtils.isEmpty(userInfo.getInstId())) {
userInfo.setInstId("1");
}
userInfo.setStatus(ConstsStatus.ACTIVE);
if(userInfoService.insert(userInfo)) {
return new Message(WebContext.getI18nValue("login.text.register.success"),"0");
}
return new Message(WebContext.getI18nValue("login.text.register.error"),"1");
return new Message<UserInfo>(Message.FAIL).buildResponse();
}
}