|
|
@@ -0,0 +1,204 @@
|
|
|
+package com.jeecg.modules.jmreport.extend;
|
|
|
+
|
|
|
+
|
|
|
+//import com.kingdom.common.utils.jwt.JwtUtil;
|
|
|
+//import com.kingdom.main.biz.service.UserService;
|
|
|
+//import com.kingdom.main.biz.vo.UserVO;
|
|
|
+//import com.kingdom.sys.biz.dto.AccountDTO;
|
|
|
+//import com.kingdom.sys.biz.service.AccountApiService;
|
|
|
+//import org.apache.shiro.authc.AuthenticationException;
|
|
|
+//import org.apache.shiro.web.util.WebUtils;
|
|
|
+import com.auth0.jwt.JWT;
|
|
|
+import com.auth0.jwt.JWTVerifier;
|
|
|
+import com.auth0.jwt.algorithms.Algorithm;
|
|
|
+import com.auth0.jwt.exceptions.TokenExpiredException;
|
|
|
+import com.auth0.jwt.interfaces.DecodedJWT;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.apache.http.auth.AuthenticationException;
|
|
|
+import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
|
|
|
+import org.jeecg.modules.jmreport.common.util.JimuSpringContextUtils;
|
|
|
+import org.springframework.boot.SpringApplication;
|
|
|
+import org.springframework.boot.autoconfigure.SpringBootApplication;
|
|
|
+import org.springframework.http.HttpHeaders;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+import org.springframework.web.context.request.RequestContextHolder;
|
|
|
+import org.springframework.web.context.request.ServletRequestAttributes;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import javax.servlet.http.HttpSession;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * 自定义积木报表鉴权(如果不进行自定义,则所有请求不做权限控制)
|
|
|
+ * 1.自定义获取登录token
|
|
|
+ * 2.自定义获取登录用户
|
|
|
+ */
|
|
|
+@Component
|
|
|
+@Slf4j
|
|
|
+public class JimuReportTokenServiceImpl implements JmReportTokenServiceI {
|
|
|
+ private static final String SECRET = "zoomwin[qwertyuiopasdfghjklzxcvbnm9876543210]";
|
|
|
+
|
|
|
+ public final static String ACCOUNT_ID = "accountId";
|
|
|
+ public final static String USER_ID = "userId";
|
|
|
+ public final static String GROUP_ID = "groupId";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通过请求获取Token
|
|
|
+ * @param request
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+// @Override
|
|
|
+// public String getToken(HttpServletRequest request) {
|
|
|
+// if(request==null){
|
|
|
+// return null;
|
|
|
+// }
|
|
|
+// String token = request.getParameter("token");
|
|
|
+// if(token==null){
|
|
|
+// token = request.getHeader("X-Access-Token");
|
|
|
+// }
|
|
|
+// return token;
|
|
|
+// }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 自定义获取租户
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public String getTenantId() {
|
|
|
+// String headerTenantId = null;
|
|
|
+// HttpServletRequest request = JimuSpringContextUtils.getHttpServletRequest();
|
|
|
+// if (request != null) {
|
|
|
+// headerTenantId = request.getHeader(JmConst.HEADER_TENANT_ID);
|
|
|
+// if(OkConvertUtils.isEmpty(headerTenantId)){
|
|
|
+// headerTenantId = request.getParameter(JmConst.TENANT_ID);
|
|
|
+// }
|
|
|
+// }
|
|
|
+// return headerTenantId;
|
|
|
+ return "1";
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通过Token获取登录人用户名
|
|
|
+ * @param token
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public String getUsername(String token) {
|
|
|
+ if(StringUtils.isBlank(token)){
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ final String strUserId = this.getClaim(token, USER_ID);
|
|
|
+ // return JwtUtil.getUsername(token);
|
|
|
+ return strUserId;
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public Map<String, Object> getUserInfo(String token) {
|
|
|
+ if(StringUtils.isBlank(token)){
|
|
|
+ return new HashMap<>();
|
|
|
+ }
|
|
|
+ final String strUserId = this.getClaim(token, USER_ID);//员工ID
|
|
|
+ final String strGroupId = this.getClaim(token, GROUP_ID);//组织机构ID
|
|
|
+ //此处通过token只能拿到一个信息 用户账号 后面的就是根据账号获取其他信息 查询数据或是走redis 用户根据自身业务可自定义
|
|
|
+ //SysUserCacheInfo userInfo = sysBaseAPI.getCacheUser(username);
|
|
|
+ Map<String, Object> map = new HashMap<String, Object>();
|
|
|
+ //设置账号名
|
|
|
+ map.put("sysUserCode", strUserId);
|
|
|
+ //设置部门编码
|
|
|
+ map.put("sysOrgCode", strGroupId);
|
|
|
+ // 将所有信息存放至map 解析sql会根据map的键值解析,可自定义其他值
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 自定义用户拥有的角色
|
|
|
+ *
|
|
|
+ * @param token
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public String[] getRoles(String token) {
|
|
|
+ //积木内置三个角色 "admin","lowdeveloper","dbadeveloper"
|
|
|
+ return new String[]{"admin","lowdeveloper","dbadeveloper"};
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 自定义用户拥有的权限指令
|
|
|
+ *
|
|
|
+ * @param token
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public String[] getPermissions(String token) {
|
|
|
+ //drag:datasource:testConnection 仪表盘数据库连接测试
|
|
|
+ //onl:drag:clear:recovery 清空回收站
|
|
|
+ //drag:analysis:sql SQL解析
|
|
|
+ //drag:design:getTotalData 仪表盘对Online表单展示数据
|
|
|
+ return new String[]{"drag:datasource:testConnection","onl:drag:clear:recovery","drag:analysis:sql","drag:design:getTotalData"};
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Token校验
|
|
|
+ * @param token
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Boolean verifyToken(String token) {
|
|
|
+ //token为空 则校验是否登陆
|
|
|
+ if(StringUtils.isBlank(token)||"null".equals(token)){
|
|
|
+ HttpServletRequest request=JimuSpringContextUtils.getHttpServletRequest();
|
|
|
+ // HttpServletRequest request = ( (ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
|
|
|
+ HttpSession session= request.getSession();
|
|
|
+ Object loginResult= session.getAttribute("loginFrom");
|
|
|
+ if("jimu_example".equals(loginResult)){
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 根据密码生成JWT效验器
|
|
|
+ Algorithm algorithm = Algorithm.HMAC256(SECRET);
|
|
|
+ try {
|
|
|
+ JWTVerifier verifier = JWT.require(algorithm).build();
|
|
|
+ verifier.verify(token);
|
|
|
+ return true;
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("JWT Token verify方法验证异常:" + e.getMessage());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 自定义请求头
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public HttpHeaders customApiHeader() {
|
|
|
+ HttpHeaders header = new HttpHeaders();
|
|
|
+ String token=getToken();
|
|
|
+ header.add("Authorization", token);
|
|
|
+
|
|
|
+ return header;
|
|
|
+ }
|
|
|
+ public static String getClaim(String token, String claim) {
|
|
|
+ log.info("解析token:{}",token);
|
|
|
+ if (token == null) {
|
|
|
+ throw new RuntimeException("Token传值不能为空");
|
|
|
+ }
|
|
|
+ DecodedJWT decode = JWT.decode(token);
|
|
|
+ Date expiresAt = decode.getExpiresAt();
|
|
|
+ if (expiresAt.before(new Date())) {
|
|
|
+ throw new TokenExpiredException("Token已失效");
|
|
|
+ }
|
|
|
+ return decode.getClaim(claim).asString();
|
|
|
+ }
|
|
|
+
|
|
|
+}
|