@@ -186,6 +186,11 @@ | |||
<artifactId>hutool-all</artifactId> | |||
<version>4.6.10</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>io.projectreactor</groupId> | |||
<artifactId>reactor-core</artifactId> | |||
<version>3.2.5.RELEASE</version> | |||
</dependency> | |||
</dependencies> | |||
@@ -12,6 +12,7 @@ import com.xdf.creative.util.page.PageTool; | |||
import io.swagger.annotations.Api; | |||
import io.swagger.annotations.ApiOperation; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.apache.shiro.authz.annotation.RequiresPermissions; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.web.bind.annotation.*; | |||
@@ -83,6 +84,7 @@ public class SysRegionController extends BaseController { | |||
* 全国行政区域[sys_region]分页列表 | |||
*/ | |||
@GetMapping("/getPageList") | |||
@RequiresPermissions("/sysRegion/getPageList") | |||
@ApiOperation(value = "获取SysRegion分页列表", notes = "全国行政区域[sys_region]分页列表", response = SysRegionQueryVo.class) | |||
public ApiResult<PageTool<SysRegionQueryVo>> getSysRegionPageList(@Valid @RequestBody SysRegionQueryParam sysRegionQueryParam) throws Exception { | |||
PageTool<SysRegionQueryVo> pageList = sysRegionService.getSysRegionPageList(sysRegionQueryParam); | |||
@@ -95,6 +97,7 @@ public class SysRegionController extends BaseController { | |||
*/ | |||
@OperationLogger(value = "获取SysRegion列表") //这里添加了AOP的自定义注解 | |||
@PostMapping("/getRegionList") | |||
@RequiresPermissions("/sysRegion/getRegionList") | |||
@ApiOperation(value = "获取SysRegion列表", notes = "全国行政区域[sys_region]分页列表", response = SysRegionQueryVo.class) | |||
public ApiResult<List<SysRegionQueryVo>> getSysRegionList(@Valid @RequestBody SysRegionQueryParam sysRegionQueryParam) throws Exception { | |||
return ApiResult.ok(sysRegionService.getSysRegionList(sysRegionQueryParam)); |
@@ -37,6 +37,7 @@ import com.xdf.creative.util.StringUtil; | |||
import com.xdf.creative.util.UUIDUtil; | |||
import com.xdf.creative.util.convert.SysUserConvert; | |||
import com.xdf.creative.util.page.PageTool; | |||
import io.swagger.annotations.Api; | |||
import lombok.extern.slf4j.Slf4j; | |||
import cn.hutool.core.collection.CollectionUtil; | |||
import org.apache.shiro.SecurityUtils; | |||
@@ -60,6 +61,7 @@ import java.util.*; | |||
* @author DeanYe | |||
* @since 2019-10-24 | |||
*/ | |||
@Api | |||
@Slf4j | |||
@Service | |||
public class SysUserServiceImpl extends BaseServiceImpl<SysUserMapper, SysUser> implements SysUserService { | |||
@@ -140,17 +142,14 @@ public class SysUserServiceImpl extends BaseServiceImpl<SysUserMapper, SysUser> | |||
String token = JwtUtil.generateToken(sysUser.getId(), userName, sysUser.getOrganizeId(),sysUser.getUserType(), newSalt, Duration.ofSeconds(expireSecond)); | |||
log.debug("token:{}", token); | |||
// 创建AuthenticationToken | |||
JwtToken jwtToken = JwtToken.build(token, sysUser.getId(), userName, sysUser.getOrganizeId(),sysUser.getUserType(), newSalt, expireSecond); | |||
JwtToken jwtToken = new JwtToken(token); | |||
Subject subject = SecurityUtils.getSubject(); | |||
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken( | |||
loginParam.getUsername(), | |||
loginParam.getPassword()); | |||
//进行验证,这里可以捕获异常,然后返回对应信息 | |||
subject.login(usernamePasswordToken); | |||
subject.login(jwtToken); | |||
// 返回token和登陆用户信息对象 | |||
LoginSysUserTokenVo loginSysUserTokenVo = new LoginSysUserTokenVo(); | |||
loginSysUserTokenVo.setToken("12wer234f345g34g45"); | |||
loginSysUserTokenVo.setToken(token); | |||
loginSysUserTokenVo.setLoginSysUserVo(loginSysUserVo); | |||
return loginSysUserTokenVo; | |||
} |
@@ -1,11 +1,18 @@ | |||
package com.xdf.creative.shiro; | |||
import cn.hutool.core.collection.CollectionUtil; | |||
import com.alibaba.fastjson.JSON; | |||
import com.xdf.creative.base.vo.creative.SysRoleQueryVo; | |||
import com.xdf.creative.enums.ApiCode; | |||
import com.xdf.creative.module.entity.SysUser; | |||
import com.xdf.creative.module.service.SysPermissionService; | |||
import com.xdf.creative.module.service.SysRoleService; | |||
import com.xdf.creative.module.service.SysUserService; | |||
import com.xdf.creative.shiro.jwt.JwtToken; | |||
import com.xdf.creative.shiro.jwt.JwtUtil; | |||
import com.xdf.creative.support.exception.BusinessException; | |||
import com.xdf.creative.util.StringUtil; | |||
import com.xdf.creative.util.page.ApiResult; | |||
import org.apache.shiro.authc.*; | |||
import org.apache.shiro.authz.AuthorizationInfo; | |||
import org.apache.shiro.authz.SimpleAuthorizationInfo; | |||
@@ -17,6 +24,8 @@ import org.springframework.beans.factory.annotation.Autowired; | |||
import java.util.HashSet; | |||
import java.util.List; | |||
import java.util.Set; | |||
public class CustomRealm extends AuthorizingRealm { | |||
private final static Logger log = LoggerFactory.getLogger(AuthorizingRealm.class); | |||
@@ -25,16 +34,30 @@ public class CustomRealm extends AuthorizingRealm { | |||
private SysUserService sysUserService; | |||
@Autowired | |||
private SysRoleService sysRoleService; | |||
@Autowired | |||
private SysPermissionService sysPermissionService; | |||
/** | |||
* 必须重写此方法,不然Shiro会报错 | |||
* | |||
* @param token | |||
* @return | |||
*/ | |||
@Override | |||
public boolean supports(AuthenticationToken token) { | |||
return token instanceof JwtToken; | |||
} | |||
@Override | |||
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { | |||
//获取登录用户名 | |||
String name = (String) principalCollection.getPrimaryPrincipal(); | |||
String token = (String) principalCollection.getPrimaryPrincipal(); | |||
//根据用户名去数据库查询用户信息 | |||
SysUser user = null; | |||
try { | |||
user = sysUserService.getSysUserByUserName(name); | |||
if(null==user){ | |||
user = sysUserService.getSysUserByUserName(JwtUtil.getUsername(token)); | |||
if (null == user) { | |||
return null; | |||
} | |||
} catch (Exception e) { | |||
@@ -46,7 +69,7 @@ public class CustomRealm extends AuthorizingRealm { | |||
HashSet<String> roleNameSet = new HashSet<>(); | |||
HashSet<String> roleCodeSet = new HashSet<>(); | |||
List<SysRoleQueryVo> sysRoleQueryVoList = sysRoleService.getUserRoleByUserId(user.getId()); | |||
List<SysRoleQueryVo> sysRoleQueryVoList = sysRoleService.getUserRoleByUserId(JwtUtil.getUserId(token)); | |||
if (CollectionUtil.isEmpty(sysRoleQueryVoList)) { | |||
throw new BusinessException("角色不存在"); | |||
} | |||
@@ -56,7 +79,13 @@ public class CustomRealm extends AuthorizingRealm { | |||
roleCodeSet.add(sysRoleQueryVo.getCode()); | |||
}); | |||
simpleAuthorizationInfo.setRoles(roleCodeSet); | |||
// simpleAuthorizationInfo.addStringPermission(permissions.getPermissionsName()); | |||
Set<String> permissionSrt = null; | |||
try { | |||
permissionSrt = sysPermissionService.getPermissionUrlByUserId(JwtUtil.getUserId(token)); | |||
} catch (Exception e) { | |||
throw new BusinessException("资源不存在"); | |||
} | |||
simpleAuthorizationInfo.setStringPermissions(permissionSrt); | |||
return simpleAuthorizationInfo; | |||
} | |||
@@ -66,15 +95,26 @@ public class CustomRealm extends AuthorizingRealm { | |||
if (authenticationToken.getPrincipal() == null) { | |||
return null; | |||
} | |||
UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) authenticationToken; | |||
String token = (String) authenticationToken.getCredentials(); | |||
//token失效 | |||
if (JwtUtil.isExpired(token)) { | |||
log.error("令牌过期"); | |||
String result = JSON.toJSONString(ApiResult.fail(ApiCode.TOKEN_INVALID)); | |||
throw new AuthenticationException(result); | |||
} | |||
String userName = JwtUtil.getUsername(token); | |||
if (StringUtil.isEmpty(userName)) { | |||
log.error("非法令牌"); | |||
String result = JSON.toJSONString(ApiResult.fail(ApiCode.TOKEN_INVALID)); | |||
throw new AuthenticationException(result); | |||
} | |||
//根据用户名去数据库查询用户信息 | |||
SysUser user = null; | |||
//获取用户信息 | |||
String name =usernamePasswordToken.getUsername(); | |||
try { | |||
user = sysUserService.getSysUserByUserName(name); | |||
user = sysUserService.getSysUserByUserName(userName); | |||
} catch (Exception e) { | |||
log.error("用户 { "+name+" } 不存在 "); | |||
log.error("用户 { " + userName + " } 不存在 "); | |||
throw new AccountException("账户不存在"); | |||
} | |||
if (user == null) { | |||
@@ -82,9 +122,11 @@ public class CustomRealm extends AuthorizingRealm { | |||
throw new BusinessException("用户不存在"); | |||
} else { | |||
//这里验证authenticationToken和simpleAuthenticationInfo的信息 | |||
SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(user, usernamePasswordToken.getPassword().toString(), getName()); | |||
SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(token, token, getName()); | |||
return simpleAuthenticationInfo; | |||
} | |||
} | |||
} | |||
@@ -4,13 +4,17 @@ package com.xdf.creative.shiro; | |||
* @author : lgw | |||
* @date : 15:58 2020/3/3 | |||
*/ | |||
import com.xdf.creative.shiro.filter.JwtFilter; | |||
import org.apache.shiro.SecurityUtils; | |||
import org.apache.shiro.mgt.DefaultSessionStorageEvaluator; | |||
import org.apache.shiro.mgt.DefaultSubjectDAO; | |||
import org.apache.shiro.mgt.SecurityManager; | |||
import org.apache.shiro.mgt.SubjectFactory; | |||
import org.apache.shiro.spring.LifecycleBeanPostProcessor; | |||
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; | |||
import org.apache.shiro.spring.web.ShiroFilterFactoryBean; | |||
import org.apache.shiro.web.filter.authc.AnonymousFilter; | |||
import org.apache.shiro.web.filter.authc.LogoutFilter; | |||
import org.apache.shiro.web.mgt.DefaultWebSecurityManager; | |||
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; | |||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; | |||
@@ -18,7 +22,9 @@ import org.springframework.context.annotation.Bean; | |||
import org.springframework.context.annotation.Configuration; | |||
import org.springframework.context.annotation.DependsOn; | |||
import javax.servlet.Filter; | |||
import java.util.HashMap; | |||
import java.util.LinkedHashMap; | |||
import java.util.Map; | |||
@Configuration | |||
@@ -39,18 +45,27 @@ public class ShiroConfig { | |||
return customRealm; | |||
} | |||
/* | |||
* a. 告诉shiro不要使用默认的DefaultSubject创建对象,因为不能创建Session | |||
* */ | |||
@Bean | |||
public SubjectFactory subjectFactory() { | |||
return new StatelessWebSubjectFactory(); | |||
} | |||
//权限管理,配置主要是Realm的管理认证 | |||
@Bean | |||
public SecurityManager securityManager() { | |||
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); | |||
securityManager.setRealm(myShiroRealm()); | |||
// 无状态subjectFactory设置 | |||
DefaultSessionStorageEvaluator evaluator = (DefaultSessionStorageEvaluator)((DefaultSubjectDAO) securityManager.getSubjectDAO()).getSessionStorageEvaluator(); | |||
evaluator.setSessionStorageEnabled(Boolean.FALSE); | |||
StatelessWebSubjectFactory subjectFactory = new StatelessWebSubjectFactory(); | |||
securityManager.setSubjectFactory(subjectFactory); | |||
SecurityUtils.setSecurityManager(securityManager); | |||
DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO(); | |||
DefaultSessionStorageEvaluator defaultSessionStorageEvaluator = new DefaultSessionStorageEvaluator(); | |||
defaultSessionStorageEvaluator.setSessionStorageEnabled(false); | |||
subjectDAO.setSessionStorageEvaluator(defaultSessionStorageEvaluator); | |||
securityManager.setSubjectDAO(subjectDAO); | |||
//禁止Subject的getSession方法 | |||
securityManager.setSubjectFactory(subjectFactory()); | |||
return securityManager; | |||
} | |||
@@ -58,19 +73,33 @@ public class ShiroConfig { | |||
@Bean | |||
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) { | |||
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); | |||
shiroFilterFactoryBean.setSecurityManager(securityManager); | |||
Map<String, String> map = new HashMap<>(); | |||
//登出 | |||
map.put("/logout", "logout"); | |||
//对所有用户认证 | |||
map.put("/**", "authc"); | |||
shiroFilterFactoryBean.setSecurityManager(securityManager()); | |||
//登录 | |||
shiroFilterFactoryBean.setLoginUrl("/sysUser/login"); | |||
//首页 | |||
shiroFilterFactoryBean.setSuccessUrl("/index"); | |||
//错误页面,认证不通过跳转 | |||
shiroFilterFactoryBean.setUnauthorizedUrl("/error"); | |||
shiroFilterFactoryBean.setFilterChainDefinitionMap(map); | |||
/* | |||
* c. 添加jwt过滤器,并在下面注册 | |||
* 也就是将jwtFilter注册到shiro的Filter中 | |||
* 指定除了login和logout之外的请求都先经过jwtFilter | |||
* */ | |||
Map<String, Filter> filterMap = new HashMap<>(); | |||
//这个地方其实另外两个filter可以不设置,默认就是 | |||
filterMap.put("anon", new AnonymousFilter()); | |||
filterMap.put("jwt", new JwtFilter()); | |||
filterMap.put("logout", new LogoutFilter()); | |||
shiroFilterFactoryBean.setFilters(filterMap); | |||
// 拦截器 | |||
Map<String, String> filterRuleMap = new LinkedHashMap<>(); | |||
filterRuleMap.put("/sysUser/login", "anon"); | |||
filterRuleMap.put("/logout", "logout"); | |||
filterRuleMap.put("/**", "jwt"); | |||
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterRuleMap); | |||
return shiroFilterFactoryBean; | |||
} | |||
/** | |||
@@ -100,4 +129,6 @@ public class ShiroConfig { | |||
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager); | |||
return authorizationAttributeSourceAdvisor; | |||
} | |||
} |
@@ -18,6 +18,4 @@ public class StatelessWebSubjectFactory extends DefaultWebSubjectFactory { | |||
return super.createSubject(context); | |||
} | |||
public StatelessWebSubjectFactory() {} | |||
} |
@@ -0,0 +1,174 @@ | |||
package com.xdf.creative.shiro.filter; | |||
/** | |||
* @author : lgw | |||
* @date : 10:46 2020/3/4 | |||
*/ | |||
import com.alibaba.fastjson.JSON; | |||
import com.xdf.creative.enums.ApiCode; | |||
import com.xdf.creative.shiro.jwt.JwtProperties; | |||
import com.xdf.creative.shiro.jwt.JwtToken; | |||
import com.xdf.creative.util.page.ApiResult; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.apache.shiro.authz.AuthorizationException; | |||
import org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter; | |||
import org.apache.shiro.web.util.WebUtils; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.http.HttpStatus; | |||
import org.springframework.stereotype.Component; | |||
import org.springframework.web.bind.annotation.RequestMethod; | |||
import javax.servlet.Filter; | |||
import javax.servlet.ServletRequest; | |||
import javax.servlet.ServletResponse; | |||
import javax.servlet.http.HttpServletRequest; | |||
import javax.servlet.http.HttpServletResponse; | |||
import java.io.IOException; | |||
import java.io.PrintWriter; | |||
import java.util.Date; | |||
/** | |||
* JwtFilter:jwt过滤器来作为shiro的过滤器 | |||
* | |||
* @author zhangxiaoxiang | |||
* @date: 2019/07/12 | |||
*/ | |||
@Slf4j | |||
@Component//这个注入与否影响不大 | |||
public class JwtFilter extends BasicHttpAuthenticationFilter implements Filter { | |||
@Autowired | |||
private JwtProperties jwtProperties; | |||
@Override | |||
protected boolean isLoginAttempt(ServletRequest request, ServletResponse response) { | |||
HttpServletRequest req = (HttpServletRequest) request; | |||
String token = req.getHeader("Authorization"); | |||
return token != null; | |||
} | |||
/** | |||
* 返回结果为true表明登录通过 | |||
*/ | |||
@Override | |||
protected boolean executeLogin(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { | |||
log.warn("onAccessDenied 方法被调用"); | |||
//这个地方和前端约定,要求前端将jwtToken放在请求的Header部分 | |||
//所以以后发起请求的时候就需要在Header中放一个Authorization,值就是对应的Token | |||
HttpServletRequest request = (HttpServletRequest) servletRequest; | |||
String token = request.getHeader("Authorization"); | |||
if (null == token) { | |||
return false; | |||
} | |||
log.info("请求的 Header 中藏有 jwtToken {}", token); | |||
JwtToken jwtToken = new JwtToken(token); | |||
try { | |||
// 委托 realm 进行登录认证 | |||
//所以这个地方最终还是调用JwtRealm进行的认证 | |||
getSubject(servletRequest, servletResponse).login(jwtToken); | |||
//也就是subject.login(token) | |||
} catch (Exception e) { | |||
e.printStackTrace(); | |||
onLoginFail(servletResponse); | |||
return false; | |||
} | |||
return true; | |||
//执行方法中没有抛出异常就表示登录成功 | |||
} | |||
//登录失败时默认返回 401 状态码 | |||
private void onLoginFail(ServletResponse response) throws IOException { | |||
ApiResult result = new ApiResult(); | |||
result.setCode(ApiCode.TOKEN_INVALID.getCode()); | |||
result.setMsg(ApiCode.TOKEN_INVALID.getMsg()); | |||
getResponseResult(response,result); | |||
} | |||
/** | |||
* 这里我们详细说明下为什么重写 可以对比父类方法,只是将executeLogin方法调用去除了 | |||
* 如果没有去除将会循环调用doGetAuthenticationInfo方法 | |||
*/ | |||
@Override | |||
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { | |||
this.sendChallenge(request, response); | |||
return false; | |||
} | |||
/** | |||
* 执行登录认证 | |||
* | |||
* @param request | |||
* @param response | |||
* @param mappedValue | |||
* @return | |||
*/ | |||
@Override | |||
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) { | |||
if (isLoginAttempt(request, response)) { | |||
try { | |||
HttpServletRequest httpServletRequest = (HttpServletRequest) request; | |||
executeLogin(request, response); | |||
} catch (Exception e) { | |||
log.error("JwtFilter过滤验证失败!"); | |||
ApiResult result = new ApiResult(); | |||
result.setCode(ApiCode.NOT_PERMISSION.getCode()); | |||
result.setMsg("项目权限不足"); | |||
getResponseResult(response,result); | |||
//throw new AuthorizationException("项目权限不足", e); | |||
} | |||
return true; | |||
}else { | |||
ApiResult result = new ApiResult(); | |||
result.setCode(ApiCode.TOKEN_INVALID.getCode()); | |||
result.setMsg("无效Token请求"); | |||
getResponseResult(response,result); | |||
return false; | |||
} | |||
} | |||
/** | |||
* 返回结果 | |||
* @param response | |||
*/ | |||
public void getResponseResult(ServletResponse response,ApiResult result){ | |||
response.setCharacterEncoding("UTF-8"); | |||
response.setContentType("application/json;charset=utf-8"); | |||
PrintWriter printWriter = null; | |||
try { | |||
printWriter = WebUtils.toHttp(response).getWriter(); | |||
printWriter.write(JSON.toJSONString(result)); | |||
} catch (Exception e) { | |||
log.error(e.getMessage(), e); | |||
} finally { | |||
if (null != printWriter) { | |||
printWriter.close(); | |||
} | |||
} | |||
} | |||
/** | |||
* 对跨域提供支持 | |||
* | |||
* @param request | |||
* @param response | |||
* @return | |||
* @throws Exception | |||
*/ | |||
@Override | |||
protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception { | |||
HttpServletRequest httpServletRequest = (HttpServletRequest) request; | |||
HttpServletResponse httpServletResponse = (HttpServletResponse) response; | |||
httpServletResponse.setHeader("Access-control-Allow-Origin", httpServletRequest.getHeader("Origin")); | |||
httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS,PUT,DELETE"); | |||
httpServletResponse.setHeader("Access-Control-Allow-Headers", httpServletRequest.getHeader("Access-Control-Request-Headers")); | |||
// 跨域时会首先发送一个option请求,这里我们给option请求直接返回正常状态 | |||
if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) { | |||
httpServletResponse.setStatus(HttpStatus.OK.value()); | |||
return false; | |||
} | |||
return super.preHandle(request, response); | |||
} | |||
} |
@@ -5,6 +5,7 @@ import com.auth0.jwt.interfaces.DecodedJWT; | |||
import com.xdf.creative.util.IpUtil; | |||
import lombok.Data; | |||
import lombok.experimental.Accessors; | |||
import org.apache.shiro.authc.AuthenticationToken; | |||
import java.util.Date; | |||
@@ -17,75 +18,24 @@ import java.util.Date; | |||
**/ | |||
@Data | |||
@Accessors(chain = true) | |||
public class JwtToken { | |||
public class JwtToken implements AuthenticationToken { | |||
private Long userId; | |||
/** | |||
* 登陆ip | |||
*/ | |||
private String host; | |||
/** | |||
* 登陆用户名称 | |||
*/ | |||
private String username; | |||
/*** | |||
* 组织id | |||
*/ | |||
private Long organizeId; | |||
/*** | |||
* 组织类型 0 普通用户 1、园区用户 2 区文创办 3市文创办 8后台管理 | |||
*/ | |||
private Integer organizeType; | |||
/** | |||
* 辖区id | |||
*/ | |||
private String regionId; | |||
/** | |||
* 登陆盐值 | |||
*/ | |||
private String salt; | |||
/** | |||
* 登陆token | |||
*/ | |||
private static final long serialVersionUID = 1L; | |||
// 秘钥 | |||
private String token; | |||
/** | |||
* 创建时间 | |||
*/ | |||
private Date createDate; | |||
/** | |||
* 多长时间过期,默认一小时 | |||
*/ | |||
private long expireSecond; | |||
/** | |||
* 过期日期 | |||
*/ | |||
private Date expireDate; | |||
private String principal; | |||
private String credentials; | |||
public JwtToken(String token) { | |||
this.token = token; | |||
} | |||
@Override | |||
public Object getPrincipal() { | |||
return token; | |||
} | |||
public static JwtToken build(String token, Long userId, String username, Long organizeId, Integer organizeType, String salt, long expireSecond) { | |||
DecodedJWT decodedJWT = JwtUtil.getJwtInfo(token); | |||
Date createDate = decodedJWT.getIssuedAt(); | |||
Date expireDate = decodedJWT.getExpiresAt(); | |||
return new JwtToken() | |||
.setUsername(username) | |||
.setUserId(userId) | |||
.setToken(token) | |||
.setOrganizeType(organizeType) | |||
.setOrganizeId(organizeId) | |||
.setHost(IpUtil.getRequestIp()) | |||
.setSalt(salt) | |||
.setCreateDate(createDate) | |||
.setExpireSecond(expireSecond) | |||
.setExpireDate(expireDate); | |||
@Override | |||
public Object getCredentials() { | |||
return token; | |||
} | |||
} |
@@ -71,6 +71,7 @@ spring: | |||
############################ JWT start ############################# | |||
spring-boot-plus: | |||
jwt: | |||
# token请求头名称 | |||
token-name: token |