Commit 2f7c27ff zshaohui

1.增加扫码登录功能

1 个父辈 75a65b5a
...@@ -100,7 +100,7 @@ public class DataInitManager { ...@@ -100,7 +100,7 @@ public class DataInitManager {
operator = roleManager.save(operator); operator = roleManager.save(operator);
log.info("创建默认角色:" + operator.toString()); log.info("创建默认角色:" + operator.toString());
admin = new User(userName, "admin@neotel.tech", "zh-CN", role.getId(), "$2a$10$Egp1/gvFlt7zhlXVfEFw4OfWQCGPw0ClmMcc6FjTnvXNRVf9zdMRa", true, true, new Date(), groupIds, "",""); admin = new User(userName, "admin@neotel.tech", "zh-CN", role.getId(), "$2a$10$Egp1/gvFlt7zhlXVfEFw4OfWQCGPw0ClmMcc6FjTnvXNRVf9zdMRa", true, true, new Date(), groupIds, "","","");
admin = userManager.save(admin); admin = userManager.save(admin);
log.info("创建默认用户:" + admin.toString()); log.info("创建默认用户:" + admin.toString());
......
...@@ -218,4 +218,9 @@ public class Constants { ...@@ -218,4 +218,9 @@ public class Constants {
*/ */
public static final String Cache_DefLanguage = "Cache_DefLanguage"; public static final String Cache_DefLanguage = "Cache_DefLanguage";
/**
* 是否扫描登录
*/
public static final String Cache_QRCodeLogin = "Cache_QRCodeLogin";
} }
...@@ -111,7 +111,7 @@ public class UserCodeUtil { ...@@ -111,7 +111,7 @@ public class UserCodeUtil {
String langu=""; String langu="";
String roleId=""; String roleId="";
User user=new User(username,email,langu,roleId,"",true User user=new User(username,email,langu,roleId,"",true
,false,new Date(),new HashSet<>(),"",""); ,false,new Date(),new HashSet<>(),"","","");
user.setId(id); user.setId(id);
user.setCreateDate(createData); user.setCreateDate(createData);
list.add(user); list.add(user);
......
...@@ -94,6 +94,11 @@ public class SettingsController { ...@@ -94,6 +94,11 @@ public class SettingsController {
defLanguage = "zh"; defLanguage = "zh";
} }
dto.setDefLanguage(defLanguage); dto.setDefLanguage(defLanguage);
Boolean QRCodeLogin = dataCache.getCache(Constants.Cache_QRCodeLogin);
if (QRCodeLogin == null){
QRCodeLogin = false;
}
dto.setQRCodeLogin(QRCodeLogin);
return dto; return dto;
} }
...@@ -109,10 +114,12 @@ public class SettingsController { ...@@ -109,10 +114,12 @@ public class SettingsController {
dataCache.updateCache(Constants.BACKUP_MONTH_KEY,sysSettingsDto.getBackUpMonth()); dataCache.updateCache(Constants.BACKUP_MONTH_KEY,sysSettingsDto.getBackUpMonth());
dataCache.updateCache(Constants.CACHE_closeWorkOrder,sysSettingsDto.isCloseWorkOrder()); dataCache.updateCache(Constants.CACHE_closeWorkOrder,sysSettingsDto.isCloseWorkOrder());
dataCache.updateCache(Constants.Cache_DefLanguage,sysSettingsDto.getDefLanguage()); dataCache.updateCache(Constants.Cache_DefLanguage,sysSettingsDto.getDefLanguage());
dataCache.updateCache(Constants.Cache_QRCodeLogin,sysSettingsDto.isQRCodeLogin());
log.info("更改系统设置:stopout=" + sysSettingsDto.isStopOut() + ",stopjob=" + sysSettingsDto.isStartJob()+",sluggishDay="+sysSettingsDto.getSluggishDay() log.info("更改系统设置:stopout=" + sysSettingsDto.isStopOut() + ",stopjob=" + sysSettingsDto.isStartJob()+",sluggishDay="+sysSettingsDto.getSluggishDay()
+",expiresDay="+sysSettingsDto.getExpiresDay()+",capacityWarn="+sysSettingsDto.getCapacityWarn()+",backUpMonth="+sysSettingsDto.getBackUpMonth() +",expiresDay="+sysSettingsDto.getExpiresDay()+",capacityWarn="+sysSettingsDto.getCapacityWarn()+",backUpMonth="+sysSettingsDto.getBackUpMonth()
+",缺料不自动关闭工单="+sysSettingsDto.isCloseWorkOrder() +",缺料不自动关闭工单="+sysSettingsDto.isCloseWorkOrder()
+"默认语言为:"+sysSettingsDto.getDefLanguage()); +"默认语言为:"+sysSettingsDto.getDefLanguage()
+"是否扫码登录:"+sysSettingsDto.isQRCodeLogin());
return ResultBean.newOkResult("保存成功"); return ResultBean.newOkResult("保存成功");
} }
...@@ -334,4 +341,15 @@ public class SettingsController { ...@@ -334,4 +341,15 @@ public class SettingsController {
} }
return ResultBean.newOkResult(""); return ResultBean.newOkResult("");
} }
@ApiOperation("判断是否扫码登录")
@GetMapping("/QRCodeLogin")
@AnonymousAccess
public ResultBean QRCodeLogin() {
Boolean QRCodeLogin = dataCache.getCache(Constants.Cache_QRCodeLogin);
if (QRCodeLogin == null){
QRCodeLogin = false;
}
return ResultBean.newOkResult(QRCodeLogin);
}
} }
...@@ -33,4 +33,7 @@ public class SysSettingsDto implements Serializable { ...@@ -33,4 +33,7 @@ public class SysSettingsDto implements Serializable {
@ApiModelProperty("默认语言") @ApiModelProperty("默认语言")
private String defLanguage = "zh"; private String defLanguage = "zh";
@ApiModelProperty("是否扫码登录")
private boolean QRCodeLogin = false;
} }
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
*/ */
package com.neotel.smfcore.security.rest; package com.neotel.smfcore.security.rest;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.*; import com.neotel.smfcore.common.utils.*;
import com.neotel.smfcore.core.api.SmfApi; import com.neotel.smfcore.core.api.SmfApi;
import com.neotel.smfcore.security.annotation.AnonymousDeleteMapping; import com.neotel.smfcore.security.annotation.AnonymousDeleteMapping;
...@@ -28,6 +29,8 @@ import com.neotel.smfcore.security.rest.bean.dto.OnlineUserDto; ...@@ -28,6 +29,8 @@ import com.neotel.smfcore.security.rest.bean.dto.OnlineUserDto;
import com.neotel.smfcore.security.service.OnlineUserService; import com.neotel.smfcore.security.service.OnlineUserService;
import com.neotel.smfcore.security.rest.bean.dto.AuthUserDto; import com.neotel.smfcore.security.rest.bean.dto.AuthUserDto;
import com.neotel.smfcore.security.rest.bean.dto.JwtUserDto; import com.neotel.smfcore.security.rest.bean.dto.JwtUserDto;
import com.neotel.smfcore.security.service.manager.IUserManager;
import com.neotel.smfcore.security.service.po.User;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
...@@ -39,6 +42,8 @@ import org.springframework.security.authentication.UsernamePasswordAuthenticatio ...@@ -39,6 +42,8 @@ import org.springframework.security.authentication.UsernamePasswordAuthenticatio
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
...@@ -70,6 +75,12 @@ public class AuthorizationController { ...@@ -70,6 +75,12 @@ public class AuthorizationController {
@Resource @Resource
private LoginProperties loginProperties; private LoginProperties loginProperties;
@Autowired
private IUserManager userManager;
@Autowired
private UserDetailsService userDetailsService;
@ApiOperation("登录授权") @ApiOperation("登录授权")
@AnonymousPostMapping(value = "/login") @AnonymousPostMapping(value = "/login")
public ResponseEntity<Object> login(@Validated @RequestBody AuthUserDto authUser, HttpServletRequest request) throws Exception { public ResponseEntity<Object> login(@Validated @RequestBody AuthUserDto authUser, HttpServletRequest request) throws Exception {
...@@ -161,6 +172,60 @@ public class AuthorizationController { ...@@ -161,6 +172,60 @@ public class AuthorizationController {
return new ResponseEntity<>(HttpStatus.OK); return new ResponseEntity<>(HttpStatus.OK);
} }
@ApiOperation("扫码登录授权")
@AnonymousPostMapping(value = "/QRCodeLogin")
public ResponseEntity<Object> QRCodeLogin(@RequestBody AuthUserDto authUser, HttpServletRequest request) throws Exception {
String code = authUser.getCode();
if (StringUtils.isEmpty(code)) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"code"});
}
//取第一位是id信息
String id = code.substring(0, code.indexOf("-"));
User user = userManager.get(id);
if (user == null) {
throw new ValidateException("smfcore.valueNotExist", "{0}[{1}]不存在", new String[]{"userId", id});
}
//判断与登录是否一致
String loginCode = user.getLoginCode();
if (!code.equals(loginCode)){
throw new ValidateException("smfcore.login.codeError", "登录码[{0}]错误", new String[]{code});
}
// 生成令牌与第三方系统获取令牌方式
UserDetails userDetails = userDetailsService.loadUserByUsername(user.getUsername());
Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
String token = tokenProvider.createToken(authentication);
final JwtUserDto jwtUserDto = (JwtUserDto) authentication.getPrincipal();
// 保存在线信息
String ip = StringUtils.getIp(request);
String browser = StringUtils.getBrowser(request);
String address = StringUtils.getCityInfo(ip);
OnlineUserDto onlineUserDto = null;
try {
long seconds = onlineUserService.properties.getTokenValidityInSeconds() / 1000;
Date exTime = DateUtil.addSeconds(new Date(), new Long(seconds).intValue());
onlineUserDto = new OnlineUserDto(jwtUserDto.getUsername(), browser, ip, address, EncryptUtils.desEncrypt(token), new Date(), exTime,jwtUserDto.getImageStr());
} catch (Exception e) {
log.error(e.getMessage(), e);
}
OnlineUserService.onlineUserMap.put(onlineUserService.properties.getOnlineKey() + token, onlineUserDto);
// 返回 token 与 用户信息
Map<String, Object> authInfo = new HashMap<String, Object>(2) {{
put("token", properties.getTokenStartWith() + token);
put("user", jwtUserDto);
}};
if (loginProperties.isSingleLogin()) {
//踢掉之前已经登录的token
onlineUserService.checkLoginOnUser(user.getUsername(), token);
}
//重新登陆时清理调试模式状态
SecurityUtils.updateToDebugModel(user.getUsername(), false);
return ResponseEntity.ok(authInfo);
}
@AnonymousGetMapping(value = "/code") @AnonymousGetMapping(value = "/code")
public ResponseEntity<Object> getCode() { public ResponseEntity<Object> getCode() {
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
*/ */
package com.neotel.smfcore.security.rest; package com.neotel.smfcore.security.rest;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import com.neotel.smfcore.common.bean.PageData; import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.bean.ResultBean; import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.csv.CsvReader; import com.neotel.smfcore.common.csv.CsvReader;
...@@ -358,4 +360,26 @@ public class UserController { ...@@ -358,4 +360,26 @@ public class UserController {
return ResultBean.newOkResult("smfcore.exitDebugModel.ok","已退出调试模式",new String[]{}, false); return ResultBean.newOkResult("smfcore.exitDebugModel.ok","已退出调试模式",new String[]{}, false);
} }
@ApiOperation("生成用户授权的二维码")
@PostMapping(value = "/userQrcode")
//@AnonymousAccess
public ResultBean userQrcode(@RequestBody Map<String, String> paramMap) {
String id = paramMap.get("id");
if (StringUtils.isEmpty(id)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"id"});
}
User user = userManager.get(id);
//用户登录的授权code
String loginCode = user.getLoginCode();
if (StringUtils.isEmpty(loginCode)) {
loginCode = id + "-" + Md5Utls.getMd5(id, user.getCreateDate());
user.setLoginCode(loginCode);
userManager.save(user);
}
QrConfig config = new QrConfig();
byte[] codeBytes = QrCodeUtil.generatePng(loginCode, config);
return ResultBean.newOkResult(codeBytes);
}
} }
...@@ -64,6 +64,8 @@ public class User extends BasePo implements Serializable { ...@@ -64,6 +64,8 @@ public class User extends BasePo implements Serializable {
*/ */
private String imageStr; private String imageStr;
private String loginCode;
public boolean hasGroup(String groupId) { public boolean hasGroup(String groupId) {
if (groupId == null || groupId.equals("") || groupId.equals("-1")) { if (groupId == null || groupId.equals("") || groupId.equals("-1")) {
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!