Commit 8c4fd97e authored by 郑杰's avatar 郑杰
Browse files

v1.5 beta版发布,详细查看发行版说明

parent b066bb99
package me.zhengjie.quartz.service;
package me.zhengjie.modules.quartz.service;
import me.zhengjie.quartz.domain.QuartzJob;
import me.zhengjie.modules.quartz.domain.QuartzJob;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
/**
* @author 郑杰
* @date 2018/10/05 19:17:38
* @author jie
* @date 2019-01-07
*/
@CacheConfig(cacheNames = "quartzJob")
public interface QuartzJobService {
......
package me.zhengjie.quartz.service.impl;
package me.zhengjie.modules.quartz.service.impl;
import me.zhengjie.common.exception.BadRequestException;
import me.zhengjie.common.utils.ValidationUtil;
import me.zhengjie.quartz.domain.QuartzJob;
import me.zhengjie.quartz.repository.QuartzJobRepository;
import me.zhengjie.quartz.service.QuartzJobService;
import me.zhengjie.quartz.utils.QuartzManage;
import me.zhengjie.exception.BadRequestException;
import me.zhengjie.modules.quartz.domain.QuartzJob;
import me.zhengjie.modules.quartz.repository.QuartzJobRepository;
import me.zhengjie.modules.quartz.service.QuartzJobService;
import me.zhengjie.modules.quartz.utils.QuartzManage;
import me.zhengjie.utils.ValidationUtil;
import org.quartz.CronExpression;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.Optional;
/**
......
package me.zhengjie.quartz.service.query;
package me.zhengjie.modules.quartz.service.query;
import me.zhengjie.common.utils.PageUtil;
import me.zhengjie.quartz.domain.QuartzJob;
import me.zhengjie.quartz.repository.QuartzJobRepository;
import me.zhengjie.modules.quartz.domain.QuartzJob;
import me.zhengjie.modules.quartz.repository.QuartzJobRepository;
import me.zhengjie.utils.PageUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable;
......
package me.zhengjie.quartz.service.query;
package me.zhengjie.modules.quartz.service.query;
import me.zhengjie.common.utils.PageUtil;
import me.zhengjie.quartz.domain.QuartzLog;
import me.zhengjie.quartz.repository.QuartzLogRepository;
import me.zhengjie.modules.quartz.domain.QuartzLog;
import me.zhengjie.modules.quartz.repository.QuartzLogRepository;
import me.zhengjie.utils.PageUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
......
package me.zhengjie.quartz.task;
package me.zhengjie.modules.quartz.task;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
......
package me.zhengjie.quartz.task;
package me.zhengjie.modules.quartz.task;
import me.zhengjie.monitor.service.VisitsService;
import me.zhengjie.modules.monitor.service.VisitsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
......
package me.zhengjie.quartz.utils;
package me.zhengjie.modules.quartz.utils;
import me.zhengjie.common.utils.SpringContextHolder;
import me.zhengjie.common.utils.ThrowableUtil;
import me.zhengjie.quartz.domain.QuartzJob;
import me.zhengjie.quartz.domain.QuartzLog;
import me.zhengjie.quartz.repository.QuartzLogRepository;
import me.zhengjie.quartz.service.QuartzJobService;
import me.zhengjie.modules.quartz.domain.QuartzJob;
import me.zhengjie.modules.quartz.domain.QuartzLog;
import me.zhengjie.modules.quartz.repository.QuartzLogRepository;
import me.zhengjie.modules.quartz.service.QuartzJobService;
import me.zhengjie.utils.SpringContextHolder;
import me.zhengjie.utils.ThrowableUtil;
import org.quartz.JobExecutionContext;
import org.quartz.Scheduler;
import org.slf4j.Logger;
......
package me.zhengjie.quartz.utils;
package me.zhengjie.modules.quartz.utils;
import lombok.extern.slf4j.Slf4j;
import me.zhengjie.common.exception.BadRequestException;
import me.zhengjie.quartz.domain.QuartzJob;
import me.zhengjie.exception.BadRequestException;
import me.zhengjie.modules.quartz.domain.QuartzJob;
import org.quartz.*;
import org.quartz.impl.triggers.CronTriggerImpl;
import org.springframework.stereotype.Component;
......@@ -50,7 +50,7 @@ public class QuartzManage {
}
} catch (Exception e){
log.error("创建定时任务失败", e);
throw new BadRequestException(e.getMessage());
throw new BadRequestException("创建定时任务失败");
}
}
......@@ -63,6 +63,11 @@ public class QuartzManage {
try {
TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getId());
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
// 如果不存在则创建一个定时任务
if(trigger == null){
addJob(quartzJob);
trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
}
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(quartzJob.getCronExpression());
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
//重置启动时间
......@@ -75,7 +80,7 @@ public class QuartzManage {
}
} catch (Exception e){
log.error("更新定时任务失败", e);
throw new BadRequestException(e.getMessage());
throw new BadRequestException("更新定时任务失败");
}
}
......@@ -91,7 +96,7 @@ public class QuartzManage {
scheduler.deleteJob(jobKey);
} catch (Exception e){
log.error("删除定时任务失败", e);
throw new BadRequestException(e.getMessage());
throw new BadRequestException("删除定时任务失败");
}
}
......@@ -112,7 +117,7 @@ public class QuartzManage {
scheduler.resumeJob(jobKey);
} catch (Exception e){
log.error("恢复定时任务失败", e);
throw new BadRequestException(e.getMessage());
throw new BadRequestException("恢复定时任务失败");
}
}
......@@ -135,7 +140,7 @@ public class QuartzManage {
scheduler.triggerJob(jobKey,dataMap);
} catch (Exception e){
log.error("定时任务执行失败", e);
throw new BadRequestException(e.getMessage());
throw new BadRequestException("定时任务执行失败");
}
}
......@@ -150,7 +155,7 @@ public class QuartzManage {
scheduler.pauseJob(jobKey);
} catch (Exception e){
log.error("定时任务暂停失败", e);
throw new BadRequestException(e.getMessage());
throw new BadRequestException("定时任务暂停失败");
}
}
}
package me.zhengjie.quartz.utils;
package me.zhengjie.modules.quartz.utils;
import lombok.extern.slf4j.Slf4j;
import me.zhengjie.common.utils.SpringContextHolder;
import me.zhengjie.utils.SpringContextHolder;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ReflectionUtils;
import java.lang.reflect.Method;
......
package me.zhengjie.core.config;
package me.zhengjie.modules.security.config;
import me.zhengjie.core.security.JwtAuthenticationEntryPoint;
import me.zhengjie.core.security.JwtAuthorizationTokenFilter;
import me.zhengjie.core.service.JwtUserDetailsService;
import me.zhengjie.modules.security.security.JwtAuthenticationEntryPoint;
import me.zhengjie.modules.security.security.JwtAuthorizationTokenFilter;
import me.zhengjie.modules.security.service.JwtUserDetailsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
......@@ -23,7 +23,7 @@ import org.springframework.security.web.authentication.UsernamePasswordAuthentic
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private JwtAuthenticationEntryPoint unauthorizedHandler;
......@@ -63,6 +63,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity
// 禁用 CSRF
......
package me.zhengjie.core.rest;
package me.zhengjie.modules.security.rest;
import lombok.extern.slf4j.Slf4j;
import me.zhengjie.common.aop.log.Log;
import me.zhengjie.core.security.AuthenticationToken;
import me.zhengjie.core.security.AuthorizationUser;
import me.zhengjie.core.utils.JwtTokenUtil;
import me.zhengjie.core.security.JwtUser;
import me.zhengjie.core.utils.EncryptUtils;
import me.zhengjie.aop.log.Log;
import me.zhengjie.modules.security.security.AuthenticationToken;
import me.zhengjie.modules.security.security.AuthorizationUser;
import me.zhengjie.modules.security.security.JwtUser;
import me.zhengjie.utils.EncryptUtils;
import me.zhengjie.modules.security.utils.JwtTokenUtil;
import me.zhengjie.utils.SecurityContextHolder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.AccountExpiredException;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
/**
* @author jie
......@@ -31,9 +30,6 @@ public class AuthenticationController {
@Value("${jwt.header}")
private String tokenHeader;
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private JwtTokenUtil jwtTokenUtil;
......@@ -46,9 +42,9 @@ public class AuthenticationController {
* @param authorizationUser
* @return
*/
@Log(description = "用户登录")
@Log("用户登录")
@PostMapping(value = "${jwt.auth.path}")
public ResponseEntity<?> authenticationLogin(@RequestBody AuthorizationUser authorizationUser){
public ResponseEntity<?> login(@RequestBody AuthorizationUser authorizationUser){
final UserDetails userDetails = userDetailsService.loadUserByUsername(authorizationUser.getUsername());
......@@ -69,12 +65,12 @@ public class AuthenticationController {
/**
* 获取用户信息
* @param request
* @return
*/
@GetMapping(value = "${jwt.auth.account}")
public ResponseEntity getUserInfo(HttpServletRequest request){
JwtUser jwtUser = (JwtUser)userDetailsService.loadUserByUsername(jwtTokenUtil.getUserName(request));
public ResponseEntity getUserInfo(){
UserDetails userDetails = SecurityContextHolder.getUserDetails();
JwtUser jwtUser = (JwtUser)userDetailsService.loadUserByUsername(userDetails.getUsername());
return ResponseEntity.ok(jwtUser);
}
}
package me.zhengjie.core.security;
package me.zhengjie.modules.security.security;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.io.Serializable;
/**
......
package me.zhengjie.core.security;
package me.zhengjie.modules.security.security;
import lombok.Getter;
import lombok.Setter;
......
package me.zhengjie.core.security;
package me.zhengjie.modules.security.security;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
......
package me.zhengjie.core.security;
package me.zhengjie.modules.security.security;
import io.jsonwebtoken.ExpiredJwtException;
import me.zhengjie.core.utils.JwtTokenUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import lombok.extern.slf4j.Slf4j;
import me.zhengjie.modules.security.utils.JwtTokenUtil;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
......@@ -19,11 +18,10 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Slf4j
@Component
public class JwtAuthorizationTokenFilter extends OncePerRequestFilter {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
private final UserDetailsService userDetailsService;
private final JwtTokenUtil jwtTokenUtil;
private final String tokenHeader;
......@@ -36,7 +34,7 @@ public class JwtAuthorizationTokenFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
logger.debug("processing authentication for '{}'", request.getRequestURL());
log.debug("processing authentication for '{}'", request.getRequestURL());
final String requestHeader = request.getHeader(this.tokenHeader);
......@@ -47,14 +45,14 @@ public class JwtAuthorizationTokenFilter extends OncePerRequestFilter {
try {
username = jwtTokenUtil.getUsernameFromToken(authToken);
} catch (ExpiredJwtException e) {
logger.error(e.getMessage());
log.error(e.getMessage());
}
}
logger.debug("checking authentication for user '{}'", username);
log.debug("checking authentication for user '{}'", username);
if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
logger.debug("security context was null, so authorizating user");
log.debug("security context was null, so authorizating user");
// It is not compelling necessary to load the use details from the database. You could also store the information
// in the token and read it from it. It's up to you ;)
......@@ -65,7 +63,7 @@ public class JwtAuthorizationTokenFilter extends OncePerRequestFilter {
if (jwtTokenUtil.validateToken(authToken, userDetails)) {
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
logger.info("authorizated user '{}', setting security context", username);
log.info("authorizated user '{}', setting security context", username);
SecurityContextHolder.getContext().setAuthentication(authentication);
}
}
......
package me.zhengjie.core.security;
package me.zhengjie.modules.security.security;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
......@@ -7,7 +7,10 @@ import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.sql.Timestamp;
import java.util.*;
import java.util.Collection;
import java.util.Date;
import java.util.LinkedHashSet;
import java.util.Set;
/**
* @author jie
......
package me.zhengjie.core.service;
package me.zhengjie.modules.security.service;
import me.zhengjie.common.exception.EntityNotFoundException;
import me.zhengjie.common.utils.ValidationUtil;
import me.zhengjie.core.security.JwtUser;
import me.zhengjie.system.domain.Permission;
import me.zhengjie.system.domain.Role;
import me.zhengjie.system.domain.User;
import me.zhengjie.system.repository.PermissionRepository;
import me.zhengjie.system.repository.UserRepository;
import me.zhengjie.modules.system.domain.Permission;
import me.zhengjie.modules.system.domain.Role;
import me.zhengjie.modules.system.domain.User;
import me.zhengjie.exception.EntityNotFoundException;
import me.zhengjie.modules.system.repository.UserRepository;
import me.zhengjie.modules.security.security.JwtUser;
import me.zhengjie.utils.ValidationUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable;
......@@ -18,7 +17,6 @@ import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
......@@ -35,9 +33,6 @@ public class JwtUserDetailsService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Autowired
private PermissionRepository permissionRepository;
@Override
public UserDetails loadUserByUsername(String username){
......@@ -62,20 +57,20 @@ public class JwtUserDetailsService implements UserDetailsService {
user.getPassword(),
user.getAvatar(),
user.getEmail(),
mapToGrantedAuthorities(user.getRoles(),permissionRepository),
mapToGrantedAuthorities(user.getRoles()),
user.getEnabled(),
user.getCreateTime(),
user.getLastPasswordResetTime()
);
}
private static List<GrantedAuthority> mapToGrantedAuthorities(Set<Role> roles,PermissionRepository permissionRepository) {
private static List<GrantedAuthority> mapToGrantedAuthorities(Set<Role> roles) {
Set<Permission> permissions = new HashSet<>();
for (Role role : roles) {
Set<Role> roleSet = new HashSet<>();
roleSet.add(role);
permissions.addAll(permissionRepository.findByRoles(roleSet));
permissions.addAll(role.getPermissions());
}
return permissions.stream()
......
package me.zhengjie.core.utils;
package me.zhengjie.modules.security.utils;
import io.jsonwebtoken.*;
import io.jsonwebtoken.impl.DefaultClock;
import me.zhengjie.common.exception.BadRequestException;
import me.zhengjie.core.security.JwtUser;
import me.zhengjie.exception.BadRequestException;
import me.zhengjie.modules.security.security.JwtUser;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.security.core.userdetails.UserDetails;
......@@ -111,31 +111,14 @@ public class JwtTokenUtil implements Serializable {
JwtUser user = (JwtUser) userDetails;
final String username = getUsernameFromToken(token);
final Date created = getIssuedAtDateFromToken(token);
//final Date expiration = getExpirationDateFromToken(token);
// final Date expiration = getExpirationDateFromToken(token);
// 如果token存在,且token创建日期 > 最后修改密码的日期 则代表token有效
return (
username.equals(user.getUsername())
&& !isTokenExpired(token)
&& !isCreatedBeforeLastPasswordReset(created, user.getLastPasswordResetDate())
);
}
public String getUserName(HttpServletRequest request){
String authToken = request.getHeader(tokenHeader);
if(StringUtils.isEmpty(authToken)||authToken.length()<7){
throw new BadRequestException(HttpStatus.FORBIDDEN,"Token令牌无效");
}
final String token = authToken.substring(7);
String username = null;
try {
username = getUsernameFromToken(token);
} catch (ExpiredJwtException e){
throw new BadRequestException(HttpStatus.UNAUTHORIZED,"Token令牌已过期");
}
return username;
}
private Date calculateExpirationDate(Date createdDate) {
return new Date(createdDate.getTime() + expiration);
......
package me.zhengjie.system.domain;
package me.zhengjie.modules.system.domain;
import lombok.Getter;
import lombok.Setter;
......@@ -44,6 +44,7 @@ public class Menu {
/**
* 是否为外链 true/false
*/
@Column(name = "i_frame")
private Boolean iFrame;
@ManyToMany
......@@ -51,5 +52,6 @@ public class Menu {
private Set<Role> roles;
@CreationTimestamp
@Column(name = "create_time")
private Timestamp createTime;
}
package me.zhengjie.system.domain;
package me.zhengjie.modules.system.domain;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.CreationTimestamp;
import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
......@@ -43,6 +44,7 @@ public class Permission implements Serializable{
private Set<Role> roles;
@CreationTimestamp
@Column(name = "create_time")
private Timestamp createTime;
@Override
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment