Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
W
workflow-platform
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
赵啸非
workflow-platform
Commits
676d717c
Commit
676d717c
authored
May 23, 2025
by
赵啸非
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修改部分pom
parent
bc07a4c9
Changes
14
Show whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
1042 additions
and
212 deletions
+1042
-212
workflow-manager/src/main/java/com/mortals/xhx/base/framework/interceptor/AuthTokenServiceImpl.java
.../xhx/base/framework/interceptor/AuthTokenServiceImpl.java
+276
-0
workflow-manager/src/main/java/com/mortals/xhx/base/framework/interceptor/AuthUserInterceptor.java
...s/xhx/base/framework/interceptor/AuthUserInterceptor.java
+111
-0
workflow-manager/src/main/java/com/mortals/xhx/base/login/interceptor/AuthJsonInterceptor.java
...rtals/xhx/base/login/interceptor/AuthJsonInterceptor.java
+2
-2
workflow-manager/src/main/java/com/mortals/xhx/base/login/web/LoginController.java
.../java/com/mortals/xhx/base/login/web/LoginController.java
+52
-196
workflow-manager/src/main/java/com/mortals/xhx/base/login/web/LoginForm.java
...c/main/java/com/mortals/xhx/base/login/web/LoginForm.java
+2
-2
workflow-manager/src/main/java/com/mortals/xhx/base/login/web/SecurityCodeController.java
...om/mortals/xhx/base/login/web/SecurityCodeController.java
+6
-8
workflow-manager/src/main/java/com/mortals/xhx/base/system/user/model/UserEntity.java
...va/com/mortals/xhx/base/system/user/model/UserEntity.java
+2
-1
workflow-manager/src/main/java/com/mortals/xhx/base/system/user/model/vo/UserVo.java
...ava/com/mortals/xhx/base/system/user/model/vo/UserVo.java
+44
-0
workflow-manager/src/main/java/com/mortals/xhx/base/system/user/service/UserService.java
...com/mortals/xhx/base/system/user/service/UserService.java
+2
-1
workflow-manager/src/main/java/com/mortals/xhx/base/system/user/service/impl/UserServiceImpl.java
...ls/xhx/base/system/user/service/impl/UserServiceImpl.java
+2
-1
workflow-manager/src/main/java/com/mortals/xhx/common/key/ErrorCode.java
...r/src/main/java/com/mortals/xhx/common/key/ErrorCode.java
+122
-0
workflow-manager/src/main/java/com/mortals/xhx/common/key/RedisKey.java
...er/src/main/java/com/mortals/xhx/common/key/RedisKey.java
+43
-1
workflow-manager/src/main/java/com/mortals/xhx/common/utils/ControllerScanUtil.java
...java/com/mortals/xhx/common/utils/ControllerScanUtil.java
+348
-0
workflow-manager/src/main/java/com/mortals/xhx/common/utils/MenuEncodeUtil.java
...ain/java/com/mortals/xhx/common/utils/MenuEncodeUtil.java
+30
-0
No files found.
workflow-manager/src/main/java/com/mortals/xhx/base/framework/interceptor/AuthTokenServiceImpl.java
0 → 100644
View file @
676d717c
package
com.mortals.xhx.base.framework.interceptor
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
com.mortals.framework.ap.SysConstains
;
import
com.mortals.framework.service.IAuthTokenService
;
import
com.mortals.framework.service.ICacheService
;
import
com.mortals.framework.service.IUser
;
import
com.mortals.framework.util.DateUtils
;
import
com.mortals.framework.util.StringUtils
;
import
com.mortals.xhx.base.system.resource.service.ResourceService
;
import
com.mortals.xhx.base.system.user.model.UserEntity
;
import
com.mortals.xhx.base.system.user.service.UserService
;
import
com.mortals.xhx.common.key.RedisKey
;
import
com.mortals.xhx.common.utils.MenuEncodeUtil
;
import
io.jsonwebtoken.Claims
;
import
io.jsonwebtoken.Jwts
;
import
io.jsonwebtoken.SignatureAlgorithm
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.context.annotation.Primary
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.ObjectUtils
;
import
javax.servlet.http.HttpServletRequest
;
import
java.util.Base64
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.Set
;
/**
* token验证处理
*
* @author zxfei
*/
@Primary
@Service
@Order
(
1
)
@Slf4j
public
class
AuthTokenServiceImpl
implements
IAuthTokenService
{
@Autowired
private
UserService
userService
;
// 令牌自定义标识
@Value
(
"${token.header:Authorization}"
)
private
String
header
;
// 令牌秘钥
@Value
(
"${token.secret:026db82420614469897fcc2dc1b4ce38}"
)
private
String
secret
;
// 令牌有效期(默认60分钟)
@Value
(
"${token.expireTime:60}"
)
private
int
expireTime
;
// 令牌前缀
@Value
(
"${token.prefix:}"
)
private
String
tokenPrefix
;
// redis db
@Value
(
"${spring.redis.database:}"
)
private
Integer
db
;
@Value
(
"${token.database:0}"
)
private
Integer
portalDb
;
protected
static
final
Long
SECOND
=
1000
l
;
protected
static
final
Long
SECOND_MINUTE
=
60
*
SECOND
;
protected
static
final
Long
SECOND_HOUR
=
60
*
SECOND_MINUTE
;
protected
static
final
Long
SECOND_DAY
=
24
*
SECOND_HOUR
;
protected
static
final
Long
SECOND_WEEK
=
7
*
SECOND_DAY
;
private
static
final
Long
SECOND_MINUTE_TEN
=
1
*
SECOND_MINUTE
;
@Autowired
private
ICacheService
cacheService
;
@Autowired
private
ResourceService
resourceService
;
/**
* 获取信息
*
* @return 用户信息
*/
@Override
public
IUser
getLoginUser
(
HttpServletRequest
request
)
{
// 获取请求携带的令牌
String
token
=
getToken
(
request
);
if
(
StringUtils
.
isNotEmpty
(
token
))
{
try
{
boolean
signed
=
Jwts
.
parser
().
isSigned
(
token
);
if
(!
signed
)
{
log
.
error
(
"token非法!=>{}"
,
token
);
return
null
;
}
Claims
claims
=
parseToken
(
token
);
String
uuid
=
(
String
)
claims
.
get
(
SysConstains
.
LOGIN_USER_KEY
);
String
userKey
=
getTokenKey
(
uuid
);
//cacheService.select(portalDb);
String
userStr
=
cacheService
.
get
(
userKey
);
/* RedisTemplate<String, String> redisTemplate = cacheService.selectDbRedisTemplate(portalDb);
String userStr =redisTemplate.opsForValue().get(userKey);
*/
//刷新token时间
UserEntity
userEntity
=
JSONObject
.
parseObject
(
userStr
,
UserEntity
.
class
);
if
(!
ObjectUtils
.
isEmpty
(
userEntity
))
{
verifyToken
(
userEntity
);
}
// cacheService.select(db);
if
(!
ObjectUtils
.
isEmpty
(
userEntity
))
{
UserEntity
temp
=
userService
.
getExtCache
(
userEntity
.
getLoginName
());
if
(!
ObjectUtils
.
isEmpty
(
temp
))
{
userEntity
.
setId
(
temp
.
getId
());
}
//更新resource 路径
String
menuUrlCode
=
cacheService
.
hget
(
RedisKey
.
KEY_USER_MENU_CACHE
,
userEntity
.
getId
().
toString
(),
String
.
class
);
if
(
ObjectUtils
.
isEmpty
(
menuUrlCode
))
{
Set
<
String
>
urls
=
resourceService
.
findUrlSetByUserId
(
userEntity
.
getId
());
menuUrlCode
=
MenuEncodeUtil
.
generateMenuUrlCode
(
urls
);
cacheService
.
hset
(
RedisKey
.
KEY_USER_MENU_CACHE
,
userEntity
.
getId
().
toString
(),
menuUrlCode
);
}
userEntity
.
setMenuUrl
(
menuUrlCode
);
return
userEntity
;
}
}
catch
(
Exception
e
)
{
log
.
error
(
"解析jwt token异常!,token:{}"
,
token
,
e
);
return
null
;
}
}
return
null
;
}
/**
* 设置用户信息
*/
@Override
public
void
setUser
(
IUser
user
)
{
if
(
StringUtils
.
isNotNull
(
user
)
&&
StringUtils
.
isNotEmpty
(
user
.
getToken
()))
{
refreshToken
(
user
);
}
}
/**
* 删除用户身份信息
*/
@Override
public
void
delUser
(
String
token
)
{
if
(
StringUtils
.
isNotEmpty
(
token
))
{
String
userKey
=
getTokenKey
(
token
);
cacheService
.
del
(
userKey
);
}
}
/**
* 创建令牌
*
* @param user 用户信息
* @return 令牌
*/
@Override
public
String
createToken
(
IUser
user
)
{
// String token = IdUtil.fastSimpleUUID();
// user.setToken(token);
refreshToken
(
user
);
Map
<
String
,
Object
>
claims
=
new
HashMap
<>();
claims
.
put
(
SysConstains
.
LOGIN_USER_KEY
,
user
.
getToken
());
return
createToken
(
claims
);
}
/**
* 验证令牌有效期,相差不足20分钟,自动刷新缓存
*
* @param user
* @return 令牌
*/
@Override
public
void
verifyToken
(
IUser
user
)
{
long
expireTime
=
user
.
getExpireTime
();
long
currentTime
=
System
.
currentTimeMillis
();
if
(
expireTime
-
currentTime
<=
SECOND_MINUTE_TEN
*
1000
)
{
// log.info("不足二十分钟,刷新过期时间");
refreshToken
(
user
);
}
}
/**
* 刷新令牌有效期
*
* @param user 信息
*/
public
void
refreshToken
(
IUser
user
)
{
//user.setLoginTime(System.currentTimeMillis());
user
.
setExpireTime
(
user
.
getLoginTime
()
==
null
?
System
.
currentTimeMillis
()
:
user
.
getLoginTime
()
+
expireTime
*
SECOND_MINUTE
*
1000
);
// 根据uuid将user缓存
String
userKey
=
getTokenKey
(
user
.
getToken
());
//设置有效时间 单位秒
cacheService
.
set
(
userKey
,
JSON
.
toJSONString
(
user
),
expireTime
*
SECOND_MINUTE
);
}
/**
* 从数据声明生成令牌
*
* @param claims 数据声明
* @return 令牌
*/
private
String
createToken
(
Map
<
String
,
Object
>
claims
)
{
String
token
=
Jwts
.
builder
()
.
setExpiration
(
DateUtils
.
addCurrDate
(
7
))
.
setClaims
(
claims
)
.
signWith
(
SignatureAlgorithm
.
HS256
,
Base64
.
getEncoder
()
.
encodeToString
(
secret
.
getBytes
())).
compact
();
return
token
;
}
/**
* 从令牌中获取数据声明
*
* @param token 令牌
* @return 数据声明
*/
@Override
public
Claims
parseToken
(
String
token
)
{
return
Jwts
.
parser
()
.
setSigningKey
(
Base64
.
getEncoder
().
encodeToString
(
secret
.
getBytes
()))
.
parseClaimsJws
(
token
)
.
getBody
();
}
/**
* 从令牌中获取用户
*
* @param token 令牌
* @return 用户名
*/
@Override
public
String
getUserNumFromToken
(
String
token
)
{
Claims
claims
=
parseToken
(
token
);
return
claims
.
getSubject
();
}
/**
* 获取请求token
*
* @param request
* @return token
*/
@Override
public
String
getToken
(
HttpServletRequest
request
)
{
String
token
=
request
.
getHeader
(
header
);
if
(
StringUtils
.
isNotEmpty
(
token
)
&&
token
.
startsWith
(
tokenPrefix
))
{
token
=
token
.
replace
(
tokenPrefix
,
""
);
}
return
token
;
}
private
String
getTokenKey
(
String
uuid
)
{
return
SysConstains
.
LOGIN_TOKEN_KEY
+
uuid
;
}
public
static
void
main
(
String
[]
args
)
{
// boolean signed = Jwts.parser().isSigned("123");
boolean
signed
=
Jwts
.
parser
().
isSigned
(
"eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc"
);
System
.
out
.
println
(
signed
);
}
}
workflow-manager/src/main/java/com/mortals/xhx/base/framework/interceptor/AuthUserInterceptor.java
0 → 100644
View file @
676d717c
package
com.mortals.xhx.base.framework.interceptor
;
import
com.alibaba.fastjson.JSONObject
;
import
com.mortals.framework.annotation.UnAuth
;
import
com.mortals.framework.common.Rest
;
import
com.mortals.framework.service.IAuthTokenService
;
import
com.mortals.framework.service.ICacheService
;
import
com.mortals.framework.service.IUser
;
import
com.mortals.framework.util.AESUtil
;
import
com.mortals.framework.utils.ServletUtils
;
import
com.mortals.framework.web.interceptor.BaseInterceptor
;
import
com.mortals.xhx.base.framework.config.InterceptorConfig
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.ObjectUtils
;
import
org.springframework.web.method.HandlerMethod
;
import
org.springframework.web.servlet.resource.ResourceHttpRequestHandler
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
java.lang.reflect.Method
;
import
static
com
.
mortals
.
xhx
.
common
.
key
.
ErrorCode
.*;
/**
* 用户权限验证,基于token
*
* @author: zxfei
* @date: 2022/4/24 11:04
*/
@Component
public
class
AuthUserInterceptor
extends
BaseInterceptor
{
@Autowired
private
InterceptorConfig
config
;
@Autowired
private
IAuthTokenService
authTokenService
;
@Autowired
private
ICacheService
cacheService
;
@Override
public
int
getOrder
()
{
return
Integer
.
MAX_VALUE
-
9
;
}
@Override
public
boolean
preHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
)
throws
Exception
{
JSONObject
ret
=
new
JSONObject
();
if
(
handler
instanceof
HandlerMethod
){
HandlerMethod
handlerMethod
=
(
HandlerMethod
)
handler
;
Method
method
=
handlerMethod
.
getMethod
();
UnAuth
annotation
=
method
.
getAnnotation
(
UnAuth
.
class
);
if
(
annotation
!=
null
)
{
//取消校验
return
true
;
}
}
else
if
(
handler
instanceof
ResourceHttpRequestHandler
){
return
true
;
}
try
{
String
uri
=
request
.
getServletPath
();
//校验配置的请求路径是否需要检查权限
if
(
config
.
needCheckAuth
(
uri
))
{
//需要校验权限
boolean
auth
=
this
.
checkAuth
(
request
,
uri
,
config
.
getSecurityKey
());
if
(!
auth
)
{
//校验token不正常
String
token
=
authTokenService
.
getToken
(
request
);
if
(
ObjectUtils
.
isEmpty
(
token
)){
ServletUtils
.
renderString
(
response
,
JSONObject
.
toJSONString
(
Rest
.
fail
(
ERROR_TOKEN_UNAUTHORIZED
,
ERROR_TOKEN_UNAUTHORIZED_CONTENT
)));
return
false
;
}
//不存在时候 如果是管理员也不做拦截
IUser
loginUser
=
authTokenService
.
getLoginUser
(
request
);
if
(
ObjectUtils
.
isEmpty
(
loginUser
))
{
ServletUtils
.
renderString
(
response
,
JSONObject
.
toJSONString
(
Rest
.
fail
(
ERROR_TOKEN_EXPIRED
,
ERROR_TOKEN_EXPIRED_CONTENT
)));
return
false
;
// } else if (loginUser.isAdmin() || loginUser.getUserType() == 1) {
}
else
if
(
loginUser
.
isAdmin
())
{
return
super
.
preHandle
(
request
,
response
,
handler
);
}
else
{
ServletUtils
.
renderString
(
response
,
JSONObject
.
toJSONString
(
Rest
.
fail
(
ERROR_USER_OPERATION
,
ERROR_USER_OPERATION_CONTENT
)));
return
false
;
}
}
}
}
catch
(
Exception
e
)
{
logger
.
error
(
"权限校验拦截请求处理异常-->"
+
e
.
getMessage
());
writeJsonResponse
(
response
,
HttpServletResponse
.
SC_INTERNAL_SERVER_ERROR
,
"用户权限校验异常"
);
return
false
;
}
return
super
.
preHandle
(
request
,
response
,
handler
);
}
private
boolean
checkAuth
(
HttpServletRequest
request
,
String
requestUrl
,
String
securityKey
)
throws
Exception
{
int
code
=
requestUrl
.
hashCode
()
&
(
Integer
.
MAX_VALUE
-
1
);
IUser
loginUser
=
authTokenService
.
getLoginUser
(
request
);
if
(
ObjectUtils
.
isEmpty
(
loginUser
))
return
false
;
String
menuUrl
=
loginUser
.
getMenuUrl
();
if
(
ObjectUtils
.
isEmpty
(
menuUrl
))
return
false
;
menuUrl
=
AESUtil
.
decrypt
(
menuUrl
,
securityKey
);
String
codes
=
","
+
menuUrl
+
","
;
String
codeKey
=
","
+
code
+
","
;
if
(
codes
.
indexOf
(
codeKey
)
!=
-
1
)
{
return
true
;
}
return
false
;
}
}
workflow-manager/src/main/java/com/mortals/xhx/base/login/interceptor/AuthJsonInterceptor.java
View file @
676d717c
package
com.mortals.xhx.base.login.interceptor
;
import
com.mortals.xhx.base.framework.config.InterceptorConfig
;
import
com.mortals.framework.ap.CookieService
;
import
com.mortals.framework.ap.SysConstains
;
import
com.mortals.framework.model.CookieInfo
;
...
...
@@ -9,13 +8,14 @@ import com.mortals.framework.util.AESUtil;
import
com.mortals.framework.util.HttpUtil
;
import
com.mortals.framework.util.StringUtils
;
import
com.mortals.framework.web.interceptor.BaseInterceptor
;
import
com.mortals.xhx.base.framework.config.InterceptorConfig
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.stereotype.Component
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
@Order
(
1
)
@Component
public
class
AuthJsonInterceptor
extends
BaseInterceptor
{
...
...
workflow-manager/src/main/java/com/mortals/xhx/base/login/web/LoginController.java
View file @
676d717c
package
com.mortals.xhx.base.login.web
;
import
java.util.Calendar
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.Set
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
cn.hutool.core.util.IdUtil
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
com.mortals.framework.service.IAuthTokenService
;
import
com.mortals.framework.service.ICacheService
;
import
com.mortals.framework.service.IUser
;
import
com.mortals.framework.util.DateUtils
;
import
com.mortals.framework.util.StringUtils
;
import
com.mortals.framework.web.BaseCRUDJsonBodyMappingController
;
import
com.mortals.xhx.base.system.menu.model.MenuEntity
;
import
com.mortals.xhx.base.system.menu.service.MenuService
;
import
com.mortals.xhx.base.system.resource.service.ResourceService
;
import
com.mortals.xhx.base.system.user.model.UserEntity
;
import
com.mortals.xhx.base.system.user.service.UserService
;
import
com.mortals.xhx.base.system.user.web.UserForm
;
import
com.mortals.xhx.base.system.valid.service.ValidCodeService
;
import
com.mortals.xhx.common.key.RedisKey
;
import
org.apache.commons.logging.Log
;
import
org.apache.commons.logging.LogFactory
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.InitializingBean
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
com.alibaba.fastjson.JSONObject
;
import
com.mortals.framework.ap.CookieService
;
import
com.mortals.framework.ap.GlobalSysInfo
;
import
com.mortals.framework.ap.SysConstains
;
import
com.mortals.framework.model.CookieInfo
;
import
com.mortals.framework.service.ICacheService
;
import
com.mortals.framework.service.ITokenService
;
import
com.mortals.framework.service.IUser
;
import
com.mortals.framework.util.AESUtil
;
import
com.mortals.framework.util.DataUtil
;
import
com.mortals.framework.util.HttpUtil
;
import
com.mortals.framework.util.MD5Util
;
import
com.mortals.framework.util.StringUtils
;
import
com.mortals.framework.web.BaseCRUDJsonController
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
java.util.List
;
import
java.util.Set
;
@RestController
@Slf4j
@RequestMapping
(
"login"
)
public
class
LoginController
extends
BaseCRUDJson
Controller
<
UserService
,
UserForm
,
UserEntity
,
Long
>
{
public
class
LoginController
extends
BaseCRUDJson
BodyMappingController
<
UserService
,
UserEntity
,
Long
>
implements
InitializingBean
{
@Autowired
private
UserService
userService
;
@Autowired
private
ValidCodeService
validCodeService
;
@Autowired
private
ResourceService
resourceService
;
@Autowired
private
MenuService
menuService
;
@Autowired
private
ITokenService
tokenService
;
@Autowired
private
ICacheService
cacheService
;
@Autowired
private
IAuthTokenService
authTokenService
;
@Autowired
private
UserService
userService
;
private
static
Log
logger
=
LogFactory
.
getLog
(
LoginController
.
class
);
@RequestMapping
(
"login"
)
public
String
login
(
HttpServletRequest
request
,
HttpServletResponse
response
,
LoginForm
loginForm
)
throws
Exception
{
public
String
login
(
@RequestBody
LoginForm
loginForm
)
throws
Exception
{
JSONObject
ret
=
new
JSONObject
();
JSONObject
data
=
new
JSONObject
();
String
loginName
=
loginForm
.
getLoginName
();
String
password
=
loginForm
.
getPassword
();
// String securityCode = loginForm.getSecurityCode();
...
...
@@ -71,18 +58,24 @@ public class LoginController extends BaseCRUDJsonController<UserService, UserFor
}
UserEntity
userEntity
=
null
;
try
{
loginForm
.
validate
();
/*
boolean result = validCodeService.doCheckImageValidCode(request.getSession().getId(), ip, securityCode);
if (!result) {
recordSysLog(request, userEntity, "登录验证码不正确或已过期!");
ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
ret.put(KEY_RESULT_MSG, "登录验证码不正确或已过期!");
return ret.toJSONString();
}*/
//
loginForm.validate();
//
boolean result = validCodeService.doCheckImageValidCode(request.getSession().getId(), ip, securityCode);
//
if (!result) {
//
recordSysLog(request, userEntity, "登录验证码不正确或已过期!");
//
ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
//
ret.put(KEY_RESULT_MSG, "登录验证码不正确或已过期!");
//
return ret.toJSONString();
// }
userEntity
=
userService
.
doLogin
(
loginName
,
password
,
ip
);
userEntity
.
setLastLoginAddress
(
ip
);
saveCurrUser
(
request
,
response
,
userEntity
);
//
saveCurrUser(request, response, userEntity);
recordSysLog
(
request
,
userEntity
,
"用户登录系统成功!"
);
String
tmpToken
=
userEntity
.
getId
()
+
":"
+
IdUtil
.
fastSimpleUUID
();
userEntity
.
setToken
(
tmpToken
);
userEntity
.
setExpireTime
(
DateUtils
.
addCurrDate
(
1
).
getTime
());
String
token
=
authTokenService
.
createToken
(
userEntity
);
data
.
put
(
"token"
,
token
);
// 返回拥有的菜单数据
Set
<
String
>
urls
=
resourceService
.
findUrlSetByUserId
(
userEntity
.
getId
());
List
<
MenuEntity
>
outlookBarList
=
menuService
.
findTreeMenu
(
userEntity
,
urls
);
...
...
@@ -90,13 +83,12 @@ public class LoginController extends BaseCRUDJsonController<UserService, UserFor
if
(
currUserName
==
null
||
currUserName
.
trim
().
length
()
==
0
)
{
currUserName
=
"管理员"
;
}
JSONObject
data
=
new
JSONObject
();
data
.
put
(
"currUserName"
,
currUserName
);
data
.
put
(
"barList"
,
outlookBarList
);
data
.
put
(
"id"
,
userEntity
.
getId
());
data
.
put
(
"userType"
,
userEntity
.
getUserType
());
this
.
generateBlackCookie
(
request
,
response
,
loginName
,
urls
);
ret
.
put
(
KEY_RESULT_DATA
,
data
);
ret
.
put
(
KEY_RESULT_CODE
,
VALUE_RESULT_SUCCESS
);
ret
.
put
(
KEY_RESULT_MSG
,
"用户登录系统成功!"
);
...
...
@@ -118,182 +110,46 @@ public class LoginController extends BaseCRUDJsonController<UserService, UserFor
@RequestMapping
(
"logout"
)
public
void
logout
(
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
Exception
{
recordSysLog
(
request
,
"退出登录"
);
super
.
removeCurrUser
(
request
,
response
);
this
.
deleteBlackCookie
(
request
,
response
);
super
.
removeCurrUser
(
request
);
}
@RequestMapping
(
"index"
)
public
String
index
(
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
Exception
{
public
String
index
()
throws
Exception
{
JSONObject
ret
=
new
JSONObject
();
IUser
user
=
this
.
getCurUser
();
if
(
user
==
null
)
{
return
""
;
// return JSONObject.toJSONString(Rest.fail(ERROR_TOKEN_EXPIRED, ERROR_TOKEN_EXPIRED_CONTENT))
;
}
Set
<
String
>
urls
=
resourceService
.
findUrlSetByUserId
(
user
.
getId
());
log
.
info
(
"userId:{},urls:{}"
,
user
.
getId
(),
JSON
.
toJSONString
(
urls
));
List
<
MenuEntity
>
outlookBarList
=
menuService
.
findTreeMenu
(
user
,
urls
);
String
currUserName
=
user
.
getRealName
();
if
(
currUserName
==
null
||
currUserName
.
trim
().
length
()
==
0
)
{
currUserName
=
"管理员"
;
}
JSONObject
data
=
new
JSONObject
();
String
token
=
authTokenService
.
getToken
(
request
);
data
.
put
(
"token"
,
token
);
data
.
put
(
"currUserName"
,
currUserName
);
data
.
put
(
"barList"
,
outlookBarList
);
data
.
put
(
"id"
,
user
.
getId
());
data
.
put
(
"userType"
,
user
.
getUserType
());
ret
.
put
(
KEY_RESULT_DATA
,
data
);
this
.
generateBlackCookie
(
request
,
response
,
user
.
getLoginName
(),
urls
);
//cacheService.hset(RedisKey.KEY_USER_MENU_CACHE, user.getId().toString(), MenuEncodeUtil.generateMenuUrlCode(urls));
ret
.
put
(
KEY_RESULT_CODE
,
VALUE_RESULT_SUCCESS
);
ret
.
put
(
KEY_RESULT_MSG
,
"用户登录系统成功!"
);
ret
.
put
(
"resources"
,
urls
);
return
ret
.
toJSONString
();
}
private
void
generateBlackCookie
(
HttpServletRequest
request
,
HttpServletResponse
response
,
String
loginName
,
Set
<
String
>
urls
)
{
try
{
String
cacheKey
=
RedisKey
.
KEY_MENU_CACHE
+
loginName
;
String
securityKey
=
GlobalSysInfo
.
getPropertyValue
(
SysConstains
.
PROP_COOKIE_SECURITY_KEY
);
//应为Cookie会超长,所以改为仅存储key将值放入redis
//CookieService.setCookieForAuth(request, response, securityKey, null);
StringBuilder
sb
=
new
StringBuilder
();
if
(
urls
!=
null
&&
urls
.
size
()
>
0
)
{
for
(
String
url
:
urls
)
{
int
index
=
url
.
hashCode
()
&
(
Integer
.
MAX_VALUE
-
1
);
sb
.
append
(
index
).
append
(
","
);
}
}
String
menuUrl
=
sb
.
toString
();
menuUrl
=
AESUtil
.
encrypt
(
menuUrl
,
securityKey
);
cacheService
.
set
(
cacheKey
,
menuUrl
,
604800
);
HttpUtil
.
setCookieValue
(
request
,
response
,
SysConstains
.
COOKIE_MENU
,
cacheKey
,
-
1
);
}
catch
(
Throwable
e
)
{
}
}
@RequestMapping
(
"validcode"
)
public
String
validCode
(
HttpServletRequest
request
,
HttpServletResponse
response
,
LoginForm
loginForm
)
{
JSONObject
ret
=
new
JSONObject
();
String
loginName
=
loginForm
.
getLoginName
();
String
password
=
loginForm
.
getPassword
();
if
(
StringUtils
.
isEmpty
(
loginName
)
||
StringUtils
.
isEmpty
(
password
))
{
ret
.
put
(
KEY_RESULT_CODE
,
VALUE_RESULT_FAILURE
);
ret
.
put
(
KEY_RESULT_MSG
,
"登录名或密码为空"
);
}
UserEntity
user
=
null
;
try
{
user
=
userService
.
doCheckUser
(
loginName
,
password
);
if
(
user
==
null
)
{
ret
.
put
(
KEY_RESULT_CODE
,
VALUE_RESULT_FAILURE
);
ret
.
put
(
KEY_RESULT_MSG
,
"用户名或密码不正确"
);
}
else
if
(
StringUtils
.
isEmpty
(
user
.
getMobile
()))
{
ret
.
put
(
KEY_RESULT_CODE
,
VALUE_RESULT_FAILURE
);
ret
.
put
(
KEY_RESULT_MSG
,
"用户无正确的手机号"
);
}
else
{
String
mobile
=
StringUtils
.
trim
(
user
.
getMobile
());
String
sessionId
=
request
.
getSession
().
getId
();
String
ip
=
super
.
getRequestIP
(
request
);
boolean
result
=
validCodeService
.
createSmsValidCode
(
sessionId
,
ip
,
mobile
);
if
(
result
)
{
ret
.
put
(
KEY_RESULT_CODE
,
VALUE_RESULT_SUCCESS
);
}
else
{
ret
.
put
(
KEY_RESULT_CODE
,
VALUE_RESULT_FAILURE
);
ret
.
put
(
KEY_RESULT_MSG
,
"验证码发送失败,请稍后在试!"
);
}
}
}
catch
(
Exception
e
)
{
ret
.
put
(
KEY_RESULT_CODE
,
VALUE_RESULT_FAILURE
);
ret
.
put
(
KEY_RESULT_MSG
,
"验证码发送失败:"
+
super
.
convertException
(
e
));
}
finally
{
if
(
user
==
null
)
{
user
=
new
UserEntity
();
user
.
setLoginName
(
loginName
);
}
recordSysLog
(
request
,
user
,
"用户获取短信验证码"
);
}
return
ret
.
toJSONString
();
}
protected
void
deleteBlackCookie
(
HttpServletRequest
request
,
HttpServletResponse
response
)
{
try
{
CookieService
.
deleteCookieForAuth
(
request
,
response
);
}
catch
(
Throwable
e
)
{
}
}
private
static
CookieInfo
setLoginCookie
(
HttpServletResponse
response
,
IUser
user
,
String
securityKey
,
String
cookieDomain
,
int
cookieMaxAge
)
{
try
{
//设置cookie有效串,防篡改 LTPA版本号+创建时间+过期时间+用户名+LTPA密钥
// SHA-1=LTPA版本号+创建时间+过期时间+用户名+Domino LTPA 密钥
// LTPA Cookie= Base64(LTPA版本号+创建时间+过期时间+用户名+SHA-1)
Calendar
cal
=
Calendar
.
getInstance
();
long
currTime
=
cal
.
getTime
().
getTime
()
/
1000
;
cal
.
add
(
Calendar
.
DAY_OF_YEAR
,
1
);
long
expiresTime
=
cal
.
getTime
().
getTime
()
/
1000
;
Long
userId
=
user
.
getId
();
int
userType
=
user
.
getUserType
();
String
loginName
=
user
.
getLoginName
();
String
userName
=
user
.
getRealName
();
Long
customerId
=
user
.
getCustomerId
();
Long
customerJoinId
=
user
.
getCustomerJoinId
();
String
customerNum
=
user
.
getCustomerNum
();
String
customerJson
=
""
;
Long
deptId
=
user
.
getDeptId
();
String
deptName
=
user
.
getDeptName
();
int
deptManager
=
user
.
isManager
()
?
1
:
0
;
if
(
customerId
!=
null
||
customerJoinId
!=
null
||
StringUtils
.
isNotEmpty
(
customerNum
))
{
try
{
customerJson
=
DataUtil
.
conver2Long
(
customerId
)
+
CookieService
.
COOKIE_STORE_SPLIT
+
DataUtil
.
conver2Long
(
customerJoinId
)
+
CookieService
.
COOKIE_STORE_SPLIT
+
StringUtils
.
trim
(
customerNum
)
+
CookieService
.
COOKIE_STORE_SPLIT
+
DataUtil
.
conver2Int
(
deptId
)
+
CookieService
.
COOKIE_STORE_SPLIT
+
StringUtils
.
trim
(
deptName
)
+
CookieService
.
COOKIE_STORE_SPLIT
+
deptManager
;
customerJson
=
AESUtil
.
encrypt
(
customerJson
,
securityKey
);
}
catch
(
Exception
e
)
{
logger
.
debug
(
"用户的关联信息加密异常-->"
+
e
.
getMessage
());
}
}
customerJson
=
StringUtils
.
trim
(
customerJson
);
String
cookieStroe
=
CookieService
.
COOKIE_STORE_VERSION
+
CookieService
.
COOKIE_STORE_SPLIT
+
currTime
+
CookieService
.
COOKIE_STORE_SPLIT
+
expiresTime
;
String
pinId
=
AESUtil
.
encrypt
(
userId
.
toString
()
+
CookieService
.
COOKIE_STORE_SPLIT
+
userType
,
securityKey
);
String
trackId
=
MD5Util
.
getSignAndMD5
(
cookieStroe
,
pinId
,
loginName
,
userName
,
customerJson
,
securityKey
);
HttpUtil
.
setCookieValue
(
response
,
SysConstains
.
COOKIE_PIN
,
loginName
,
cookieDomain
,
cookieMaxAge
);
HttpUtil
.
setCookieValue
(
response
,
SysConstains
.
COOKIE_PIN_ID
,
pinId
,
cookieDomain
,
cookieMaxAge
);
HttpUtil
.
setCookieValue
(
response
,
SysConstains
.
COOKIE_UNICK
,
userName
,
cookieDomain
,
cookieMaxAge
);
HttpUtil
.
setCookieValue
(
response
,
SysConstains
.
COOKIE_STORE
,
cookieStroe
,
cookieDomain
,
cookieMaxAge
);
HttpUtil
.
setCookieValue
(
response
,
SysConstains
.
COOKIE_STORE_TOKEN
,
trackId
,
cookieDomain
,
cookieMaxAge
);
if
(
StringUtils
.
isNotEmpty
(
customerJson
))
{
HttpUtil
.
setCookieValue
(
response
,
SysConstains
.
COOKIE_UNION
,
customerJson
,
cookieDomain
,
cookieMaxAge
);
}
CookieInfo
info
=
new
CookieInfo
(
trackId
,
new
Date
(
currTime
),
new
Date
(
expiresTime
),
user
);
return
info
;
}
catch
(
Throwable
e
)
{
logger
.
warn
(
"设置用户的cookie异常-->"
+
e
.
getMessage
());
return
null
;
}
}
@Override
protected
void
saveCurrUser
(
HttpServletRequest
request
,
HttpServletResponse
response
,
IUser
user
,
int
maxAge
)
{
String
securityKey
=
GlobalSysInfo
.
getPropertyValue
(
SysConstains
.
PROP_COOKIE_SECURITY_KEY
);
String
cookieDomain
=
GlobalSysInfo
.
getPropertyValue
(
SysConstains
.
PROP_COOKIE_DOMAIN
);
String
currDoman
=
request
.
getServerName
();
CookieInfo
cookie
=
setLoginCookie
(
response
,
user
,
securityKey
,
currDoman
,
maxAge
);
if
(
StringUtils
.
isNotEmpty
(
cookieDomain
)
&&
!
currDoman
.
equals
(
cookieDomain
))
{
setLoginCookie
(
response
,
user
,
securityKey
,
cookieDomain
,
maxAge
);
}
if
(
cookie
!=
null
&&
tokenService
!=
null
)
{
try
{
tokenService
.
saveToken
(
cookie
);
}
catch
(
Throwable
e
)
{
log
.
error
(
"存储cookie信息到服务器异常"
,
e
);
}
}
public
void
afterPropertiesSet
()
throws
Exception
{
log
.
info
(
"初始化加载登录。。。"
);
}
}
workflow-manager/src/main/java/com/mortals/xhx/base/login/web/LoginForm.java
View file @
676d717c
...
...
@@ -48,9 +48,9 @@ public class LoginForm extends BaseForm {
if
(
password
==
null
||
password
.
trim
().
length
()
==
0
)
{
throw
new
AppException
(
"密码不能为空!"
);
}
/*
if (securityCode == null || securityCode.trim().length() == 0) {
if
(
securityCode
==
null
||
securityCode
.
trim
().
length
()
==
0
)
{
throw
new
AppException
(
"验证码不能为空!"
);
}
*/
}
return
super
.
validate
();
}
}
workflow-manager/src/main/java/com/mortals/xhx/base/login/web/SecurityCodeController.java
View file @
676d717c
package
com.mortals.xhx.base.login.web
;
import
java.awt.image.BufferedImage
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
com.mortals.framework.util.SecurityImage
;
import
com.mortals.framework.web.BaseCRUDJsonController
;
import
com.mortals.xhx.base.login.service.GifSecurityImage
;
import
com.mortals.xhx.base.system.valid.model.ValidCodeEntity
;
import
com.mortals.xhx.base.system.valid.service.ValidCodeService
;
import
com.mortals.xhx.base.system.valid.web.ValidCodeForm
;
...
...
@@ -13,9 +11,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
com.mortals.framework.util.SecurityImage
;
import
com.mortals.framework.web.BaseCRUDJsonController
;
import
com.mortals.xhx.base.login.service.GifSecurity
Image
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
java.awt.image.Buffered
Image
;
@RestController
@RequestMapping
(
"securitycode"
)
...
...
workflow-manager/src/main/java/com/mortals/xhx/base/system/user/model/UserEntity.java
View file @
676d717c
...
...
@@ -14,6 +14,7 @@ import java.util.Objects;
import
com.mortals.framework.ap.SysConstains
;
import
com.mortals.framework.model.BaseEntityLong
;
import
com.mortals.framework.service.IUser
;
import
com.mortals.xhx.base.system.user.model.vo.UserVo
;
/**
* <p>Title: 用户信息</p>
...
...
@@ -23,7 +24,7 @@ import com.mortals.framework.service.IUser;
* @author
* @version 1.0.0
*/
public
class
UserEntity
extends
BaseEntityLong
implements
IUser
{
public
class
UserEntity
extends
UserVo
implements
IUser
{
private
static
final
long
serialVersionUID
=
1547777703377L
;
/** 登录名 */
...
...
workflow-manager/src/main/java/com/mortals/xhx/base/system/user/model/vo/UserVo.java
0 → 100644
View file @
676d717c
package
com.mortals.xhx.base.system.user.model.vo
;
import
com.mortals.framework.model.BaseEntityLong
;
import
lombok.Data
;
/**
* 用户信息业务视图对象
*
* @author zxfei
* @date 2022-07-05
*/
@Data
public
class
UserVo
extends
BaseEntityLong
{
/**
* 站点名称
*/
private
String
siteName
;
private
String
roleIds
;
/**
* 唯一标识
*/
private
String
token
;
/**
* 菜单栏
*/
private
String
menuUrl
;
/**
* 登录时间
*/
private
Long
loginTime
;
/**
* 过期时间
*/
private
Long
expireTime
;
/**
* 代办员工id
*/
private
Long
customerId
;
}
\ No newline at end of file
workflow-manager/src/main/java/com/mortals/xhx/base/system/user/service/UserService.java
View file @
676d717c
...
...
@@ -10,6 +10,7 @@ package com.mortals.xhx.base.system.user.service;
import
com.mortals.framework.exception.AppException
;
import
com.mortals.framework.model.Result
;
import
com.mortals.framework.service.ICRUDCacheService
;
import
com.mortals.framework.service.ICRUDService
;
import
com.mortals.framework.service.IUser
;
import
com.mortals.xhx.base.system.menu.model.MenuEntity
;
...
...
@@ -27,7 +28,7 @@ import java.util.Set;
* @version 1.0.0
*/
public
interface
UserService
extends
ICRUDService
<
UserEntity
,
Long
>
{
public
interface
UserService
extends
ICRUD
Cache
Service
<
UserEntity
,
Long
>
{
/**
* 用户登录
*
...
...
workflow-manager/src/main/java/com/mortals/xhx/base/system/user/service/impl/UserServiceImpl.java
View file @
676d717c
...
...
@@ -15,6 +15,7 @@ import com.mortals.framework.model.Context;
import
com.mortals.framework.model.PageInfo
;
import
com.mortals.framework.model.Result
;
import
com.mortals.framework.service.IUser
;
import
com.mortals.framework.service.impl.AbstractCRUDCacheServiceImpl
;
import
com.mortals.framework.service.impl.AbstractCRUDServiceImpl
;
import
com.mortals.framework.util.SecurityUtil
;
import
com.mortals.framework.util.StringUtils
;
...
...
@@ -41,7 +42,7 @@ import java.util.*;
* @version 1.0.0
*/
@Service
(
"userService"
)
public
class
UserServiceImpl
extends
AbstractCRUDServiceImpl
<
UserDao
,
UserEntity
,
Long
>
implements
UserService
{
public
class
UserServiceImpl
extends
AbstractCRUD
Cache
ServiceImpl
<
UserDao
,
UserEntity
,
Long
>
implements
UserService
{
@Autowired
...
...
workflow-manager/src/main/java/com/mortals/xhx/common/key/ErrorCode.java
0 → 100644
View file @
676d717c
package
com.mortals.xhx.common.key
;
/**
* 错误码
*
* @author: zxfei
* @date: 2022/5/12 14:56
*/
public
interface
ErrorCode
{
public
static
final
int
STATUS_MS_EXCEPTION
=
500
;
public
static
final
int
STATUS_VALIDATE_EXCEPTION
=
420
;
public
static
final
int
STATUS_UNCHECKED_EXCEPTION
=
605
;
public
static
final
int
STATUS_TOKEN_NULL_EXCEPTION
=
604
;
public
static
final
int
STATUS_CODE_SUCCESS
=
0
;
public
static
final
int
STATUS_CODE_WARN
=
1
;
public
static
final
int
STATUS_CODE_ERROR
=
2
;
public
static
final
int
STATUS_CODE_INFO
=
3
;
public
static
final
int
STATUS_CODE_TOKEN_EXPIRED
=
4
;
public
static
final
int
STATUS_CODE_FATAL
=
5
;
public
static
final
int
STATUS_CODE_TRADE_PWD_NOT_SET
=
6
;
public
static
final
int
STATUS_ACCOUNT_LOCKED
=
7
;
public
static
final
int
STATUS_TRADE_PWD_OVER_THREE_TIME
=
8
;
public
static
final
int
STATUS_TRADE_PWD_ERROR
=
9
;
public
static
final
int
STATUS_EMPTY_PWD_ERROR
=
10
;
public
static
final
int
STATUS_TEL_NOT_RGI_ERROR
=
11
;
public
static
final
int
STATUS_TEL_ALREADY_REGI
=
12
;
public
static
final
int
STATUS_SAFETY_RISK
=
13
;
public
static
final
int
STATUS_LOGIN_CODE
=
15
;
public
static
final
int
BOOK_FAKUAN_CODE
=
16
;
public
static
final
String
ERROR_TRADE_PWD_OVER_THREE_TIME
=
"支付密码错误,请15分钟后再试"
;
public
static
final
String
ERROR_TRADE_PWD_ERROR
=
"支付密码错误,请重试"
;
public
static
final
String
ERROR_EMPTY_PWD_ERROR
=
"请设置登录密码"
;
public
static
final
String
ERROR_TEL_NOT_RGI
=
"该号码未注册"
;
public
static
final
String
ERROR_USERNAME_OR_PASSWORD
=
"用户名或者密码错误"
;
public
static
final
String
ERROR_TRADE_PWD
=
"交易密码错误"
;
public
static
final
String
ERROR_FORBIDDEN_OPER
=
"非法操作"
;
public
static
final
String
ERROR_TRADE_PWD_NOT_SET
=
"非法操作"
;
public
static
final
String
ERROR_NOT_REAL_NAME_AUTH
=
"您未实名认证,禁止该操作"
;
public
static
final
String
ERROR_INTERNAL_SERVER_ERROR
=
"服务器内部错误"
;
public
static
final
String
ERROR_UNAUTHORIZED
=
"token不正确或已过期"
;
public
static
final
String
ERROR_TOKEN_IS_NULL
=
"token不能为空"
;
public
static
final
String
ERROR_MISS_SERVLET
=
"服务不存在"
;
public
static
final
String
ERROR_CAPTCHA_OFTEN
=
"验证码已发送"
;
public
static
final
String
ERROR_CAPTCHA_WRONG
=
"验证码错误"
;
public
static
final
String
ERROR_TEL_ALREADY_REGI
=
"该手机号已被注册"
;
public
static
final
String
ERROR_CODE_DUPLICATE_KEY
=
"重复添加信息(含部分)"
;
public
static
final
String
ERROR_NOT_EXITS
=
"对应记录不存在"
;
public
static
final
String
ERROR_STATUS_CATEGORY
=
"状态错误"
;
public
static
final
String
ERROR_FRIEND_SHIP_ALREADY
=
"已经是你好友"
;
public
static
final
String
ERROR_FRIEND_SHIP_WAIT
=
"已向改好友发出邀请,等待接受"
;
public
static
final
String
ERROR_CODE_ACCOUNT_LOCKED
=
"账号被锁定,请联系客服"
;
public
static
final
String
WARN_ARGUMENT
=
"参数错误"
;
public
static
final
String
ERROR_USERNAME_EXIST
=
"该号码已被注册"
;
public
static
final
String
ERROR_SAFETY_RISK
=
"不在常用设备上登录"
;
public
static
final
String
INFO_TEL_BIND
=
"手机号码已经被绑定"
;
public
static
final
String
INFO_TEL_FORMAT_WRONG
=
"手机号码格式不正确"
;
public
static
final
String
ERROR_NOT_FOUND
=
"404 not found"
;
public
static
final
String
DISABLED
=
"该账号已被封禁,如有疑问请联系平台"
;
public
static
final
String
DATENULL
=
"缺少参数"
;
public
static
final
String
ERRDATE
=
"无效参数"
;
public
static
final
String
ERRSTAE
=
"状态异常"
;
public
static
final
String
EXTDATE
=
"参数异常"
;
public
static
final
String
NUMEXE
=
"账号异常"
;
public
static
final
String
CAPDON
=
"资产已被冻结,如有疑问请联系平台"
;
public
static
final
String
CONOTS
=
"操作失败"
;
public
static
final
String
OK
=
"成功!"
;
public
static
final
String
TOKENX
=
"身份验证失败,请重新登录"
;
public
static
final
String
CAPNOT
=
"充值余额不足请充值"
;
public
static
final
String
SYSNOT
=
"系统繁忙,请稍后再试..."
;
public
static
final
String
NOWER
=
"没有权限"
;
public
static
final
String
PAGEDATA
=
"分页参数不能为空"
;
public
static
final
String
CARADD_MEMBERS
=
"该司机已有绑定车辆,不能绑定多个"
;
public
static
final
int
DEVICE_CODE_IS_EMPTY
=
1001
;
public
static
final
String
DEVICE_CODE_IS_EMPTY_CONTENT
=
"当前设备编码为空!"
;
public
static
final
int
DEVICE_CODE_IS_EXIST
=
1002
;
public
static
final
String
DEVICE_CODE_IS_EXIST_CONTENT
=
"当前设备编码已存在!"
;
public
static
final
int
PRODUCT_IS_EMPTY
=
1003
;
public
static
final
String
PRODUCT_IS_EMPTY_CONTENT
=
"所属产品编码不存在!"
;
public
static
final
int
DEVICE_UNACTIVE
=
1004
;
public
static
final
String
DEVICE_UNACTIVE_CONTENT
=
"当前设备未激活,请在后台配置后再激活!"
;
public
static
final
int
PLATFORM_IS_EMPTY
=
1005
;
public
static
final
String
PLATFORM_IS_EMPTY_CONTENT
=
"当前设备编码不存在!"
;
public
static
final
int
PLATFORM_UNEXIST
=
1006
;
public
static
final
String
PLATFORM_UNEXIST_CONTENT
=
"当前设备所属产品平台未配置,请在后台配置后再激活!"
;
public
static
final
int
SITEID_IS_EMPTY
=
1007
;
public
static
final
String
SITEID_IS_EMPTY_CONTENT
=
"站点ID为空!"
;
public
static
final
int
DEVICE_CONFIG_IS_EMPTY
=
1008
;
public
static
final
String
DEVICE_CONFIG_IS_EMPTY_CONTENT
=
"设备创建,请完善设备配置信息!"
;
public
static
final
int
DEVICE_NOT_EXIST
=
1009
;
public
static
final
String
DEVICE_NOT_EXIST_CONTENT
=
"当前设备不存在!"
;
public
static
final
int
TOKEN_AUTH_FAIL
=
1010
;
public
static
final
String
TOKEN_AUTH_FAIL_CONTENT
=
"token认证失败!"
;
public
static
final
int
ERROR_TOKEN_EXPIRED
=
9001
;
public
static
final
String
ERROR_TOKEN_EXPIRED_CONTENT
=
"用户登录过期,请重新登录!"
;
public
static
final
int
ERROR_TOKEN_UNAUTHORIZED
=
9002
;
public
static
final
String
ERROR_TOKEN_UNAUTHORIZED_CONTENT
=
"token不正确或已过期"
;
public
static
final
int
ERROR_USER_OPERATION
=
9009
;
public
static
final
String
ERROR_USER_OPERATION_CONTENT
=
"用户无该操作权限!"
;
}
workflow-manager/src/main/java/com/mortals/xhx/common/key/RedisKey.java
View file @
676d717c
...
...
@@ -6,8 +6,50 @@ package com.mortals.xhx.common.key;
public
class
RedisKey
{
/**
* 登录
cookies
key
* 登录 key
*/
public
static
final
String
KEY_MENU_CACHE
=
"iot:base:MenuCacheKey:"
;
/**
* 设备心跳上报
*/
public
static
final
String
KEY_DEVICE_ONLINE_CACHE
=
"device:online:"
;
/**
* 设备上线更新队列
*/
public
static
final
String
KEY_DEVICE_ONLINE_QUEUE
=
"device:queue"
;
/**
* 设备更新队列
*/
public
static
final
String
KEY_DEVICE_UPDATE_QUEUE
=
"device:update:queue"
;
/**
* 设备通知外部更新队列
*/
public
static
final
String
KEY_DEVICE_THIRDPARTY_QUEUE
=
"device:thirdparty:queue"
;
/**
* 下发消息队列
*/
public
static
final
String
KEY_DEVICE_DOWN_MSG_QUEUE
=
"device:down:msg:queue"
;
public
static
final
String
KEY_SITE_CACHE
=
"siteDict"
;
public
static
final
String
KEY_PLATFORM_CACHE
=
"platformDict"
;
public
static
final
String
KEY_PRODUCT_CACHE
=
"productDict"
;
public
static
final
String
KEY_TOKEN_API_CACHE
=
"token:api:"
;
public
static
final
String
KEY_USER_MENU_CACHE
=
"user:menu"
;
/**
* 设备资源路径缓存
*/
public
static
final
String
KEY_DEVICE_DISBUTE_PATH_CHCHE
=
"device:homeurl:chche:"
;
}
workflow-manager/src/main/java/com/mortals/xhx/common/utils/ControllerScanUtil.java
0 → 100644
View file @
676d717c
package
com.mortals.xhx.common.utils
;
import
cn.hutool.core.util.StrUtil
;
import
com.alibaba.fastjson.JSONObject
;
import
com.mortals.framework.annotation.UnAuth
;
import
com.mortals.xhx.base.system.resource.model.ResourceEntity
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.util.ObjectUtils
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
java.io.File
;
import
java.io.FileFilter
;
import
java.io.IOException
;
import
java.lang.reflect.Method
;
import
java.net.JarURLConnection
;
import
java.net.URL
;
import
java.net.URLDecoder
;
import
java.util.*
;
import
java.util.jar.JarEntry
;
import
java.util.jar.JarFile
;
import
java.util.stream.Collectors
;
@Slf4j
public
class
ControllerScanUtil
{
/**
* 查看类路径
*/
public
static
final
String
[]
ULR_VIEW
=
{
"view"
,
"info"
,
"list"
,
"get"
,
"find"
,
"export"
,
"download"
,
"index"
,
"bill"
};
public
static
final
String
[]
WHITE_URL
=
{
"login"
,
"test"
,
"file"
,
"securitycode"
};
public
static
void
main
(
String
[]
args
)
{
List
<
Class
<?>>
classList
=
getAllClassByPackageName
(
"com.mortals.xhx"
);
//System.out.println(classList); //获取到了所有的类
getAnnotationInfo
(
classList
);
}
public
static
List
<
ResourceEntity
>
getAnnotationInfo
(
List
<
Class
<?>>
clsList
)
{
List
<
ResourceEntity
>
resourceArrayList
=
new
ArrayList
<>();
if
(
clsList
!=
null
&&
clsList
.
size
()
>
0
)
{
for
(
Class
<?>
cls
:
clsList
)
{
boolean
exits
=
cls
.
isAnnotationPresent
(
RestController
.
class
);
if
(!
exits
)
{
continue
;
}
//白名单地址的 也不需要
ResourceEntity
resourceViewEntity
=
new
ResourceEntity
();
resourceViewEntity
.
initAttrValue
();
ResourceEntity
resourceEditEntity
=
new
ResourceEntity
();
resourceEditEntity
.
initAttrValue
();
resourceEditEntity
.
setSourceType
(
1
);
Method
substringMethod
=
null
;
String
result
=
""
;
try
{
String
packName
=
cls
.
getPackage
().
getName
();
if
(
StrUtil
.
contains
(
packName
,
"system"
))
{
//系统管理-xx管理-
substringMethod
=
cls
.
getMethod
(
"getModuleDesc"
);
result
=
(
String
)
substringMethod
.
invoke
(
cls
.
newInstance
());
resourceViewEntity
.
setName
(
"系统管理-"
+
result
+
"管理-查看"
);
resourceEditEntity
.
setName
(
"系统管理-"
+
result
+
"管理-维护"
);
}
else
{
substringMethod
=
cls
.
getMethod
(
"getModuleDesc"
);
result
=
(
String
)
substringMethod
.
invoke
(
cls
.
newInstance
());
resourceViewEntity
.
setName
(
result
+
"-查看"
);
resourceEditEntity
.
setName
(
result
+
"-维护"
);
}
}
catch
(
Exception
e
)
{
}
RequestMapping
requestMappingCls
=
cls
.
getAnnotation
(
RequestMapping
.
class
);
String
prefix
=
""
;
if
(
requestMappingCls
!=
null
)
{
prefix
=
"/"
+
requestMappingCls
.
value
()[
0
];
boolean
b
=
false
;
for
(
String
s
:
WHITE_URL
)
{
if
(
StrUtil
.
contains
(
requestMappingCls
.
value
()[
0
].
toLowerCase
(),
s
))
{
b
=
true
;
break
;
}
}
if
(
b
)
{
continue
;
}
}
if
(
ObjectUtils
.
isEmpty
(
result
))
{
if
(
requestMappingCls
!=
null
)
{
result
=
StrUtil
.
removeSuffix
(
StrUtil
.
removePrefix
(
requestMappingCls
.
value
()[
0
].
toUpperCase
(),
"/"
),
"/"
)
+
"接口模块"
;
}
resourceViewEntity
.
setName
(
result
+
"-查看"
);
resourceEditEntity
.
setName
(
result
+
"-维护"
);
}
Set
<
String
>
urlSet
=
new
HashSet
<>();
//获取类中的所有的方法
Method
[]
methods
=
cls
.
getDeclaredMethods
();
if
(
methods
!=
null
&&
methods
.
length
>
0
)
{
for
(
Method
method
:
methods
)
{
boolean
unAuth
=
method
.
isAnnotationPresent
(
UnAuth
.
class
);
if
(
unAuth
)
{
continue
;
}
boolean
mExits
=
method
.
isAnnotationPresent
(
RequestMapping
.
class
);
if
(
mExits
)
{
RequestMapping
requestMapping
=
method
.
getAnnotation
(
RequestMapping
.
class
);
String
url
=
prefix
+
"/"
+
requestMapping
.
value
()[
0
];
url
=
url
.
replaceAll
(
"/+"
,
"/"
);
urlSet
.
add
(
url
);
}
boolean
mExits1
=
method
.
isAnnotationPresent
(
GetMapping
.
class
);
if
(
mExits1
)
{
GetMapping
getMapping
=
method
.
getAnnotation
(
GetMapping
.
class
);
String
url
=
prefix
+
"/"
+
getMapping
.
value
()[
0
];
url
=
url
.
replaceAll
(
"/+"
,
"/"
);
urlSet
.
add
(
url
);
}
boolean
mExits2
=
method
.
isAnnotationPresent
(
PostMapping
.
class
);
if
(
mExits2
)
{
PostMapping
postMapping
=
method
.
getAnnotation
(
PostMapping
.
class
);
String
url
=
prefix
+
"/"
+
postMapping
.
value
()[
0
];
url
=
url
.
replaceAll
(
"/+"
,
"/"
);
urlSet
.
add
(
url
);
}
}
}
//获取超类中的方法
Method
[]
superMethods
=
cls
.
getSuperclass
().
getDeclaredMethods
();
if
(
superMethods
!=
null
&&
superMethods
.
length
>
0
)
{
for
(
Method
method
:
superMethods
)
{
boolean
unAuth
=
method
.
isAnnotationPresent
(
UnAuth
.
class
);
if
(
unAuth
)
{
//判断下 是否含有list 如果不包含 则返回
boolean
mExits2
=
method
.
isAnnotationPresent
(
PostMapping
.
class
);
if
(
mExits2
)
{
PostMapping
postMapping
=
method
.
getAnnotation
(
PostMapping
.
class
);
String
s
=
postMapping
.
value
()[
0
];
if
(!
"list"
.
equalsIgnoreCase
(
s
)){
continue
;
}
}
else
{
continue
;
}
}
boolean
mExits
=
method
.
isAnnotationPresent
(
RequestMapping
.
class
);
if
(
mExits
)
{
RequestMapping
requestMapping
=
method
.
getAnnotation
(
RequestMapping
.
class
);
String
url
=
prefix
+
"/"
+
requestMapping
.
value
()[
0
];
url
=
url
.
replaceAll
(
"/+"
,
"/"
);
urlSet
.
add
(
url
);
}
boolean
mExits1
=
method
.
isAnnotationPresent
(
GetMapping
.
class
);
if
(
mExits1
)
{
GetMapping
getMapping
=
method
.
getAnnotation
(
GetMapping
.
class
);
String
url
=
prefix
+
"/"
+
getMapping
.
value
()[
0
];
url
=
url
.
replaceAll
(
"/+"
,
"/"
);
urlSet
.
add
(
url
);
}
boolean
mExits2
=
method
.
isAnnotationPresent
(
PostMapping
.
class
);
if
(
mExits2
)
{
PostMapping
postMapping
=
method
.
getAnnotation
(
PostMapping
.
class
);
String
url
=
prefix
+
"/"
+
postMapping
.
value
()[
0
];
url
=
url
.
replaceAll
(
"/+"
,
"/"
);
urlSet
.
add
(
url
);
}
}
}
if
(!
ObjectUtils
.
isEmpty
(
urlSet
))
{
Set
<
String
>
UrlViewSet
=
new
HashSet
<>();
Set
<
String
>
UrlEditSet
=
new
HashSet
<>();
for
(
String
url
:
urlSet
)
{
String
str
=
StrUtil
.
subAfter
(
url
,
"/"
,
true
);
boolean
bool
=
false
;
for
(
String
checkStr
:
ULR_VIEW
)
{
boolean
contains
=
StrUtil
.
contains
(
str
.
toLowerCase
(),
checkStr
);
if
(
contains
)
{
UrlViewSet
.
add
(
url
);
bool
=
true
;
break
;
}
}
if
(!
bool
)
{
UrlEditSet
.
add
(
url
);
}
}
resourceViewEntity
.
setUrl
(
UrlViewSet
.
stream
().
collect
(
Collectors
.
joining
(
","
)));
log
.
info
(
JSONObject
.
toJSONString
(
resourceViewEntity
));
resourceArrayList
.
add
(
resourceViewEntity
);
resourceEditEntity
.
setUrl
(
UrlEditSet
.
stream
().
collect
(
Collectors
.
joining
(
","
)));
log
.
info
(
JSONObject
.
toJSONString
(
resourceEditEntity
));
resourceArrayList
.
add
(
resourceEditEntity
);
}
}
}
return
resourceArrayList
;
}
public
static
List
<
Class
<?>>
getAllClassByPackageName
(
String
packageName
)
{
// 获取当前包下以及子包下所以的类
List
<
Class
<?>>
returnClassList
=
getClasses
(
packageName
);
return
returnClassList
;
}
/**
* 从包package中获取所有的Class
*
* @param packageName
* @return
*/
private
static
List
<
Class
<?>>
getClasses
(
String
packageName
)
{
// 第一个class类的集合
List
<
Class
<?>>
classes
=
new
ArrayList
<
Class
<?>>();
// 是否循环迭代
boolean
recursive
=
true
;
// 获取包的名字 并进行替换
String
packageDirName
=
packageName
.
replace
(
'.'
,
'/'
);
// 定义一个枚举的集合 并进行循环来处理这个目录下的things
Enumeration
<
URL
>
dirs
;
try
{
dirs
=
Thread
.
currentThread
().
getContextClassLoader
().
getResources
(
packageDirName
);
// 循环迭代下去
while
(
dirs
.
hasMoreElements
())
{
// 获取下一个元素
URL
url
=
dirs
.
nextElement
();
// 得到协议的名称
String
protocol
=
url
.
getProtocol
();
//System.out.println(url.getFile());
// 如果是以文件的形式保存在服务器上
if
(
"file"
.
equals
(
protocol
))
{
// 获取包的物理路径
String
filePath
=
URLDecoder
.
decode
(
url
.
getFile
(),
"UTF-8"
);
// 以文件的方式扫描整个包下的文件 并添加到集合中
findAndAddClassesInPackageByFile
(
packageName
,
filePath
,
recursive
,
classes
);
}
else
if
(
"jar"
.
equals
(
protocol
))
{
// 如果是jar包文件
// 定义一个JarFile
JarFile
jar
;
try
{
// 获取jar
jar
=
((
JarURLConnection
)
url
.
openConnection
()).
getJarFile
();
// 从此jar包 得到一个枚举类
Enumeration
<
JarEntry
>
entries
=
jar
.
entries
();
// 同样的进行循环迭代
while
(
entries
.
hasMoreElements
())
{
// 获取jar里的一个实体 可以是目录 和一些jar包里的其他文件 如META-INF等文件
JarEntry
entry
=
entries
.
nextElement
();
String
name
=
entry
.
getName
();
// 如果是以/开头的
if
(
name
.
charAt
(
0
)
==
'/'
)
{
// 获取后面的字符串
name
=
name
.
substring
(
1
);
}
// 如果前半部分和定义的包名相同
if
(
name
.
startsWith
(
packageDirName
))
{
int
idx
=
name
.
lastIndexOf
(
'/'
);
// 如果以"/"结尾 是一个包
if
(
idx
!=
-
1
)
{
// 获取包名 把"/"替换成"."
packageName
=
name
.
substring
(
0
,
idx
).
replace
(
'/'
,
'.'
);
}
// 如果可以迭代下去 并且是一个包
if
((
idx
!=
-
1
)
||
recursive
)
{
// 如果是一个.class文件 而且不是目录
if
(
name
.
endsWith
(
".class"
)
&&
!
entry
.
isDirectory
())
{
// 去掉后面的".class" 获取真正的类名
String
className
=
name
.
substring
(
packageName
.
length
()
+
1
,
name
.
length
()
-
6
);
try
{
// 添加到classes
classes
.
add
(
Class
.
forName
(
packageName
+
'.'
+
className
));
}
catch
(
ClassNotFoundException
e
)
{
log
.
error
(
"异常"
,
e
);
}
}
}
}
}
}
catch
(
IOException
e
)
{
log
.
error
(
"异常"
,
e
);
}
}
}
}
catch
(
IOException
e
)
{
log
.
error
(
"异常"
,
e
);
}
return
classes
;
}
/**
* 以文件的形式来获取包下的所有Class
*
* @param packageName
* @param packagePath
* @param recursive
* @param classes
*/
private
static
void
findAndAddClassesInPackageByFile
(
String
packageName
,
String
packagePath
,
final
boolean
recursive
,
List
<
Class
<?>>
classes
)
{
// 获取此包的目录 建立一个File
File
dir
=
new
File
(
packagePath
);
// 如果不存在或者 也不是目录就直接返回
if
(!
dir
.
exists
()
||
!
dir
.
isDirectory
())
{
return
;
}
// 如果存在 就获取包下的所有文件 包括目录
File
[]
dirFiles
=
dir
.
listFiles
(
new
FileFilter
()
{
// 自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件)
public
boolean
accept
(
File
file
)
{
return
(
recursive
&&
file
.
isDirectory
())
||
(
file
.
getName
().
endsWith
(
".class"
));
}
});
assert
dirFiles
!=
null
;
// 循环所有文件
for
(
File
file
:
dirFiles
)
{
// 如果是目录 则继续扫描
if
(
file
.
isDirectory
())
{
findAndAddClassesInPackageByFile
(
packageName
+
"."
+
file
.
getName
(),
file
.
getAbsolutePath
(),
recursive
,
classes
);
}
else
{
// 如果是java类文件 去掉后面的.class 只留下类名
String
className
=
file
.
getName
().
substring
(
0
,
file
.
getName
().
length
()
-
6
);
try
{
// 添加到集合中去
classes
.
add
(
Class
.
forName
(
packageName
+
'.'
+
className
));
}
catch
(
ClassNotFoundException
e
)
{
e
.
printStackTrace
();
}
}
}
}
}
workflow-manager/src/main/java/com/mortals/xhx/common/utils/MenuEncodeUtil.java
0 → 100644
View file @
676d717c
package
com.mortals.xhx.common.utils
;
import
com.mortals.framework.ap.GlobalSysInfo
;
import
com.mortals.framework.ap.SysConstains
;
import
com.mortals.framework.util.AESUtil
;
import
lombok.extern.slf4j.Slf4j
;
import
java.util.Set
;
@Slf4j
public
class
MenuEncodeUtil
{
public
static
String
generateMenuUrlCode
(
Set
<
String
>
urls
)
{
try
{
String
securityKey
=
GlobalSysInfo
.
getPropertyValue
(
SysConstains
.
PROP_COOKIE_SECURITY_KEY
);
StringBuilder
sb
=
new
StringBuilder
();
if
(
urls
!=
null
&&
urls
.
size
()
>
0
)
{
for
(
String
url
:
urls
)
{
int
index
=
url
.
hashCode
()
&
(
Integer
.
MAX_VALUE
-
1
);
sb
.
append
(
index
).
append
(
","
);
}
}
String
menuUrl
=
sb
.
toString
();
return
AESUtil
.
encrypt
(
menuUrl
,
securityKey
);
}
catch
(
Throwable
e
)
{
log
.
error
(
"编码异常"
,
e
);
return
null
;
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment