package jforgame.admin.security;
import jforgame.admin.utils.DateUtil;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.*;
/**
* @Author: Kinson
* @Date: 2019/10/26 10:54
*/
public class JwtTokenUtils implements Serializable {
private final static Logger logger = LoggerFactory.getLogger(JwtTokenUtils.class.getName());
private static final long serialVersionUID = 1L;
/**
* 用户名称
*/
private static final String USERNAME = Claims.SUBJECT;
/**
* 创建时间
*/
private static final String CREATED = "created";
/**
* 权限列表
*/
private static final String AUTHORITIES = "authorities";
/**
* 密钥
*/
private static final String SECRET = UUID.randomUUID().toString();
/**
* 有效期12小时
*/
private static final long EXPIRE_TIME = 31 * DateUtil.ONE_DAY;
/**
* 生成令牌
*
* @return 令牌
*/
public static String generateToken(Authentication authentication) {
Map<String, Object> claims = new HashMap<>();
claims.put(USERNAME, SecurityUtils.getUsername(authentication));
claims.put(CREATED, new Date());
claims.put(AUTHORITIES, authentication.getAuthorities());
return generateToken(claims);
}
/**
* 从数据声明生成令牌
*
* @param claims 数据声明
* @return 令牌
*/
private static String generateToken(Map<String, Object> claims) {
Date expirationDate = new Date(System.currentTimeMillis() + EXPIRE_TIME);
return Jwts.builder().setClaims(claims).setExpiration(expirationDate).signWith(SignatureAlgorithm.HS512, SECRET).compact();
}
/**
* 从令牌中获取用户名
*
* @param token 令牌
* @return 用户名
*/
public static String getUsernameFromToken(String token) {
String username;
try {
Claims claims = getClaimsFromToken(token);
username = claims.getSubject();
} catch (Exception e) {
username = null;
}
return username;
}
/**
* 根据请求令牌获取登录认证信息
*
* @return 用户名
*/
public static Authentication getAuthenticationFromToken(HttpServletRequest request) {
Authentication authentication = null;
// 获取请求携带的令牌
String token = JwtTokenUtils.getToken(request);
if (token != null) {
// 请求令牌不能为空
if (SecurityUtils.getAuthentication() == null) {
// 上下文中Authentication为空
Claims claims = getClaimsFromToken(token);
if (claims == null) {
return null;
}
String username = claims.getSubject();
if (username == null) {
return null;
}
if (isTokenExpired(token)) {
return null;
}
refreshToken(token);
Object authors = claims.get(AUTHORITIES);
List<GrantedAuthority> authorities = new ArrayList<>();
if (authors != null && authors instanceof List) {
for (Object object : (List) authors) {
authorities.add(new GrantedAuthorityImpl((String) ((Map) object).get("authority")));
}
}
authentication = new JwtAuthenticationToken(username, null, authorities, token);
} else {
if (validateToken(token, SecurityUtils.getUsername())) {
// 如果上下文中Authentication非空,且请求令牌合法,直接返回当前登录认证信息
authentication = SecurityUtils.getAuthentication();
refreshToken(token);
}
}
}
return authentication;
}
/**
* 从令牌中获取数据声明
*
* @param token 令牌
* @return 数据声明
*/
private static Claims getClaimsFromToken(String token) {
Claims claims;
try {
claims = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token).getBody();
} catch (Exception e) {
claims = null;
}
return claims;
}
/**
* 验证令牌
*
* @param token
* @param name
* @return
*/
public static Boolean validateToken(String token, String name) {
if (StringUtils.isEmpty(name)) {
return false;
}
String userName = getUsernameFromToken(token);
return name.equals(userName) && !isTokenExpired(token);
}
/**
* 刷新令牌
*
* @param token
* @return
*/
public static void refreshToken(String token) {
Date expirationDate = new Date(System.currentTimeMillis() + EXPIRE_TIME);
Claims claims = getClaimsFromToken(token);
if (claims != null) {
claims.setExpiration(expirationDate);
}
}
/**
* 判断令牌是否过期
*
* @param token 令牌
* @return 是否过期
*/
public static Boolean isTokenExpired(String token) {
try {
Claims claims = getClaimsFromToken(token);
Date expiration = claims.getExpiration();
return expiration.before(new Date());
} catch (Exception e) {
logger.error("", e);
return true;
}
}
/**
* 获取请求token
*
* @param request
* @return
*/
public static String getToken(HttpServletRequest request) {
String token = request.getHeader("Authorization");
String tokenHead = "Bearer ";
if (token == null) {
token = request.getHeader("token");
} else if (token.contains(tokenHead)) {
token = token.substring(tokenHead.length());
}
if ("".equals(token)) {
token = null;
}
return token;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于elementUI和springboot搭建的游戏后台管理系统(源码+数据库)。包含权限管理,玩家查询,服务器管理等 游戏后台管理平台,可供jforgame或mmorpg项目使用。前后端权限控制分离。 使用的前端技术: vue + webpack + elementUi 使用的后端技术: spring-boot全家桶 QuickStart 客户端代码经过webpack打包后,放在admin/src/main/resources/static/路径下 客户端源代码位于webapp下,如需二次开发,需安装npm环境 客户端开发步骤,命令行环境cd webapp后,执行npm install下载依赖库 客户端打包步骤,执行npm run build,把dist生成的static目录和index.html文件拷贝到服务端指定位置 服务端创建admin数据库后,导入resouce/admin.sql。 服务端启动入口为WebStartup.java
资源推荐
资源详情
资源评论
收起资源包目录
基于elementUI和springboot搭建的游戏后台管理系统(源码+数据库) 包含权限管理,玩家查询,服务器管理等 (264个子文件)
.babelrc 230B
mvnw.cmd 5KB
app.20b8b9e80dea589407151aca017a1477.css 348KB
iconfont.css 86KB
demo.css 6KB
.editorconfig 147B
fontawesome-webfont.674f50d.eot 162KB
iconfont.b1bdb89.eot 88KB
iconfont.eot 88KB
.gitignore 266B
.gitignore 249B
.gitignore 154B
.gitkeep 0B
demo_symbol.html 196KB
demo_fontclass.html 145KB
demo_unicode.html 131KB
index.html 524B
index.html 280B
01.html 139B
maven-wrapper.jar 46KB
JwtTokenUtils.java 6KB
SysUserService.java 6KB
PayOrderService.java 5KB
SysUserController.java 5KB
SysMenuService.java 4KB
GameCmdController.java 4KB
HttpClientConfig.java 4KB
ServersController.java 4KB
SecurityUtils.java 4KB
ClassScanner.java 4KB
JsonUtil.java 3KB
SysRoleController.java 3KB
SysLoginController.java 3KB
SysRoleService.java 3KB
PasswordEncoder.java 3KB
WebSecurityConfig.java 3KB
PayOrderController.java 3KB
ChannelTree.java 2KB
GameCmdService.java 2KB
SysMenu.java 2KB
StaticDbConfig.java 2KB
CmdTypes.java 2KB
SysUser.java 2KB
SysDeptService.java 2KB
PlayerCmdService.java 2KB
SysDictService.java 2KB
SysMenuVo.java 2KB
SysDict.java 2KB
SysUserVo.java 2KB
JwtAuthenticationProvider.java 2KB
HttpAdminCmd.java 2KB
SysDictController.java 2KB
SpringTaskExecutor.java 2KB
SysMenuController.java 2KB
ServerMonitorNode.java 2KB
PlayerSimpleVo.java 2KB
SwaggerConfig.java 2KB
CorsConfig.java 2KB
UserDetailsServiceImpl.java 2KB
AsyncTaskMonitor.java 2KB
JwtUserDetails.java 1KB
MonitorService.java 1KB
AsyncTaskManager.java 1KB
SysDeptController.java 1KB
ChannelService.java 1KB
SysDept.java 1KB
HttpResult.java 1KB
SysDeptVo.java 1KB
TaskInfo.java 1KB
ServerNodeInfo.java 1KB
QueryPlayerCmd.java 1KB
SysDictVo.java 1KB
SpringContext.java 1KB
JwtAuthenticationToken.java 1KB
PageResult.java 1KB
ChannelController.java 1KB
SysUserRole.java 1KB
DateUtil.java 1KB
PayOrderVo.java 1KB
ServerInfo.java 1KB
SysRole.java 1KB
PayOrder.java 1KB
JwtAuthenticationFilter.java 1KB
Channel.java 1019B
PageRequest.java 980B
MonitorController.java 932B
SysMenuDao.java 878B
SysRoleMenu.java 857B
BanPlayerLoginCmd.java 851B
BanPlayerChatCmd.java 847B
TreeNode.java 838B
PayOrderDao.java 822B
PasswordUtils.java 812B
KaptchaConfig.java 786B
ReloadConfigCmd.java 781B
RunScriptCmd.java 748B
ReqBanPlayer.java 728B
DataSourcesConfig.java 712B
ServerNodeService.java 681B
CloseServerCmd.java 619B
共 264 条
- 1
- 2
- 3
资源评论
白话机器学习
- 粉丝: 1w+
- 资源: 7671
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功