完成springboot-jwt升级重构

This commit is contained in:
Xiong Neng 2018-09-15 12:47:43 +08:00
parent 7b5e72ab34
commit 1e578567b0
25 changed files with 88 additions and 733 deletions

View File

@ -1,3 +1,9 @@
# Table of Contents
* [简介](#简介)
* [测试](#测试)
* [许可证](#许可证)
## 简介 ## 简介
@ -30,12 +36,21 @@ Content-Type: application/json
``` json ``` json
{ {
"username": "admin", "username": "admin",
"password": "12345678", "password": "12345678"
"appid": "111",
"imei": "imei"
} }
``` ```
可使用postman或者curl方式本人更愿意使用curl方式
```
curl -X POST http://localhost:9095/login -H 'Content-Type: application/json' -d '
{
"username": "admin",
"password": "12345678"
}
'
```
返回值: 返回值:
``` json ``` json
@ -63,6 +78,12 @@ Content-Type: application/json
Authorization: "上面拿到的token值" Authorization: "上面拿到的token值"
``` ```
curl访问语法
```
curl -X GET http://localhost:9095/api/v1/join?imei=imei -H 'Content-Type: application/json' -H 'Authorization: 上面拿到的token值'
```
## 许可证 ## 许可证
Copyright (c) 2018 Xiong Neng Copyright (c) 2018 Xiong Neng

View File

@ -42,7 +42,7 @@
<dependency> <dependency>
<groupId>com.auth0</groupId> <groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId> <artifactId>java-jwt</artifactId>
<version>3.3.0</version> <version>3.4.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
@ -85,6 +85,7 @@
<artifactId>commons-lang3</artifactId> <artifactId>commons-lang3</artifactId>
<version>3.7</version> <version>3.7</version>
</dependency> </dependency>
</dependencies> </dependencies>
<build> <build>

View File

@ -3,14 +3,12 @@ package com.xncoding.jwt.api;
import com.xncoding.jwt.api.model.BaseResponse; import com.xncoding.jwt.api.model.BaseResponse;
import com.xncoding.jwt.api.model.LoginParam; import com.xncoding.jwt.api.model.LoginParam;
import com.xncoding.jwt.common.util.JWTUtil; import com.xncoding.jwt.common.util.JWTUtil;
import com.xncoding.jwt.dao.entity.ManagerInfo; import com.xncoding.jwt.model.ManagerInfo;
import com.xncoding.jwt.service.ManagerInfoService; import com.xncoding.jwt.service.ManagerInfoService;
import com.xncoding.jwt.shiro.ShiroKit; import com.xncoding.jwt.shiro.ShiroKit;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.UnauthorizedException; import org.apache.shiro.authz.UnauthorizedException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -32,41 +30,16 @@ public class LoginController {
_logger.info("用户请求登录获取Token"); _logger.info("用户请求登录获取Token");
String username = loginParam.getUsername(); String username = loginParam.getUsername();
String password = loginParam.getPassword(); String password = loginParam.getPassword();
String appid = loginParam.getAppid();
String imei = loginParam.getImei();
ManagerInfo user = managerInfoService.findByUsername(username); ManagerInfo user = managerInfoService.findByUsername(username);
//用户名+随机数 //随机数盐
String salt = user.getSalt(); String salt = user.getSalt();
//原密码 //原密码加密通过username + salt作为盐
String encodedPassword = ShiroKit.md5(password, username + salt); String encodedPassword = ShiroKit.md5(password, username + salt);
if (user.getPassword().equals(encodedPassword)) { if (user.getPassword().equals(encodedPassword)) {
if (StringUtils.isNotEmpty(appid) && StringUtils.isNotEmpty(imei)) {
return new BaseResponse<>(true, "Login success", JWTUtil.signSocket(username, encodedPassword, appid, imei));
}
return new BaseResponse<>(true, "Login success", JWTUtil.sign(username, encodedPassword)); return new BaseResponse<>(true, "Login success", JWTUtil.sign(username, encodedPassword));
} else { } else {
throw new UnauthorizedException(); throw new UnauthorizedException();
} }
} }
@PostMapping("/notifyLogin")
public BaseResponse<String> notifyLogin(@RequestHeader(name="Content-Type", defaultValue = "application/json") String contentType,
@RequestBody LoginParam loginParam) {
_logger.info("登录用户推送请求登录获取Token");
String username = loginParam.getUsername();
String password = loginParam.getPassword();
ManagerInfo user = managerInfoService.findByUsername(username);
if (user.getPassword().equals(password)) {
return new BaseResponse<>(true, "Login success", JWTUtil.sign(username, password));
} else {
throw new UnauthorizedException();
}
}
@GetMapping(path = "/401")
@ResponseStatus(HttpStatus.UNAUTHORIZED)
public BaseResponse unauthorized() {
return new BaseResponse<>(false, "Unauthorized", null);
}
} }

