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("/**");
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in new issue