2 files added
7 files modified
| | |
| | | package com.moral.common.exception; |
| | | |
| | | /** |
| | | * @Description: Web授权自定义异常 |
| | | * @Param: |
| | | * @return: |
| | | * @Author: 陈凯裕 |
| | | * @Date: 2020/9/16 |
| | | */ |
| | | public class WebAuthException extends RuntimeException { |
| | | public WebAuthException() { |
| | | super(); |
| | |
| | | import org.springframework.web.bind.annotation.ResponseStatus; |
| | | import org.springframework.web.bind.annotation.RestControllerAdvice; |
| | | |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * @Description: Web授权异常处理器 |
| | | * @Param: |
| | | * @return: |
| | | * @Author: 陈凯裕 |
| | | * @Date: 2020/9/16 |
| | | */ |
| | | @RestControllerAdvice |
| | | public class WebAuthExceptionHandler { |
| | | @ExceptionHandler(WebAuthException.class) |
| | | @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) |
| | | public Map<String,Object> handlerWebAuthException(WebAuthException e){ |
| | | public Map<String,Object> handlerWebAuthException(WebAuthException e, HttpServletResponse response){ |
| | | Map<String,Object> result = new HashMap<>(); |
| | | result.put("msg",e.getMessage()); |
| | | result.put("accountId", -1); |
| | |
| | | import com.auth0.jwt.exceptions.JWTVerificationException; |
| | | import com.auth0.jwt.interfaces.Claim; |
| | | import com.moral.common.exception.WebAuthException; |
| | | import com.moral.common.util.RedisHashUtil; |
| | | import com.moral.common.util.WebTokenUtils; |
| | | import com.moral.common.webAnno.PassToken; |
| | | import com.moral.common.webAnno.UserLoginToken; |
| | | import com.moral.entity.Account; |
| | |
| | | @Resource |
| | | AccountService accountService; |
| | | |
| | | @Resource |
| | | RedisHashUtil redisHashUtil; |
| | | |
| | | @Override |
| | | public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception { |
| | | response.setHeader("Access-Control-Allow-Origin", "*"); |
| | | response.setHeader("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With"); |
| | | response.setHeader("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS"); |
| | | String token = request.getHeader("token"); |
| | | Enumeration<String> headerNames = request.getHeaderNames(); |
| | | //如果不是映射到方法则直接通过 |
| | | if(!(o instanceof HandlerMethod)){ |
| | | return true; |
| | |
| | | //获取ID |
| | | String id = ""; |
| | | try { |
| | | Map<String, Claim> claims = JWT.decode(token).getClaims(); |
| | | Claim accountId = claims.get("aid"); |
| | | id = accountId.asString(); |
| | | id = WebTokenUtils.getIdBytoken(token); |
| | | }catch (JWTDecodeException e){ |
| | | throw new WebAuthException("401,token无效"); |
| | | } |
| | |
| | | throw new WebAuthException("401,token过期或者无效"); |
| | | } |
| | | |
| | | //判断token是否在退出黑名单 |
| | | String redisToken = (String)redisHashUtil.getMapVal("webToken",id); |
| | | if(token.equals(redisToken)) |
| | | throw new WebAuthException("401,token过期"); |
| | | |
| | | return true; |
| | | } |
| | | } |
New file |
| | |
| | | package com.moral.common.util; |
| | | |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.data.redis.core.RedisTemplate; |
| | | import org.springframework.stereotype.Repository; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.*; |
| | | |
| | | @Repository |
| | | public class RedisHashUtil { |
| | | @Resource |
| | | private RedisTemplate<String,Object> redisTemplate; |
| | | |
| | | /** |
| | | * 存储单个值至map中 |
| | | * @param redisKey redisKey中的key |
| | | * @param mapKey map所对应的key |
| | | * @param value map所对应的值 |
| | | */ |
| | | public void addMapOne(String redisKey,String mapKey,Object value) { |
| | | redisTemplate.opsForHash().put(redisKey, mapKey,value); |
| | | } |
| | | |
| | | /** |
| | | * 存储整个map至redis |
| | | * @param key redis中存储的key |
| | | * @param map 需缓存的Map |
| | | */ |
| | | public void addMapAll(String key, Map map) { |
| | | redisTemplate.opsForHash().putAll(key, map); |
| | | } |
| | | |
| | | /** |
| | | * 获取整个HashMap |
| | | * @param redisKey redis中存储的key |
| | | * @return 整个Map |
| | | */ |
| | | public Map<String,Object> getMapAll(String redisKey) { |
| | | Map<Object, Object> entries = redisTemplate.opsForHash().entries(redisKey); |
| | | Map<String, Object> retEntries = new HashMap<>(); |
| | | for(Map.Entry<Object , Object> temp:entries.entrySet()){ |
| | | Object key = temp.getKey(); |
| | | Object value = temp.getValue(); |
| | | retEntries.put(String.valueOf(key) , value); |
| | | } |
| | | return retEntries; |
| | | } |
| | | |
| | | /** |
| | | * 获取redis中hash的所有value |
| | | * @param redisKey |
| | | * @return |
| | | */ |
| | | public List<Object> getMapValues(String redisKey) { |
| | | return redisTemplate.opsForHash().values(redisKey); |
| | | } |
| | | |
| | | /** |
| | | * 删除Map中的某个键值对 |
| | | * @param redisKey |
| | | * @param mapKey |
| | | * @return 返回影响数量 |
| | | */ |
| | | public Long deleteMapVal(String redisKey , Object ... mapKey) { |
| | | return redisTemplate.opsForHash().delete(redisKey , mapKey); |
| | | } |
| | | /** |
| | | * 确定hashkey是否存在 |
| | | * @param redisKey redis存储的key |
| | | * @param mapKey 需要确定的map对象key |
| | | * @return |
| | | */ |
| | | public boolean hasKey(String redisKey , String mapKey) { |
| | | return redisTemplate.opsForHash().hasKey(redisKey , mapKey); |
| | | } |
| | | /** |
| | | * 获取Map中具体的值 |
| | | * @param redisKey redis存储的key |
| | | * @param mapKey 获取的map对象key |
| | | * @return |
| | | */ |
| | | public Object getMapVal(String redisKey, String mapKey) { |
| | | return redisTemplate.opsForHash().get(redisKey,mapKey); |
| | | } |
| | | |
| | | /** |
| | | * 从哈希中获取给定key的值 |
| | | * @param redisKey redis存储的key |
| | | * @param mapKeys 需要去出的key的集合 |
| | | * @return 值列表 |
| | | */ |
| | | public List<Object> multiGetHash(String redisKey , List<Object> mapKeys) { |
| | | return redisTemplate.opsForHash().multiGet(redisKey , mapKeys); |
| | | } |
| | | |
| | | /** |
| | | * 获取所有map中的key |
| | | * @param redisKey |
| | | * @return |
| | | */ |
| | | public Set<String> getHashKeys(String redisKey) { |
| | | Set<Object> keys = redisTemplate.opsForHash().keys(redisKey); |
| | | Set<String> retKeys = new HashSet<>(); |
| | | for (Object key : keys) { |
| | | retKeys.add(String.valueOf(key)); |
| | | } |
| | | return retKeys; |
| | | } |
| | | |
| | | /** |
| | | * 获取所有map中的key的数量 |
| | | * @param redisKey redis中的key |
| | | * @return key的数量 |
| | | */ |
| | | public int getHashSize(String redisKey) { |
| | | Set<Object> keys = redisTemplate.opsForHash().keys(redisKey); |
| | | if(keys == null){ |
| | | return 0; |
| | | } |
| | | return keys.size(); |
| | | } |
| | | } |
| | | |
New file |
| | |
| | | package com.moral.common.util; |
| | | |
| | | import com.auth0.jwt.JWT; |
| | | import com.auth0.jwt.interfaces.Claim; |
| | | |
| | | import java.util.Map; |
| | | |
| | | public class WebTokenUtils { |
| | | |
| | | public static final String getIdBytoken(String token){ |
| | | Map<String, Claim> claims = JWT.decode(token).getClaims(); |
| | | Claim accountId = claims.get("aid"); |
| | | return accountId.asString(); |
| | | } |
| | | } |
| | |
| | | package com.moral.controller; |
| | | |
| | | import com.auth0.jwt.exceptions.JWTDecodeException; |
| | | import com.moral.common.exception.WebAuthException; |
| | | import com.moral.common.util.BeanUtils; |
| | | import com.moral.common.util.RedisHashUtil; |
| | | import com.moral.common.util.WebTokenUtils; |
| | | import com.moral.common.webAnno.UserLoginToken; |
| | | import com.moral.entity.AreaNames; |
| | | import com.moral.entity.Organization; |
| | |
| | | import com.moral.service.DictionaryDataService; |
| | | import com.moral.service.OrganizationService; |
| | | import com.moral.service.WebTokenService; |
| | | import org.springframework.web.bind.annotation.CrossOrigin; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | import com.moral.util.LatLngTransformation; |
| | | import jdk.nashorn.internal.runtime.logging.Logger; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import javax.annotation.Resource; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | |
| | | OrganizationService organizationService; |
| | | @Resource |
| | | WebTokenService webTokenService; |
| | | @Resource |
| | | RedisHashUtil redisHashUtil; |
| | | |
| | | @RequestMapping("login") |
| | | public Map<String, Object> login(HttpServletRequest request){ |
| | | @PostMapping("login") |
| | | public Map<String, Object> login(@RequestBody Map<String, Object> parameters) { |
| | | Map<String, Object> resultMap = new HashMap<String, Object>(); |
| | | Map<String, Object> parameters = getParametersStartingWith(request, null); |
| | | if (!(parameters.containsKey("account") && parameters.containsKey("password"))) { |
| | | resultMap.put("msg", "用户名及密码不允许为空!"); |
| | | resultMap.put("accountId", -1); |
| | | } else { |
| | | resultMap = accountService.webLogin(parameters); |
| | | String accountId = String.valueOf(resultMap.get("accountId")); |
| | | if (!accountId.equals("-1")) { |
| | | redisHashUtil.deleteMapVal("webToken",accountId); |
| | | resultMap.put("token", webTokenService.getToken(accountId)); |
| | | } |
| | | } |
| | | return resultMap; |
| | | } |
| | | |
| | | @UserLoginToken |
| | | @PostMapping("logout") |
| | | public Map<String, Object> logout(HttpServletRequest request) { |
| | | Map<String, Object> resultMap = new HashMap<>(); |
| | | String token = request.getHeader("token"); |
| | | String id = WebTokenUtils.getIdBytoken(token); |
| | | redisHashUtil.addMapOne("webToken", String.valueOf(id),token); |
| | | resultMap.put("msg", "退出成功!"); |
| | | return resultMap; |
| | | } |
| | | |
| | | @UserLoginToken |
| | | @GetMapping("getAccountInfo") |
| | | public Map<String, Object> getAccountInfo(HttpServletRequest request) { |
| | | String token = request.getHeader("token"); |
| | | String id = ""; |
| | | try { |
| | | id = WebTokenUtils.getIdBytoken(token); |
| | | } catch (JWTDecodeException e) { |
| | | throw new WebAuthException("401,token无效"); |
| | | } |
| | | Map<String, Object> resultMap = accountService.getAccountInfoById(id); |
| | | Object orgId = resultMap.get("orgId"); |
| | | if (resultMap.get("orgId") != null && resultMap.get("orgId") instanceof Integer) { |
| | | StringBuilder areaNamesBuilder = new StringBuilder("中国"); |
| | | //判断是否为本公司开发者 |
| | | if (!((Integer) orgId).equals(dictionaryDataService.querySupperOrgId())) { |
| | | //不是本公司开发者则获取用户所属地区 |
| | | Organization organization = organizationService.getOrganizationById((Integer) orgId); |
| | | if (organization.getAreaNames() != null) { |
| | | Map<String, String> areaNameMap = BeanUtils.beanToMap(organization.getAreaNames()); |
| | | List<String> names = areaNameMap.entrySet().stream().filter(item -> { |
| | | return item.getValue() != null; |
| | | }).map(item -> { |
| | | return item.getValue(); |
| | | }).collect(Collectors.toList()); |
| | | AreaNames areaNames = organization.getAreaNames(); |
| | | areaNamesBuilder.append("/"); |
| | | areaNamesBuilder.append(String.join("/", names)); |
| | | } |
| | | // 企业用户 |
| | | if (organization.getRank() != null && organization.getRank() == 0) { |
| | | resultMap.put("type", "enterprise"); |
| | | } else { |
| | | resultMap.put("type", "government"); |
| | | } |
| | | Number mapAreaCode = null; |
| | | if (organization.getVillageCode() != null) { |
| | | mapAreaCode = organization.getVillageCode(); |
| | | } else if (organization.getTownCode() != null) { |
| | | mapAreaCode = organization.getTownCode(); |
| | | } else if (organization.getAreaCode() != null) { |
| | | mapAreaCode = organization.getAreaCode(); |
| | | } else if (organization.getCityCode() != null) { |
| | | mapAreaCode = organization.getCityCode(); |
| | | } else if (organization.getProvinceCode() != null) { |
| | | mapAreaCode = organization.getProvinceCode(); |
| | | } |
| | | resultMap.put("mapAreaCode", mapAreaCode.toString()); |
| | | } |
| | | resultMap.put("mapPath", areaNamesBuilder.toString()); |
| | | String accountId = String.valueOf(resultMap.get("accountId")); |
| | | resultMap.put("token", webTokenService.getToken(accountId)); |
| | | } |
| | | return resultMap; |
| | | } |
| | | |
| | | //弃用 |
| | | @UserLoginToken |
| | | @RequestMapping("getAccountInfoTest") |
| | | public Map<String, Object> getAccountInfoTest(@RequestBody Map<String, Object> parameters) { |
| | | Map<String, Object> resultMap = new HashMap<String, Object>(); |
| | | System.out.println(parameters); |
| | | if (!(parameters.containsKey("account") && parameters.containsKey("password"))) { |
| | | resultMap.put("msg", "用户名及密码不允许为空!"); |
| | | resultMap.put("accountId", -1); |
| | |
| | | List<Role> getRolesByAccountName(String accountName);
|
| | |
|
| | | Map<String, Object> getMenuListsByAccountName(String accountName);
|
| | |
|
| | | Map<String, Object> webLogin(Map<String, Object> parameters);
|
| | |
|
| | | Map<String, Object> getAccountInfoById(String accountId);
|
| | | }
|
| | |
| | | @Resource
|
| | | private OrganizationMapper organizationMapper;
|
| | |
|
| | |
|
| | |
|
| | | @Override
|
| | | public Map<String, Object> screenLogin(Map<String, Object> parameters) {
|
| | | public Map<String, Object> getAccountInfoById(String accountId) {
|
| | | Map<String, Object> result = new HashMap<String, Object>();
|
| | | Account account = new Account();
|
| | | account.setAccountName((String) parameters.get("account"));
|
| | | String rawPassword = (String) parameters.get("password");
|
| | | // account.setPassword(encoder.encode((String) parameters.get("password")));
|
| | | account.setId(Integer.parseInt(accountId));
|
| | | account = accountMapper.selectOne(account);
|
| | | boolean isValid = account == null ? false : encoder.matches(rawPassword, account.getPassword());
|
| | | if (!isValid) {
|
| | | result.put("msg", "用户名及密码输入错误!");
|
| | | if (ObjectUtils.isEmpty(account)) {
|
| | | result.put("msg", "token无效");
|
| | | result.put("accountId", -1);
|
| | | } else {
|
| | | if (IS_DELETE_FALSE.equals(account.getIsDelete())) {
|
| | | result.put("msg", "登录成功!");
|
| | | result = judgeAccountInfo(account);
|
| | | if (!String.valueOf(result.get("accountId")).equals("-1")) {
|
| | | List<Menu> menuList = accountMapper.getScreenMenuListsByAccountName(account.getAccountName());
|
| | | result.put("msg", "获取成功!");
|
| | | result.put("accountId", account.getId());
|
| | | result.put("orgId", account.getOrganizationId());
|
| | | result.put("data", menuList);
|
| | | setOrgIdsByAccount(result);
|
| | | } else {
|
| | | result.put("msg", "您的账号已禁用,请联系管理员!");
|
| | | }
|
| | | }
|
| | | return result;
|
| | | }
|
| | |
|
| | | @Override
|
| | | public Map<String, Object> webLogin(Map<String, Object> parameters) {
|
| | | Map<String, Object> result = new HashMap<String, Object>();
|
| | | Account account = new Account();
|
| | | account.setAccountName((String) parameters.get("account"));
|
| | | String rawPassword = (String) parameters.get("password");
|
| | | account = accountMapper.selectOne(account);
|
| | | boolean isValid = account == null ? false : encoder.matches(rawPassword, account.getPassword());
|
| | | if (!isValid) {
|
| | | result.put("msg", "用户名及密码输入错误!");
|
| | | result.put("accountId", -1);
|
| | | } else {
|
| | | result = judgeAccountInfo(account);
|
| | | }
|
| | | return result;
|
| | | }
|
| | |
|
| | |
|
| | | @Override
|
| | | public Map<String, Object> screenLoginNew(Map<String, Object> parameters) {
|
| | |
| | | boolean isValid = account == null ? false : encoder.matches(rawPassword, account.getPassword());
|
| | | if (!isValid) {
|
| | | result.put("msg", "用户名及密码输入错误!");
|
| | | result.put("accountId", -1);
|
| | | } else {
|
| | | if (IS_DELETE_FALSE.equals(account.getIsDelete())) {
|
| | | if (existRole != null) {
|
| | |
| | | } else {
|
| | | result.put("msg", "账户没有权限!");
|
| | | }
|
| | | } else {
|
| | | result.put("msg", "您的账号已禁用,请联系管理员!");
|
| | | }
|
| | | }
|
| | | return result;
|
| | | }
|
| | |
|
| | | @Override
|
| | | public Map<String, Object> screenLogin(Map<String, Object> parameters) {
|
| | | Map<String, Object> result = new HashMap<String, Object>();
|
| | | Account account = new Account();
|
| | | account.setAccountName((String) parameters.get("account"));
|
| | | String rawPassword = (String) parameters.get("password");
|
| | | // account.setPassword(encoder.encode((String) parameters.get("password")));
|
| | | account = accountMapper.selectOne(account);
|
| | | boolean isValid = account == null ? false : encoder.matches(rawPassword, account.getPassword());
|
| | | if (!isValid) {
|
| | | result.put("msg", "用户名及密码输入错误!");
|
| | | } else {
|
| | | if (IS_DELETE_FALSE.equals(account.getIsDelete())) {
|
| | | result.put("msg", "登录成功!");
|
| | | result.put("accountId", account.getId());
|
| | | result.put("orgId", account.getOrganizationId());
|
| | | setOrgIdsByAccount(result);
|
| | | } else {
|
| | | result.put("msg", "您的账号已禁用,请联系管理员!");
|
| | | }
|
| | |
| | | return mapList;
|
| | | }
|
| | |
|
| | | private Map<String, Object> judgeAccountInfo(Account account) {
|
| | | Map<String, Object> result = new HashMap<String, Object>();
|
| | | Integer existRole = accountMapper.getScreenRoleByAccountName(account.getAccountName());
|
| | | if (!IS_DELETE_FALSE.equals(account.getIsDelete())) {
|
| | | result.put("msg", "您的账号已禁用,请联系管理员!");
|
| | | result.put("accountId", -1);
|
| | | } else if (ObjectUtils.isEmpty(existRole)) {
|
| | | result.put("msg", "账户没有权限!");
|
| | | result.put("accountId", -1);
|
| | | } else {
|
| | | result.put("msg", "登录成功!");
|
| | | result.put("accountId", account.getId());
|
| | | }
|
| | | return result;
|
| | | }
|
| | |
|
| | |
|
| | | }
|
| | |
| | | min-idle: 0 |
| | | |
| | | |
| | | |
| | | # data: |
| | | # mongodb: |
| | | # uri: mongodb://47.96.171.62:27017/monitor |