View File

@ -22,8 +22,7 @@ public class PublicController {
*/ */
@RequestMapping(value = "/join", method = RequestMethod.GET) @RequestMapping(value = "/join", method = RequestMethod.GET)
@RequiresAuthentication @RequiresAuthentication
public BaseResponse join(@RequestHeader("Authorization") String token, public BaseResponse join(@RequestParam("imei") String imei) {
@RequestParam("imei") String imei) {
_logger.info("入网查询接口 start... imei=" + imei); _logger.info("入网查询接口 start... imei=" + imei);
BaseResponse result = new BaseResponse(); BaseResponse result = new BaseResponse();
result.setSuccess(true); result.setSuccess(true);

View File

@ -16,14 +16,6 @@ public class LoginParam {
* 密码 * 密码
*/ */
private String password; private String password;
/**
* Application ID
*/
private String appid;
/**
* IMEI码
*/
private String imei;
public String getUsername() { public String getUsername() {
return username; return username;
@ -40,20 +32,4 @@ public class LoginParam {
public void setPassword(String password) { public void setPassword(String password) {
this.password = password; this.password = password;
} }
public String getAppid() {
return appid;
}
public void setAppid(String appid) {
this.appid = appid;
}
public String getImei() {
return imei;
}
public void setImei(String imei) {
this.imei = imei;
}
} }

View File

@ -1,37 +0,0 @@
package com.xncoding.jwt.common.constant;
import java.util.ArrayList;
import java.util.List;
/**
* 常量列表
*
* @author XiongNeng
* @version 1.0
* @since 2018/01/07
*/
public class ConstantsList {
// 应收款项列表
public static final List<String> INCOME_TYPE_LIST = new ArrayList<String>() {{
add("租金");
add("市场管理费");
add("物业管理费");
add("其他");
}};
// 市场列表
public static final List<String> MARKET_LIST = new ArrayList<String>() {{
add("一期市场");
add("二期市场");
add("三期市场");
}};
// 业态
public static final List<String> BUSINESS_LIST = new ArrayList<String>() {{
add("男装");
add("女装");
add("玩具");
add("餐饮");
add("家具");
}};
}

View File

@ -1,80 +0,0 @@
package com.xncoding.jwt.common.constant;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
/**
* 表常量字典
*
* @author XiongNeng
* @version 1.0
* @since 2018/01/07
*/
public class DictMap {
/**
* 后台管理用户表 - 状态(1:正常 2:禁用)
*/
public static final String KEY_USER_STATUS = "t_manager.status";
/**
* POS机表 - 机具状态(1:正常 2:故障 3:维修中(返厂) 4:已禁用(丢失) 5:已停用(回收))
*/
public static final String KEY_POS_POS_STATUS = "t_pos.pos_state";
/**
* POS机监控表 - 在线状态(1:在线 2:离线)
*/
public static final String KEY_POS_MONITOR_STATUS = "t_pos_monitor.online_state";
/**
* APP表 - 发布范围(1:全网发布 2:灰度发布)
*/
public static final String KEY_APP_PUBLISH_RANGE = "t_app.publish_range";
/**
* 内部用ClassName + FieldName为key
*/
private static final Map<String, TreeMap<Integer, String>> _imap = new HashMap<>();
static {
_imap.put(KEY_USER_STATUS, new TreeMap<Integer, String>() {{
put(1, "正常");
put(2, "禁用");
}});
_imap.put(KEY_POS_POS_STATUS, new TreeMap<Integer, String>() {{
put(1, "正常");
put(2, "故障");
put(3, "维修中(返厂)");
put(4, "已禁用(丢失)");
put(5, "已停用(回收)");
}});
_imap.put(KEY_POS_MONITOR_STATUS, new TreeMap<Integer, String>() {{
put(1, "在线");
put(2, "离线");
}});
_imap.put(KEY_APP_PUBLISH_RANGE, new TreeMap<Integer, String>() {{
put(1, "全网发布");
put(2, "灰度发布");
}});
}
/**
* 根据字典类型key获取某个字典Map
*
* @param type 常量类型
* @return 字典Map
*/
public static TreeMap<Integer, String> map(String type) {
return _imap.get(type);
}
/**
* 根据字典类型和数字获取对应的字符串
*
* @param type 字典类型
* @param key 数字
* @return 对应的字符串
*/
public static String value(String type, Integer key) {
return key != null ? map(type).get(key) : null;
}
}

View File

@ -1,41 +0,0 @@
package com.xncoding.jwt.common.util;
/**
* 常用工具类字符串数字相关
*
* @author XiongNeng
* @version 1.0
* @since 2018/1/15
*/
public class CommonUtil {
/**
* 检查某版本是否比现在版本更大些
*
* @param version 某版本
* @param nowVersion 现在使用的版本
* @return 是否版本数更大
*/
public static boolean isNewer(String version, String nowVersion) {
try {
String[] versions = version.split("\\.");
String[] nowVersions = nowVersion.split("\\.");
if (versions.length != nowVersions.length) {
return false;
}
int sum = 0;
for (String v : versions) {
sum += sum * 10 + Integer.valueOf(v);
}
int nowSum = 0;
for (String nv : nowVersions) {
nowSum += nowSum * 10 + Integer.valueOf(nv);
}
return sum > nowSum;
} catch (NumberFormatException e) {
return false;
}
}
}

View File

@ -1,296 +0,0 @@
/**
* Copyright (c) 2015-2016, Chill Zhuang 庄骞 (smallchill@163.com).
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.xncoding.jwt.common.util;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DateUtil {
private final static SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy");
private final static SimpleDateFormat sdfDay = new SimpleDateFormat("yyyy-MM-dd");
private final static SimpleDateFormat sdfDays = new SimpleDateFormat("yyyyMMdd");
private final static SimpleDateFormat sdfTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private final static SimpleDateFormat sdfmsTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
private final static SimpleDateFormat allTime = new SimpleDateFormat("yyyyMMddHHmmss");
private final static SimpleDateFormat sdfDay_ = new SimpleDateFormat("yyyy/MM/dd");
/**
* 获取YYYY格式
*
* @return
*/
public static String getYear() {
return sdfYear.format(new Date());
}
/**
* 获取YYYY格式
*
* @return
*/
public static String getYear(Date date) {
return sdfYear.format(date);
}
/**
* 获取YYYY-MM-DD格式
*
* @return
*/
public static String getDay() {
return sdfDay.format(new Date());
}
/**
* 获取YYYY-MM-DD格式
*
* @return
*/
public static String getDay(Date date) {
return sdfDay.format(date);
}
/**
* 获取YYYYMMDD格式
*
* @return
*/
public static String getDays() {
return sdfDays.format(new Date());
}
/**
* 获取YYYYMMDD格式
*
* @return
*/
public static String getDays(Date date) {
return sdfDays.format(date);
}
/**
* 获取YYYY/MM/DD格式
*
* @return
*/
public static String getDays_(Date date) {
return sdfDay_.format(date);
}
/**
* 获取YYYY-MM-DD HH:mm:ss格式
*
* @return
*/
public static String getTime() {
return sdfTime.format(new Date());
}
/**
* 获取YYYY-MM-DD HH:mm:ss.SSS格式
*
* @return
*/
public static String getMsTime() {
return sdfmsTime.format(new Date());
}
/**
* 获取YYYYMMDDHHmmss格式
*
* @return
*/
public static String getAllTime() {
return allTime.format(new Date());
}
/**
* 获取YYYY-MM-DD HH:mm:ss格式
*
* @return
*/
public static String getTime(Date date) {
return sdfTime.format(date);
}
/**
* @param s
* @param e
* @return boolean
* @throws
* @Title: compareDate
* @Description:(日期比较如果s>=e 返回true 否则返回false)
* @author luguosui
*/
public static boolean compareDate(String s, String e) {
if (parseDate(s) == null || parseDate(e) == null) {
return false;
}
return parseDate(s).getTime() >= parseDate(e).getTime();
}
/**
* 格式化日期
*
* @return
*/
public static Date parseDate(String date) {
try {
return sdfDay.parse(date);
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
/**
* 格式化日期
*
* @return
*/
public static Date parseTime(String date) {
try {
return sdfTime.parse(date);
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
/**
* 格式化日期
*
* @return
*/
public static Date parse(String date, String pattern) {
DateFormat fmt = new SimpleDateFormat(pattern);
try {
return fmt.parse(date);
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
/**
* 格式化日期
*
* @return
*/
public static String format(Date date, String pattern) {
DateFormat fmt = new SimpleDateFormat(pattern);
return fmt.format(date);
}
/**
* 把日期转换为Timestamp
*
* @param date
* @return
*/
public static Timestamp format(Date date) {
return new Timestamp(date.getTime());
}
/**
* 校验日期是否合法
*
* @return
*/
public static boolean isValidDate(String s) {
try {
sdfTime.parse(s);
return true;
} catch (Exception e) {
// 如果throw java.text.ParseException或者NullPointerException就说明格式不对
return false;
}
}
/**
* 校验日期是否合法
*
* @return
*/
public static boolean isValidDate(String s, String pattern) {
DateFormat fmt = new SimpleDateFormat(pattern);
try {
fmt.parse(s);
return true;
} catch (Exception e) {
// 如果throw java.text.ParseException或者NullPointerException就说明格式不对
return false;
}
}
/**
* 获取指定日期偏移指定时间后的时间
*
* @param date 基准日期
* @param calendarField 偏移的粒度大小小时月等使用Calendar中的常数
* @param offsite 偏移量正数为向后偏移负数为向前偏移
* @return 偏移后的日期
*/
public static Date offsiteDate(Date date, int calendarField, int offsite) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(calendarField, offsite);
return cal.getTime();
}
/**
* 返回日期零时
*
* @param date 目标日期
* @return 目标日期零时
*/
public static Date getDateStartTime(Date date) {
String str = format(date, "yyyyMMdd") + "000000";
try {
return allTime.parse(str);
} catch (ParseException e) {
return null;
}
}
/**
* 返回日期最后时间End
*
* @param date 目标日期
* @return 目标日日期最后时间
*/
public static Date getDateEndTime(Date date) {
String str = format(date, "yyyyMMdd") + "235959";
try {
return allTime.parse(str);
} catch (ParseException e) {
return null;
}
}
}

View File

@ -3,12 +3,10 @@ package com.xncoding.jwt.common.util;
import com.auth0.jwt.JWT; import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier; import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.DecodedJWT; import com.auth0.jwt.interfaces.DecodedJWT;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.io.UnsupportedEncodingException;
import java.util.Date; import java.util.Date;
public class JWTUtil { public class JWTUtil {
@ -18,6 +16,23 @@ public class JWTUtil {
// 过期时间5分钟 // 过期时间5分钟
private static final long EXPIRE_TIME = 5 * 60 * 1000; private static final long EXPIRE_TIME = 5 * 60 * 1000;
/**
* 生成签名,5min后过期
*
* @param username 用户名
* @param secret 用户的密码
* @return 加密的token
*/
public static String sign(String username, String secret) {
Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
Algorithm algorithm = Algorithm.HMAC256(secret);
// 附带username信息
return JWT.create()
.withClaim("username", username)
.withExpiresAt(date)
.sign(algorithm);
}
/** /**
* 校验token是否正确 * 校验token是否正确
* *
@ -26,17 +41,12 @@ public class JWTUtil {
* @return 是否正确 * @return 是否正确
*/ */
public static boolean verify(String token, String username, String secret) { public static boolean verify(String token, String username, String secret) {
try {
Algorithm algorithm = Algorithm.HMAC256(secret); Algorithm algorithm = Algorithm.HMAC256(secret);
JWTVerifier verifier = JWT.require(algorithm) JWTVerifier verifier = JWT.require(algorithm)
.withClaim("username", username) .withClaim("username", username)
.build(); .build();
DecodedJWT jwt = verifier.verify(token); DecodedJWT jwt = verifier.verify(token);
return true; return true;
} catch (Exception exception) {
log.error("校验token失败", exception);
return false;
}
} }
/** /**
@ -45,129 +55,8 @@ public class JWTUtil {
* @return token中包含的用户名 * @return token中包含的用户名
*/ */
public static String getUsername(String token) { public static String getUsername(String token) {
try {
DecodedJWT jwt = JWT.decode(token); DecodedJWT jwt = JWT.decode(token);
return jwt.getClaim("username").asString(); return jwt.getClaim("username").asString();
} catch (JWTDecodeException e) {
return null;
}
}
/**
* 生成签名,5min后过期
*
* @param username 用户名
* @param secret 用户的密码
* @return 加密的token
*/
public static String sign(String username, String secret) {
try {
Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
Algorithm algorithm = Algorithm.HMAC256(secret);
// 附带username信息
return JWT.create()
.withClaim("username", username)
.withExpiresAt(date)
.sign(algorithm);
} catch (UnsupportedEncodingException e) {
return null;
}
}
/*----------------------------以下是socket校验--------------------------*/
/**
* 生成Socket Token签名, 5min后过期
*
* @param username 用户名
* @param secret 用户的密码
* @param appid applicationId
* @param imei IMEI码
* @return 加密的token
*/
public static String signSocket(String username, String secret, String appid, String imei) {
try {
Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
Algorithm algorithm = Algorithm.HMAC256(secret);
// 附带username信息
return JWT.create()
.withClaim("username", username)
.withClaim("appid", appid)
.withClaim("imei", imei)
.withExpiresAt(date)
.sign(algorithm);
} catch (UnsupportedEncodingException e) {
return null;
}
}
/**
* 校验token是否正确
*
* @param token 密钥
* @param secret 用户的密码
* @return 是否正确
*/
public static boolean verifySocket(String token, String secret) {
try {
DecodedJWT jwt1 = JWT.decode(token);
String username = jwt1.getClaim("username").asString();
String appid = jwt1.getClaim("appid").asString();
String imei = jwt1.getClaim("imei").asString();
Algorithm algorithm = Algorithm.HMAC256(secret);
JWTVerifier verifier = JWT.require(algorithm)
.withClaim("username", username)
.withClaim("appid", appid)
.withClaim("imei", imei)
.build();
DecodedJWT jwt = verifier.verify(token);
return true;
} catch (Exception exception) {
log.error("校验token失败", exception);
return false;
}
}
/**
* 获得token中的信息无需secret解密也能获得
*
* @return token中包含的用户名
*/
public static String getSocketUsername(String token) {
try {
DecodedJWT jwt1 = JWT.decode(token);
return jwt1.getClaim("username").asString();
} catch (JWTDecodeException e) {
return null;
}
}
/**
* 获得token中的信息无需secret解密也能获得
*
* @return token中包含的Appid
*/
public static String getSocketAppid(String token) {
try {
DecodedJWT jwt1 = JWT.decode(token);
return jwt1.getClaim("appid").asString();
} catch (JWTDecodeException e) {
return null;
}
}
/**
* 获得token中的信息无需secret解密也能获得
*
* @return token中包含的IMEI码
*/
public static String getSocketImei(String token) {
try {
DecodedJWT jwt1 = JWT.decode(token);
return jwt1.getClaim("imei").asString();
} catch (JWTDecodeException e) {
return null;
}
} }
} }

View File

@ -1,4 +1,4 @@
package com.xncoding.jwt.common.dao.entity; package com.xncoding.jwt.dao.domain;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;

View File

@ -1,4 +1,4 @@
package com.xncoding.jwt.common.dao.entity; package com.xncoding.jwt.dao.domain;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;

View File

@ -1,4 +1,4 @@
package com.xncoding.jwt.common.dao.entity; package com.xncoding.jwt.dao.domain;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;

View File

@ -1,4 +1,4 @@
package com.xncoding.jwt.common.dao.entity; package com.xncoding.jwt.dao.domain;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;

View File

@ -1,4 +1,4 @@
package com.xncoding.jwt.common.dao.entity; package com.xncoding.jwt.dao.domain;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;

View File

@ -1,11 +1,9 @@
package com.xncoding.jwt.dao.entity; package com.xncoding.jwt.model;
import com.xncoding.jwt.common.constant.DictMap; import com.xncoding.jwt.dao.domain.Manager;
import com.xncoding.jwt.common.dao.entity.Manager;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* Description: 后台运维管理员信息 * Description: 后台运维管理员信息
@ -91,7 +89,4 @@ public class ManagerInfo extends Manager implements Serializable {
this.pnames = pnames; this.pnames = pnames;
} }
public void buildTable() {
stateStr = DictMap.value(DictMap.KEY_USER_STATUS, getState());
}
} }

View File

@ -1,7 +1,7 @@
package com.xncoding.jwt.dao.entity; package com.xncoding.jwt.model;
import com.xncoding.jwt.common.dao.entity.Permission; import com.xncoding.jwt.dao.domain.Permission;
import com.xncoding.jwt.common.dao.entity.Role; import com.xncoding.jwt.dao.domain.Role;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;

View File

@ -1,7 +1,8 @@
package com.xncoding.jwt.service; package com.xncoding.jwt.service;
import com.xncoding.jwt.dao.entity.ManagerInfo; import com.xncoding.jwt.model.ManagerInfo;
import com.xncoding.jwt.dao.entity.SysRole; import com.xncoding.jwt.model.SysRole;
import com.xncoding.jwt.shiro.ShiroKit;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
@ -18,20 +19,23 @@ public class ManagerInfoService {
/** /**
* 通过名称查找用户 * 通过名称查找用户
* 这里我直接写常量实际生产环境会通过DAO访问数据库
* *
* @param username * @param username
* @return * @return
*/ */
public ManagerInfo findByUsername(String username) { public ManagerInfo findByUsername(String username) {
ManagerInfo managerInfo = new ManagerInfo(); ManagerInfo managerInfo = new ManagerInfo();
managerInfo.setUsername(username);
managerInfo.setPids("1,2,3"); managerInfo.setPids("1,2,3");
managerInfo.setPidsList(Arrays.asList(1, 2, 3)); managerInfo.setPidsList(Arrays.asList(1, 2, 3));
managerInfo.setPnames("第1个,第2个"); managerInfo.setPnames("第1个,第2个");
managerInfo.setState(1); managerInfo.setState(1);
managerInfo.setCreatedTime(new Date()); managerInfo.setCreatedTime(new Date());
managerInfo.setName("系统管理员"); managerInfo.setName("系统管理员");
managerInfo.setPassword("4a496ba2a4172c71540fa643ddc8bb7c"); // 随机数
managerInfo.setSalt("b4752b4b73034de06afb2db30fe19061"); managerInfo.setSalt("ef748186673033723bbf4e056f4ec92e");
managerInfo.setPassword("da9c3061ae5c0973a3d48e4e721cfbad");
List<SysRole> roles = new ArrayList<>(); List<SysRole> roles = new ArrayList<>();
SysRole role = new SysRole(); SysRole role = new SysRole();
role.setId(1); role.setId(1);

View File

@ -1,9 +1,9 @@
package com.xncoding.jwt.shiro; package com.xncoding.jwt.shiro;
import com.xncoding.jwt.common.dao.entity.Permission; import com.xncoding.jwt.dao.domain.Permission;
import com.xncoding.jwt.common.util.JWTUtil; import com.xncoding.jwt.common.util.JWTUtil;
import com.xncoding.jwt.dao.entity.ManagerInfo; import com.xncoding.jwt.model.ManagerInfo;
import com.xncoding.jwt.dao.entity.SysRole; import com.xncoding.jwt.model.SysRole;
import com.xncoding.jwt.service.ManagerInfoService; import com.xncoding.jwt.service.ManagerInfoService;
import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationInfo;

View File

@ -15,11 +15,9 @@
*/ */
package com.xncoding.jwt.shiro; package com.xncoding.jwt.shiro;
import com.xncoding.jwt.dao.entity.ManagerInfo;
import org.apache.shiro.SecurityUtils; import org.apache.shiro.SecurityUtils;
import org.apache.shiro.crypto.SecureRandomNumberGenerator; import org.apache.shiro.crypto.SecureRandomNumberGenerator;
import org.apache.shiro.crypto.hash.SimpleHash; import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject; import org.apache.shiro.subject.Subject;
/** /**

View File

@ -27,20 +27,5 @@ logging:
ROOT: INFO ROOT: INFO
com: com:
xncoding: DEBUG xncoding: DEBUG
file: E:/logs/pos-api.log file: D:/logs/pos-api.log
---
#####################################################################
######################## 测试环境profile ##########################
#####################################################################
spring:
profiles: test
logging:
level:
ROOT: INFO
com:
xncoding: DEBUG
file: /var/logs/pos-api.log

View File

@ -1,15 +0,0 @@
package com.xncoding.jwt;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* 测试密码加密
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
}

View File

@ -1,5 +1,6 @@
package com.xncoding.jwt; package com.xncoding.jwt;
import com.xncoding.jwt.common.util.JWTUtil;
import com.xncoding.jwt.shiro.ShiroKit; import com.xncoding.jwt.shiro.ShiroKit;
import org.junit.Test; import org.junit.Test;
@ -12,14 +13,20 @@ import org.junit.Test;
*/ */
public class SimpleTest { public class SimpleTest {
@Test @Test
public void testMd5() { public void testJwt() {
//用户名+随机数
String username = "admin"; String username = "admin";
//随机数
String salt = ShiroKit.getRandomSalt(16); String salt = ShiroKit.getRandomSalt(16);
//原密码 //原密码
String password = "12345678"; String password = "12345678";
String encodedPassword = ShiroKit.md5(password, username + salt); String encodedPassword = ShiroKit.md5(password, username + salt);
System.out.println("这个是保存进数据库的密码:" + encodedPassword); System.out.println("这个是保存进数据库的随机数:" + salt);
System.out.println("这个是保存进数据库的盐:" + salt); System.out.println("这个是保存进数据库的加密后密码:" + encodedPassword);
// 生成token
String token = JWTUtil.sign(username, encodedPassword);
System.out.println("token=" + token);
// 验证token
JWTUtil.verify(token, username, encodedPassword);
} }
} }

View File

@ -1,24 +0,0 @@
package com.xncoding.jwt.common.util;
import org.junit.Test;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
public class CommonUtilTest {
@Test
public void isNewer() {
assertThat(CommonUtil.isNewer("1.2.1", "1.2.0"), is(true));
assertThat(CommonUtil.isNewer("1.2", "1.2.0"), is(false));
assertThat(CommonUtil.isNewer("2.1.9", "1.2.0"), is(true));
assertThat(CommonUtil.isNewer("adfa.1.3", "1.2.0"), is(false));
}
@Test
public void testTimestamp() {
// 1516072088813
// 1441594722
System.out.println(System.currentTimeMillis());
}
}