parent
e02f2c65c0
commit
cb1bd548a6
@ -1,29 +0,0 @@
|
|||||||
package com.xxl.job.admin.annotation;
|
|
||||||
|
|
||||||
|
|
||||||
import java.lang.annotation.ElementType;
|
|
||||||
import java.lang.annotation.Retention;
|
|
||||||
import java.lang.annotation.RetentionPolicy;
|
|
||||||
import java.lang.annotation.Target;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 权限限制
|
|
||||||
* @author xuxueli 2015-12-12 18:29:02
|
|
||||||
*/
|
|
||||||
@Target(ElementType.METHOD)
|
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
|
||||||
public @interface PermissionLimit {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 登录拦截 (默认拦截)
|
|
||||||
*/
|
|
||||||
boolean limit() default true;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 要求管理员权限
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
boolean adminuser() default false;
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,7 @@
|
|||||||
|
package com.xxl.job.admin.constant;
|
||||||
|
|
||||||
|
public class Consts {
|
||||||
|
|
||||||
|
public static final String ADMIN_ROLE = "ADMIN";
|
||||||
|
|
||||||
|
}
|
@ -1,111 +0,0 @@
|
|||||||
package com.xxl.job.admin.service.impl;
|
|
||||||
|
|
||||||
import com.xxl.job.admin.mapper.XxlJobUserMapper;
|
|
||||||
import com.xxl.job.admin.model.XxlJobUser;
|
|
||||||
import com.xxl.job.admin.util.CookieUtil;
|
|
||||||
import com.xxl.job.admin.util.I18nUtil;
|
|
||||||
import com.xxl.job.core.biz.model.ReturnT;
|
|
||||||
import com.xxl.job.core.util.GsonTool;
|
|
||||||
import com.xxl.tool.encrypt.SHA256Tool;
|
|
||||||
import jakarta.annotation.Resource;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
import java.math.BigInteger;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author xuxueli 2019-05-04 22:13:264
|
|
||||||
*/
|
|
||||||
@Service
|
|
||||||
public class LoginService {
|
|
||||||
|
|
||||||
public static final String LOGIN_IDENTITY_KEY = "XXL_JOB_LOGIN_IDENTITY";
|
|
||||||
|
|
||||||
@Resource
|
|
||||||
private XxlJobUserMapper xxlJobUserMapper;
|
|
||||||
|
|
||||||
|
|
||||||
// ---------------------- token tool ----------------------
|
|
||||||
|
|
||||||
private String makeToken(XxlJobUser xxlJobUser){
|
|
||||||
String tokenJson = GsonTool.toJson(xxlJobUser);
|
|
||||||
String tokenHex = new BigInteger(tokenJson.getBytes()).toString(16);
|
|
||||||
return tokenHex;
|
|
||||||
}
|
|
||||||
private XxlJobUser parseToken(String tokenHex){
|
|
||||||
XxlJobUser xxlJobUser = null;
|
|
||||||
if (tokenHex != null) {
|
|
||||||
String tokenJson = new String(new BigInteger(tokenHex, 16).toByteArray()); // username_password(md5)
|
|
||||||
xxlJobUser = GsonTool.fromJson(tokenJson, XxlJobUser.class);
|
|
||||||
}
|
|
||||||
return xxlJobUser;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ---------------------- login tool, with cookie and db ----------------------
|
|
||||||
|
|
||||||
public ReturnT<String> login(HttpServletRequest request, HttpServletResponse response, String username, String password, boolean ifRemember){
|
|
||||||
|
|
||||||
// param
|
|
||||||
if (username==null || username.trim().length()==0 || password==null || password.trim().length()==0){
|
|
||||||
return new ReturnT<String>(500, I18nUtil.getString("login_param_empty"));
|
|
||||||
}
|
|
||||||
|
|
||||||
// valid passowrd
|
|
||||||
XxlJobUser xxlJobUser = xxlJobUserMapper.loadByUserName(username);
|
|
||||||
if (xxlJobUser == null) {
|
|
||||||
return new ReturnT<String>(500, I18nUtil.getString("login_param_unvalid"));
|
|
||||||
}
|
|
||||||
String passwordHash = SHA256Tool.sha256(password);
|
|
||||||
if (!passwordHash.equals(xxlJobUser.getPassword())) {
|
|
||||||
return new ReturnT<String>(500, I18nUtil.getString("login_param_unvalid"));
|
|
||||||
}
|
|
||||||
|
|
||||||
String loginToken = makeToken(xxlJobUser);
|
|
||||||
|
|
||||||
// do login
|
|
||||||
CookieUtil.set(response, LOGIN_IDENTITY_KEY, loginToken, ifRemember);
|
|
||||||
return ReturnT.ofSuccess();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* logout
|
|
||||||
*
|
|
||||||
* @param request
|
|
||||||
* @param response
|
|
||||||
*/
|
|
||||||
public ReturnT<String> logout(HttpServletRequest request, HttpServletResponse response){
|
|
||||||
CookieUtil.remove(request, response, LOGIN_IDENTITY_KEY);
|
|
||||||
return ReturnT.ofSuccess();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* logout
|
|
||||||
*
|
|
||||||
* @param request
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public XxlJobUser ifLogin(HttpServletRequest request, HttpServletResponse response){
|
|
||||||
String cookieToken = CookieUtil.getValue(request, LOGIN_IDENTITY_KEY);
|
|
||||||
if (cookieToken != null) {
|
|
||||||
XxlJobUser cookieUser = null;
|
|
||||||
try {
|
|
||||||
cookieUser = parseToken(cookieToken);
|
|
||||||
} catch (Exception e) {
|
|
||||||
logout(request, response);
|
|
||||||
}
|
|
||||||
if (cookieUser != null) {
|
|
||||||
XxlJobUser dbUser = xxlJobUserMapper.loadByUserName(cookieUser.getUsername());
|
|
||||||
if (dbUser != null) {
|
|
||||||
if (cookieUser.getPassword().equals(dbUser.getPassword())) {
|
|
||||||
return dbUser;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -1,131 +0,0 @@
|
|||||||
package com.xxl.job.admin.web.xxlsso;
|
|
||||||
|
|
||||||
import com.xxl.job.admin.annotation.PermissionLimit;
|
|
||||||
import com.xxl.job.admin.model.XxlJobGroup;
|
|
||||||
import com.xxl.job.admin.model.XxlJobUser;
|
|
||||||
import com.xxl.job.admin.util.I18nUtil;
|
|
||||||
import com.xxl.job.admin.service.impl.LoginService;
|
|
||||||
import jakarta.annotation.Resource;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
import org.springframework.web.method.HandlerMethod;
|
|
||||||
import org.springframework.web.servlet.AsyncHandlerInterceptor;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 权限拦截
|
|
||||||
*
|
|
||||||
* @author xuxueli 2015-12-12 18:09:04
|
|
||||||
*/
|
|
||||||
@Component
|
|
||||||
public class PermissionInterceptor implements AsyncHandlerInterceptor {
|
|
||||||
|
|
||||||
@Resource
|
|
||||||
private LoginService loginService;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
|
|
||||||
|
|
||||||
if (!(handler instanceof HandlerMethod)) {
|
|
||||||
return true; // proceed with the next interceptor
|
|
||||||
}
|
|
||||||
|
|
||||||
// if need login
|
|
||||||
boolean needLogin = true;
|
|
||||||
boolean needAdminuser = false;
|
|
||||||
HandlerMethod method = (HandlerMethod)handler;
|
|
||||||
PermissionLimit permission = method.getMethodAnnotation(PermissionLimit.class);
|
|
||||||
if (permission!=null) {
|
|
||||||
needLogin = permission.limit();
|
|
||||||
needAdminuser = permission.adminuser();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (needLogin) {
|
|
||||||
XxlJobUser loginUser = loginService.ifLogin(request, response);
|
|
||||||
if (loginUser == null) {
|
|
||||||
response.setStatus(302);
|
|
||||||
response.setHeader("location", request.getContextPath()+"/auth/toLogin");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (needAdminuser && loginUser.getRole()!=1) {
|
|
||||||
throw new RuntimeException(I18nUtil.getString("system_permission_limit"));
|
|
||||||
}
|
|
||||||
|
|
||||||
// set loginUser, with request
|
|
||||||
setLoginUser(request, loginUser);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true; // proceed with the next interceptor
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// -------------------- permission tool --------------------
|
|
||||||
|
|
||||||
/**
|
|
||||||
* set loginUser
|
|
||||||
*
|
|
||||||
* @param request
|
|
||||||
* @param loginUser
|
|
||||||
*/
|
|
||||||
private static void setLoginUser(HttpServletRequest request, XxlJobUser loginUser){
|
|
||||||
request.setAttribute("loginUser", loginUser);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* get loginUser
|
|
||||||
*
|
|
||||||
* @param request
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public static XxlJobUser getLoginUser(HttpServletRequest request){
|
|
||||||
XxlJobUser loginUser = (XxlJobUser) request.getAttribute("loginUser"); // get loginUser, with request
|
|
||||||
return loginUser;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* valid permission by JobGroup
|
|
||||||
*
|
|
||||||
* @param request
|
|
||||||
* @param jobGroup
|
|
||||||
*/
|
|
||||||
public static void validJobGroupPermission(HttpServletRequest request, int jobGroup) {
|
|
||||||
XxlJobUser loginUser = getLoginUser(request);
|
|
||||||
if (!loginUser.validPermission(jobGroup)) {
|
|
||||||
throw new RuntimeException(I18nUtil.getString("system_permission_limit") + "[username="+ loginUser.getUsername() +"]");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* filter XxlJobGroup by role
|
|
||||||
*
|
|
||||||
* @param request
|
|
||||||
* @param jobGroupList_all
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public static List<XxlJobGroup> filterJobGroupByRole(HttpServletRequest request, List<XxlJobGroup> jobGroupList_all){
|
|
||||||
List<XxlJobGroup> jobGroupList = new ArrayList<>();
|
|
||||||
if (jobGroupList_all!=null && jobGroupList_all.size()>0) {
|
|
||||||
XxlJobUser loginUser = PermissionInterceptor.getLoginUser(request);
|
|
||||||
if (loginUser.getRole() == 1) {
|
|
||||||
jobGroupList = jobGroupList_all;
|
|
||||||
} else {
|
|
||||||
List<String> groupIdStrs = new ArrayList<>();
|
|
||||||
if (loginUser.getPermission()!=null && loginUser.getPermission().trim().length()>0) {
|
|
||||||
groupIdStrs = Arrays.asList(loginUser.getPermission().trim().split(","));
|
|
||||||
}
|
|
||||||
for (XxlJobGroup groupItem:jobGroupList_all) {
|
|
||||||
if (groupIdStrs.contains(String.valueOf(groupItem.getId()))) {
|
|
||||||
jobGroupList.add(groupItem);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return jobGroupList;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -1,25 +0,0 @@
|
|||||||
package com.xxl.job.admin.web.xxlsso;
|
|
||||||
|
|
||||||
import com.xxl.job.admin.web.interceptor.CommonDataInterceptor;
|
|
||||||
import jakarta.annotation.Resource;
|
|
||||||
import org.springframework.context.annotation.Configuration;
|
|
||||||
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
|
||||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* web mvc config
|
|
||||||
*
|
|
||||||
* @author xuxueli 2018-04-02 20:48:20
|
|
||||||
*/
|
|
||||||
@Configuration
|
|
||||||
public class WebMvcConfig implements WebMvcConfigurer {
|
|
||||||
|
|
||||||
@Resource
|
|
||||||
private PermissionInterceptor permissionInterceptor;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addInterceptors(InterceptorRegistry registry) {
|
|
||||||
registry.addInterceptor(permissionInterceptor).addPathPatterns("/**");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,62 @@
|
|||||||
|
package com.xxl.job.admin.web.xxlsso;
|
||||||
|
|
||||||
|
import com.xxl.sso.core.auth.interceptor.XxlSsoWebInterceptor;
|
||||||
|
import com.xxl.sso.core.bootstrap.XxlSsoBootstrap;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
||||||
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author xuxueli 2018-11-15
|
||||||
|
*/
|
||||||
|
@Configuration
|
||||||
|
public class XxlSsoConfig implements WebMvcConfigurer {
|
||||||
|
|
||||||
|
|
||||||
|
@Value("${xxl-sso.token.key}")
|
||||||
|
private String tokenKey;
|
||||||
|
|
||||||
|
@Value("${xxl-sso.token.timeout}")
|
||||||
|
private long tokenTimeout;
|
||||||
|
|
||||||
|
@Value("${xxl-sso.client.excluded.paths}")
|
||||||
|
private String excludedPaths;
|
||||||
|
|
||||||
|
@Value("${xxl-sso.client.login.path}")
|
||||||
|
private String loginPath;
|
||||||
|
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private SimpleLoginStore loginStore;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1、配置 XxlSsoBootstrap
|
||||||
|
*/
|
||||||
|
@Bean(initMethod = "start", destroyMethod = "stop")
|
||||||
|
public XxlSsoBootstrap xxlSsoBootstrap() {
|
||||||
|
|
||||||
|
XxlSsoBootstrap bootstrap = new XxlSsoBootstrap();
|
||||||
|
bootstrap.setLoginStore(loginStore);
|
||||||
|
bootstrap.setTokenKey(tokenKey);
|
||||||
|
bootstrap.setTokenTimeout(tokenTimeout);
|
||||||
|
return bootstrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 2、配置 XxlSso 拦截器
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void addInterceptors(InterceptorRegistry registry) {
|
||||||
|
|
||||||
|
// 2.1、build xxl-sso interceptor
|
||||||
|
XxlSsoWebInterceptor webInterceptor = new XxlSsoWebInterceptor(excludedPaths, loginPath);
|
||||||
|
|
||||||
|
// 2.2、add interceptor
|
||||||
|
registry.addInterceptor(webInterceptor).addPathPatterns("/**");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,71 +1,71 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
<mapper namespace="com.xxl.job.admin.mapper.XxlJobLogGlueMapper">
|
<mapper namespace="com.xxl.job.admin.mapper.XxlJobLogGlueMapper">
|
||||||
|
|
||||||
<resultMap id="XxlJobLogGlue" type="com.xxl.job.admin.model.XxlJobLogGlue" >
|
<resultMap id="XxlJobLogGlue" type="com.xxl.job.admin.model.XxlJobLogGlue" >
|
||||||
<result column="id" property="id" />
|
<result column="id" property="id" />
|
||||||
<result column="job_id" property="jobId" />
|
<result column="job_id" property="jobId" />
|
||||||
<result column="glue_type" property="glueType" />
|
<result column="glue_type" property="glueType" />
|
||||||
<result column="glue_source" property="glueSource" />
|
<result column="glue_source" property="glueSource" />
|
||||||
<result column="glue_remark" property="glueRemark" />
|
<result column="glue_remark" property="glueRemark" />
|
||||||
<result column="add_time" property="addTime" />
|
<result column="add_time" property="addTime" />
|
||||||
<result column="update_time" property="updateTime" />
|
<result column="update_time" property="updateTime" />
|
||||||
</resultMap>
|
</resultMap>
|
||||||
|
|
||||||
<sql id="Base_Column_List">
|
<sql id="Base_Column_List">
|
||||||
t.id,
|
t.id,
|
||||||
t.job_id,
|
t.job_id,
|
||||||
t.glue_type,
|
t.glue_type,
|
||||||
t.glue_source,
|
t.glue_source,
|
||||||
t.glue_remark,
|
t.glue_remark,
|
||||||
t.add_time,
|
t.add_time,
|
||||||
t.update_time
|
t.update_time
|
||||||
</sql>
|
</sql>
|
||||||
|
|
||||||
<insert id="save" parameterType="com.xxl.job.admin.model.XxlJobLogGlue" useGeneratedKeys="true" keyProperty="id" >
|
<insert id="save" parameterType="com.xxl.job.admin.model.XxlJobLogGlue" useGeneratedKeys="true" keyProperty="id" >
|
||||||
INSERT INTO xxl_job_logglue (
|
INSERT INTO xxl_job_logglue (
|
||||||
`job_id`,
|
`job_id`,
|
||||||
`glue_type`,
|
`glue_type`,
|
||||||
`glue_source`,
|
`glue_source`,
|
||||||
`glue_remark`,
|
`glue_remark`,
|
||||||
`add_time`,
|
`add_time`,
|
||||||
`update_time`
|
`update_time`
|
||||||
) VALUES (
|
) VALUES (
|
||||||
#{jobId},
|
#{jobId},
|
||||||
#{glueType},
|
#{glueType},
|
||||||
#{glueSource},
|
#{glueSource},
|
||||||
#{glueRemark},
|
#{glueRemark},
|
||||||
#{addTime},
|
#{addTime},
|
||||||
#{updateTime}
|
#{updateTime}
|
||||||
);
|
);
|
||||||
<!--<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
|
<!--<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
|
||||||
SELECT LAST_INSERT_ID()
|
SELECT LAST_INSERT_ID()
|
||||||
</selectKey>-->
|
</selectKey>-->
|
||||||
</insert>
|
</insert>
|
||||||
|
|
||||||
<select id="findByJobId" parameterType="java.lang.Integer" resultMap="XxlJobLogGlue">
|
<select id="findByJobId" parameterType="java.lang.Integer" resultMap="XxlJobLogGlue">
|
||||||
SELECT <include refid="Base_Column_List" />
|
SELECT <include refid="Base_Column_List" />
|
||||||
FROM xxl_job_logglue AS t
|
FROM xxl_job_logglue AS t
|
||||||
WHERE t.job_id = #{jobId}
|
WHERE t.job_id = #{jobId}
|
||||||
ORDER BY id DESC
|
ORDER BY id DESC
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<delete id="removeOld" >
|
<delete id="removeOld" >
|
||||||
DELETE FROM xxl_job_logglue
|
DELETE FROM xxl_job_logglue
|
||||||
WHERE id NOT in(
|
WHERE id NOT in(
|
||||||
SELECT id FROM(
|
SELECT id FROM(
|
||||||
SELECT id FROM xxl_job_logglue
|
SELECT id FROM xxl_job_logglue
|
||||||
WHERE `job_id` = #{jobId}
|
WHERE `job_id` = #{jobId}
|
||||||
ORDER BY update_time desc
|
ORDER BY update_time desc
|
||||||
LIMIT 0, #{limit}
|
LIMIT 0, #{limit}
|
||||||
) t1
|
) t1
|
||||||
) AND `job_id` = #{jobId}
|
) AND `job_id` = #{jobId}
|
||||||
</delete>
|
</delete>
|
||||||
|
|
||||||
<delete id="deleteByJobId" parameterType="java.lang.Integer" >
|
<delete id="deleteByJobId" parameterType="java.lang.Integer" >
|
||||||
DELETE FROM xxl_job_logglue
|
DELETE FROM xxl_job_logglue
|
||||||
WHERE `job_id` = #{jobId}
|
WHERE `job_id` = #{jobId}
|
||||||
</delete>
|
</delete>
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
Loading…
Reference in new issue