Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
X
xyqb-user2
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
head_group
xyqb-user2
Commits
c414a844
Commit
c414a844
authored
Jul 04, 2023
by
王亮
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
temp commit(union login)
parent
0ec651f1
Changes
29
Hide whitespace changes
Inline
Side-by-side
Showing
29 changed files
with
633 additions
and
15 deletions
+633
-15
update-20230630.sql
doc/sql/update-20230630.sql
+2
-2
Constants.java
src/main/java/cn/quantgroup/xyqb/Constants.java
+17
-5
MyWebMvcConfigurer.java
...va/cn/quantgroup/xyqb/config/http/MyWebMvcConfigurer.java
+11
-4
ExceptionHandlingController.java
...antgroup/xyqb/controller/ExceptionHandlingController.java
+5
-0
LoginBehavior.java
...a/cn/quantgroup/xyqb/controller/req/v2/LoginBehavior.java
+12
-0
LoginReq.java
...n/java/cn/quantgroup/xyqb/controller/req/v2/LoginReq.java
+14
-0
OauthV2Controller.java
...a/cn/quantgroup/xyqb/controller/v2/OauthV2Controller.java
+27
-0
DataStateEnum.java
...n/java/cn/quantgroup/xyqb/entity/enums/DataStateEnum.java
+21
-0
BizException.java
src/main/java/cn/quantgroup/xyqb/exception/BizException.java
+19
-0
BizExceptionEnum.java
...n/java/cn/quantgroup/xyqb/exception/BizExceptionEnum.java
+23
-0
TokenInterceptor.java
...main/java/cn/quantgroup/xyqb/filter/TokenInterceptor.java
+67
-0
LoginBean.java
src/main/java/cn/quantgroup/xyqb/model/LoginBean.java
+13
-0
LoginProperties.java
src/main/java/cn/quantgroup/xyqb/model/LoginProperties.java
+7
-0
SessionStruct.java
.../java/cn/quantgroup/xyqb/model/session/SessionStruct.java
+3
-0
BaseBehaviorParam.java
.../cn/quantgroup/xyqb/model/v2/login/BaseBehaviorParam.java
+4
-0
BaseLoginParam.java
...ava/cn/quantgroup/xyqb/model/v2/login/BaseLoginParam.java
+4
-0
GeetestBehaviorParam.java
.../quantgroup/xyqb/model/v2/login/GeetestBehaviorParam.java
+4
-0
PhonePasswordLoginParam.java
...antgroup/xyqb/model/v2/login/PhonePasswordLoginParam.java
+16
-0
BehaviorStrategy.java
.../java/cn/quantgroup/xyqb/service/v2/BehaviorStrategy.java
+10
-0
GeetestBehaviorStrategy.java
...n/quantgroup/xyqb/service/v2/GeetestBehaviorStrategy.java
+23
-0
LoginContext.java
...main/java/cn/quantgroup/xyqb/service/v2/LoginContext.java
+41
-0
LoginStrategy.java
...ain/java/cn/quantgroup/xyqb/service/v2/LoginStrategy.java
+18
-0
PhonePasswordLoginStrategy.java
...uantgroup/xyqb/service/v2/PhonePasswordLoginStrategy.java
+113
-0
QuantGroupBehaviorStrategy.java
...uantgroup/xyqb/service/v2/QuantGroupBehaviorStrategy.java
+23
-0
SMSDirectJiLoginStrategy.java
.../quantgroup/xyqb/service/v2/SMSDirectJiLoginStrategy.java
+27
-0
SMSLoginStrategy.java
.../java/cn/quantgroup/xyqb/service/v2/SMSLoginStrategy.java
+30
-0
WechatMiniLoginStrategy.java
...n/quantgroup/xyqb/service/v2/WechatMiniLoginStrategy.java
+29
-0
WechatMiniPhoneLoginStrategy.java
...ntgroup/xyqb/service/v2/WechatMiniPhoneLoginStrategy.java
+28
-0
XyqbSessionContextHolder.java
.../cn/quantgroup/xyqb/session/XyqbSessionContextHolder.java
+22
-4
No files found.
doc/sql/update-20230630.sql
View file @
c414a844
---用户表
ALTER
TABLE
`xyqb_user`
.
`user`
ADD
COLUMN
`password_type`
TINYINT
(
3
)
NULL
DEFAULT
0
COMMENT
'0:是用户中心之前的加密方式,1:是消费地图迁移的数据加密方式'
AFTER
`
bcrypt
_password`
,
ADD
COLUMN
`password_type`
TINYINT
(
3
)
NULL
DEFAULT
0
COMMENT
'0:是用户中心之前的加密方式,1:是消费地图迁移的数据加密方式'
AFTER
`
cipher
_password`
,
ADD
COLUMN
`tenant_id`
INT
NULL
COMMENT
'租户id'
AFTER
`password_type`
;
----新增用户资料表
...
...
@@ -18,7 +18,7 @@ CREATE TABLE `xyqb_user`.`user_info` (
`province_id`
INT
NULL
COMMENT
'地址省份id'
,
`city_id`
INT
NULL
COMMENT
'地址市id'
,
`address`
VARCHAR
(
255
)
NULL
COMMENT
'详细地址'
,
`tenant_id`
INT
NOT
NULL
COMMENT
'租户id'
,
`tenant_id`
INT
NOT
NULL
DEFAULT
560761
COMMENT
'租户id'
,
`created_at`
TIMESTAMP
NULL
DEFAULT
CURRENT_TIMESTAMP
COMMENT
'创建时间'
,
`updated_at`
TIMESTAMP
NULL
DEFAULT
CURRENT_TIMESTAMP
ON
UPDATE
CURRENT_TIMESTAMP
COMMENT
'更新时间'
,
PRIMARY
KEY
(
`id`
),
...
...
src/main/java/cn/quantgroup/xyqb/Constants.java
View file @
c414a844
...
...
@@ -34,6 +34,10 @@ public interface Constants {
String
X_AUTH_TOKEN
=
"x-auth-token"
;
String
X_AUTH_TENANT
=
"qg-tenant-id"
;
String
X_AUTH_FROM
=
"qg-registered-from"
;
int
VERIFICATION_LEN
=
2
;
int
SMS_CODE_LEN_4
=
4
;
int
SMS_CODE_LEN_6
=
6
;
...
...
@@ -51,7 +55,9 @@ public interface Constants {
int
AGE_MAX
=
150
;
int
USER_QUERY_INFO_BATCH_SIZE
=
3000
;
int
USER_ID_BATCH_SIZE
=
500
;
/** 垃圾,前辈竟然用这个办法来识别UUID */
/**
* 垃圾,前辈竟然用这个办法来识别UUID
*/
int
UUID_MIN_LENGTH
=
10
;
String
AUTO_SORT_TYPE
=
"auto"
;
String
CHECK_FAIL
=
"fail"
;
...
...
@@ -180,9 +186,13 @@ public interface Constants {
* 默认随机密码长度
*/
int
RANDOM_PWD_LEN
=
15
;
/** 旧的大陆身份证号长度 */
/**
* 旧的大陆身份证号长度
*/
int
ID_NO_OLD_LENGTH
=
15
;
/** 标准大陆身份证号长度 */
/**
* 标准大陆身份证号长度
*/
int
ID_NO_STANDARD_LENGTH
=
18
;
int
ID_NO_CHECK_LENGTH
=
17
;
int
ID_NO_AREA_CODE_LENGTH
=
2
;
...
...
@@ -220,7 +230,7 @@ public interface Constants {
String
QG_CAPTCHA_REGISTERDT
=
"register_dt"
;
String
QG_CAPTCHA_REGISTERREDT
=
"register_re_dt"
;
String
QG_CAPTCHA_GEETESTLOGID
=
"geetestlog_id"
;
String
QG_CAPTCHA_SETTINGTYPE
=
"settingType"
;
String
QG_CAPTCHA_SETTINGTYPE
=
"settingType"
;
/**
* 客户端类型参数名
*/
...
...
@@ -243,6 +253,8 @@ public interface Constants {
String
VERIFY_TYPE_NONE
=
"none"
;
// -- End -- 验证码常量组
/** 注销用户后再次允许注册时间间隔-天数 */
/**
* 注销用户后再次允许注册时间间隔-天数
*/
long
DELETE_USER_AGAIN_REGISTER_INTERVAL
=
90
;
}
src/main/java/cn/quantgroup/xyqb/config/http/MyWebMvcConfigurer.java
View file @
c414a844
package
cn
.
quantgroup
.
xyqb
.
config
.
http
;
import
cn.quantgroup.xyqb.filter.TokenInterceptor
;
import
cn.quantgroup.xyqb.service.session.ISessionService
;
import
org.hibernate.validator.HibernateValidator
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.format.FormatterRegistry
;
import
org.springframework.stereotype.Component
;
import
org.springframework.validation.beanvalidation.MethodValidationPostProcessor
;
import
org.springframework.web.servlet.config.annotation.InterceptorRegistry
;
import
org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
;
import
javax.validation.Validation
;
...
...
@@ -14,6 +18,9 @@ import javax.validation.ValidatorFactory;
@Component
public
class
MyWebMvcConfigurer
extends
WebMvcConfigurerAdapter
{
@Autowired
private
ISessionService
sessionService
;
@Override
public
void
addFormatters
(
FormatterRegistry
registry
)
{
registry
.
removeConvertible
(
String
.
class
,
Enum
.
class
);
...
...
@@ -37,8 +44,8 @@ public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter {
return
postProcessor
;
}
//
@Override
//
public void addInterceptors(InterceptorRegistry registry) {
// registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/innerapi/user
/**");
//
}
@Override
public
void
addInterceptors
(
InterceptorRegistry
registry
)
{
registry
.
addInterceptor
(
new
TokenInterceptor
(
sessionService
)).
addPathPatterns
(
"/v2
/**"
);
}
}
\ No newline at end of file
src/main/java/cn/quantgroup/xyqb/controller/ExceptionHandlingController.java
View file @
c414a844
...
...
@@ -201,4 +201,9 @@ public class ExceptionHandlingController implements IBaseController {
public
JsonResult
<?>
handleAccessForbiddenException
(
AccessForbiddenException
e
)
{
return
JsonResult
.
buildErrorStateResult
(
e
.
getMessage
(),
null
);
}
@ExceptionHandler
(
BizException
.
class
)
public
JsonResult
<?>
handleBizException
(
BizException
e
)
{
return
JsonResult
.
buildErrorResultWhithCode
(
e
.
getMsg
(),
e
.
getBusinessCode
());
}
}
src/main/java/cn/quantgroup/xyqb/controller/req/v2/LoginBehavior.java
0 → 100644
View file @
c414a844
package
cn
.
quantgroup
.
xyqb
.
controller
.
req
.
v2
;
import
com.alibaba.fastjson.JSONObject
;
import
lombok.Data
;
import
javax.validation.constraints.NotNull
;
@Data
public
class
LoginBehavior
{
private
Integer
type
;
private
JSONObject
data
;
}
src/main/java/cn/quantgroup/xyqb/controller/req/v2/LoginReq.java
0 → 100644
View file @
c414a844
package
cn
.
quantgroup
.
xyqb
.
controller
.
req
.
v2
;
import
com.alibaba.fastjson.JSONObject
;
import
lombok.Data
;
import
javax.validation.constraints.NotNull
;
@Data
public
class
LoginReq
{
@NotNull
(
message
=
"登录类型必填"
)
private
Integer
type
;
private
JSONObject
data
;
private
LoginBehavior
behavior
;
}
src/main/java/cn/quantgroup/xyqb/controller/v2/OauthV2Controller.java
0 → 100644
View file @
c414a844
package
cn
.
quantgroup
.
xyqb
.
controller
.
v2
;
import
cn.quantgroup.xyqb.controller.req.v2.LoginReq
;
import
cn.quantgroup.xyqb.model.JsonResult
;
import
cn.quantgroup.xyqb.model.LoginBean
;
import
cn.quantgroup.xyqb.service.v2.LoginContext
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
@RestController
@RequestMapping
(
"/v2/oauth"
)
public
class
OauthV2Controller
{
private
final
LoginContext
loginContext
;
public
OauthV2Controller
(
LoginContext
loginContext
)
{
this
.
loginContext
=
loginContext
;
}
@PostMapping
(
"/login"
)
public
JsonResult
<
LoginBean
>
login
(
@RequestBody
LoginReq
loginReq
){
return
JsonResult
.
buildSuccessResultGeneric
(
loginContext
.
login
(
loginReq
));
}
}
src/main/java/cn/quantgroup/xyqb/entity/enums/DataStateEnum.java
0 → 100644
View file @
c414a844
package
cn
.
quantgroup
.
xyqb
.
entity
.
enums
;
public
enum
DataStateEnum
{
DISABLE
(
"无效"
),
ENABLE
(
"有效"
);
private
final
String
name
;
DataStateEnum
(
String
name
)
{
this
.
name
=
name
;
}
public
String
getName
()
{
return
name
;
}
@Override
public
String
toString
()
{
return
name
;
}
}
src/main/java/cn/quantgroup/xyqb/exception/BizException.java
0 → 100644
View file @
c414a844
package
cn
.
quantgroup
.
xyqb
.
exception
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
@EqualsAndHashCode
(
callSuper
=
true
)
@Data
@AllArgsConstructor
public
class
BizException
extends
RuntimeException
{
private
String
msg
;
private
String
businessCode
;
public
BizException
(
BizExceptionEnum
bizExceptionEnum
)
{
this
.
msg
=
bizExceptionEnum
.
getMsg
();
this
.
businessCode
=
bizExceptionEnum
.
getBusinessCode
();
}
}
src/main/java/cn/quantgroup/xyqb/exception/BizExceptionEnum.java
0 → 100644
View file @
c414a844
package
cn
.
quantgroup
.
xyqb
.
exception
;
import
lombok.AllArgsConstructor
;
import
lombok.Getter
;
@AllArgsConstructor
@Getter
public
enum
BizExceptionEnum
{
// 登录相关10开通
UN_EXIT_TENANT_ID
(
"1001"
,
"租户id不存在"
),
UN_EXIT_REGISTERED_FROM
(
"1001"
,
"租户id不存在"
),
UN_AUTHORIZED
(
"1002"
,
"请先登录"
),
UN_EXIT_USER
(
"1003"
,
"用户不存在"
),
ERROR_PASSWORD
(
"1004"
,
"用户名或者密码错误"
);
private
final
String
businessCode
;
private
final
String
msg
;
}
src/main/java/cn/quantgroup/xyqb/filter/TokenInterceptor.java
0 → 100644
View file @
c414a844
package
cn
.
quantgroup
.
xyqb
.
filter
;
import
cn.quantgroup.xyqb.Constants
;
import
cn.quantgroup.xyqb.exception.BizException
;
import
cn.quantgroup.xyqb.exception.BizExceptionEnum
;
import
cn.quantgroup.xyqb.model.session.SessionStruct
;
import
cn.quantgroup.xyqb.service.session.ISessionService
;
import
cn.quantgroup.xyqb.session.XyqbSessionContextHolder
;
import
cn.quantgroup.xyqb.util.StringUtils
;
import
org.springframework.web.servlet.HandlerInterceptor
;
import
org.springframework.web.servlet.ModelAndView
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
java.util.HashSet
;
public
class
TokenInterceptor
implements
HandlerInterceptor
{
private
final
HashSet
<
String
>
excludes
=
new
HashSet
<>();
private
final
ISessionService
sessionService
;
public
TokenInterceptor
(
ISessionService
sessionService
)
{
this
.
sessionService
=
sessionService
;
excludes
.
add
(
"/v2/oauth/login"
);
}
@Override
public
boolean
preHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
)
throws
Exception
{
//所有开放出去的外部接口,都不需要验证租户id和注册来源
String
tenantId
=
request
.
getHeader
(
Constants
.
X_AUTH_TENANT
);
String
registered_from
=
request
.
getHeader
(
Constants
.
X_AUTH_FROM
);
if
(
StringUtils
.
isEmpty
(
tenantId
))
{
throw
new
BizException
(
BizExceptionEnum
.
UN_EXIT_TENANT_ID
);
}
if
(
StringUtils
.
isEmpty
(
registered_from
))
{
throw
new
BizException
(
BizExceptionEnum
.
UN_EXIT_REGISTERED_FROM
);
}
//如果不再排查excludes的接口,需要进一步校验token(说明这些接口需要登录)
SessionStruct
sessionStruct
=
XyqbSessionContextHolder
.
getXSessionFromRedis
();
if
(!
excludes
.
contains
(
request
.
getRequestURI
()))
{
if
(
sessionStruct
==
null
)
{
throw
new
BizException
(
BizExceptionEnum
.
UN_AUTHORIZED
);
}
else
{
//session续期
sessionService
.
persistSession
(
sessionStruct
.
getSid
(),
sessionStruct
.
getValues
(),
sessionStruct
.
getTenantId
());
}
}
else
{
//如果是排除的接口,同时sessionStruct为空,这时候初始化租户和来源字段
if
(
sessionStruct
==
null
)
{
XyqbSessionContextHolder
.
initXSession
();
}
}
return
true
;
}
@Override
public
void
postHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
,
ModelAndView
modelAndView
)
throws
Exception
{
}
@Override
public
void
afterCompletion
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
,
Exception
ex
)
throws
Exception
{
XyqbSessionContextHolder
.
releaseSession
();
}
}
src/main/java/cn/quantgroup/xyqb/model/LoginBean.java
0 → 100644
View file @
c414a844
package
cn
.
quantgroup
.
xyqb
.
model
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
@EqualsAndHashCode
(
callSuper
=
true
)
@Data
public
class
LoginBean
extends
AuthBean
{
private
Long
userId
;
private
String
openId
;
private
String
unionId
;
private
UserInfo
info
;
}
src/main/java/cn/quantgroup/xyqb/model/LoginProperties.java
View file @
c414a844
...
...
@@ -37,4 +37,11 @@ public class LoginProperties {
private
String
merchantName
=
""
;
//租户ID
private
Integer
tenantId
;
public
LoginProperties
(
int
action
,
Long
createdFrom
,
Integer
tenantId
)
{
this
.
action
=
action
;
this
.
createdFrom
=
createdFrom
;
this
.
tenantId
=
tenantId
;
}
}
src/main/java/cn/quantgroup/xyqb/model/session/SessionStruct.java
View file @
c414a844
...
...
@@ -18,6 +18,9 @@ public class SessionStruct implements Serializable {
private
SessionValue
values
;
private
long
expire
;
private
Integer
tenantId
;
private
Integer
registeredFrom
;
private
String
ip
;
public
void
setAttribute
(
String
key
,
String
value
)
{
if
(
value
==
null
)
{
...
...
src/main/java/cn/quantgroup/xyqb/model/v2/login/BaseBehaviorParam.java
0 → 100644
View file @
c414a844
package
cn
.
quantgroup
.
xyqb
.
model
.
v2
.
login
;
public
class
BaseBehaviorParam
{
}
src/main/java/cn/quantgroup/xyqb/model/v2/login/BaseLoginParam.java
0 → 100644
View file @
c414a844
package
cn
.
quantgroup
.
xyqb
.
model
.
v2
.
login
;
public
class
BaseLoginParam
{
}
src/main/java/cn/quantgroup/xyqb/model/v2/login/GeetestBehaviorParam.java
0 → 100644
View file @
c414a844
package
cn
.
quantgroup
.
xyqb
.
model
.
v2
.
login
;
public
class
GeetestBehaviorParam
extends
BaseBehaviorParam
{
}
src/main/java/cn/quantgroup/xyqb/model/v2/login/PhonePasswordLoginParam.java
0 → 100644
View file @
c414a844
package
cn
.
quantgroup
.
xyqb
.
model
.
v2
.
login
;
import
lombok.Data
;
import
javax.validation.constraints.NotNull
;
import
javax.validation.constraints.Size
;
@Data
public
class
PhonePasswordLoginParam
extends
BaseLoginParam
{
@Size
(
min
=
11
,
max
=
15
,
message
=
"手机号码格式不正确"
)
private
String
phone
;
@Size
(
min
=
5
,
max
=
64
,
message
=
"密码格式不正确"
)
private
String
password
;
@NotNull
(
message
=
"密码类型不能为空,默认为0"
)
private
String
passwordType
;
}
src/main/java/cn/quantgroup/xyqb/service/v2/BehaviorStrategy.java
0 → 100644
View file @
c414a844
package
cn
.
quantgroup
.
xyqb
.
service
.
v2
;
import
cn.quantgroup.xyqb.controller.req.v2.LoginBehavior
;
public
interface
BehaviorStrategy
{
Integer
getType
();
boolean
validate
(
LoginBehavior
loginBehavior
);
void
checkParam
(
LoginBehavior
loginBehavior
);
}
src/main/java/cn/quantgroup/xyqb/service/v2/GeetestBehaviorStrategy.java
0 → 100644
View file @
c414a844
package
cn
.
quantgroup
.
xyqb
.
service
.
v2
;
import
cn.quantgroup.xyqb.controller.req.v2.LoginBehavior
;
/**
* 极验模式
*/
public
class
GeetestBehaviorStrategy
implements
BehaviorStrategy
{
@Override
public
Integer
getType
()
{
return
0
;
}
@Override
public
boolean
validate
(
LoginBehavior
loginBehavior
)
{
return
false
;
}
@Override
public
void
checkParam
(
LoginBehavior
loginBehavior
)
{
}
}
src/main/java/cn/quantgroup/xyqb/service/v2/LoginContext.java
0 → 100644
View file @
c414a844
package
cn
.
quantgroup
.
xyqb
.
service
.
v2
;
import
cn.quantgroup.xyqb.controller.req.v2.LoginReq
;
import
cn.quantgroup.xyqb.model.LoginBean
;
import
cn.quantgroup.xyqb.model.v2.login.BaseLoginParam
;
import
org.springframework.stereotype.Service
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
@Service
public
class
LoginContext
{
private
final
Map
<
Integer
,
LoginStrategy
>
loginStrategyMap
=
new
HashMap
<>();
private
final
Map
<
Integer
,
BehaviorStrategy
>
behaviorStrategyMap
=
new
HashMap
<>();
public
LoginContext
(
List
<
LoginStrategy
>
loginStrategies
,
List
<
BehaviorStrategy
>
behaviorStrategies
)
{
loginStrategies
.
forEach
(
i
->
loginStrategyMap
.
put
(
i
.
getType
(),
i
));
behaviorStrategies
.
forEach
(
i
->
behaviorStrategyMap
.
put
(
i
.
getType
(),
i
));
}
public
LoginBean
login
(
LoginReq
loginReq
)
{
//第一步、校验参数
LoginStrategy
loginStrategy
=
loginStrategyMap
.
get
(
loginReq
.
getType
());
BaseLoginParam
loginParam
=
loginStrategy
.
checkParam
(
loginReq
);
//第二步、进行行为验证
if
(
loginReq
.
getBehavior
()!=
null
){
BehaviorStrategy
behaviorStrategy
=
behaviorStrategyMap
.
get
(
loginReq
.
getBehavior
().
getType
());
behaviorStrategy
.
checkParam
(
loginReq
.
getBehavior
());
}
//第三步、执行登录操作
LoginBean
loginBean
=
loginStrategy
.
login
(
loginParam
);
return
loginStrategy
.
login
(
loginParam
);
}
}
src/main/java/cn/quantgroup/xyqb/service/v2/LoginStrategy.java
0 → 100644
View file @
c414a844
package
cn
.
quantgroup
.
xyqb
.
service
.
v2
;
import
cn.quantgroup.xyqb.controller.req.v2.LoginReq
;
import
cn.quantgroup.xyqb.model.LoginBean
;
import
cn.quantgroup.xyqb.model.v2.login.BaseLoginParam
;
import
javax.validation.Validation
;
import
javax.validation.Validator
;
public
interface
LoginStrategy
{
Validator
validator
=
Validation
.
buildDefaultValidatorFactory
().
getValidator
();
Integer
getType
();
LoginBean
login
(
BaseLoginParam
param
);
BaseLoginParam
checkParam
(
LoginReq
loginReq
);
}
src/main/java/cn/quantgroup/xyqb/service/v2/PhonePasswordLoginStrategy.java
0 → 100644
View file @
c414a844
package
cn
.
quantgroup
.
xyqb
.
service
.
v2
;
import
cn.quantgroup.xyqb.constant.enums.LoginType
;
import
cn.quantgroup.xyqb.controller.req.v2.LoginReq
;
import
cn.quantgroup.xyqb.entity.User
;
import
cn.quantgroup.xyqb.exception.BizException
;
import
cn.quantgroup.xyqb.exception.BizExceptionEnum
;
import
cn.quantgroup.xyqb.model.AuthBean
;
import
cn.quantgroup.xyqb.model.LoginBean
;
import
cn.quantgroup.xyqb.model.LoginProperties
;
import
cn.quantgroup.xyqb.model.session.SessionStruct
;
import
cn.quantgroup.xyqb.model.v2.login.BaseLoginParam
;
import
cn.quantgroup.xyqb.model.v2.login.PhonePasswordLoginParam
;
import
cn.quantgroup.xyqb.repository.IGeetestLogRepository
;
import
cn.quantgroup.xyqb.repository.IUserRepository
;
import
cn.quantgroup.xyqb.service.captcha.IGeetestLogService
;
import
cn.quantgroup.xyqb.service.session.ISessionService
;
import
cn.quantgroup.xyqb.service.user.ILockIpv4Service
;
import
cn.quantgroup.xyqb.session.XyqbSessionContextHolder
;
import
cn.quantgroup.xyqb.util.BctyptPasswordUtil
;
import
cn.quantgroup.xyqb.util.PasswordUtil
;
import
org.apache.commons.lang.StringUtils
;
import
org.springframework.stereotype.Service
;
/**
* 账号密码登录
*/
@Service
public
class
PhonePasswordLoginStrategy
implements
LoginStrategy
{
private
final
IUserRepository
userRepository
;
private
final
ILockIpv4Service
lockIpv4Service
;
private
final
ISessionService
sessionService
;
private
final
IGeetestLogService
geetestLogService
;
public
PhonePasswordLoginStrategy
(
IUserRepository
userRepository
,
ILockIpv4Service
lockIpv4Service
,
ISessionService
sessionService
,
IGeetestLogService
geetestLogService
)
{
this
.
userRepository
=
userRepository
;
this
.
lockIpv4Service
=
lockIpv4Service
;
this
.
sessionService
=
sessionService
;
this
.
geetestLogService
=
geetestLogService
;
}
@Override
public
Integer
getType
()
{
return
3101
;
}
@Override
public
LoginBean
login
(
BaseLoginParam
param
)
{
PhonePasswordLoginParam
phonePasswordLoginParam
=
(
PhonePasswordLoginParam
)
param
;
SessionStruct
sessionStruct
=
XyqbSessionContextHolder
.
getXSession
();
//1、查询库中是否存在用户
User
user
=
userRepository
.
findByPhoneNoAndTenantId
(
phonePasswordLoginParam
.
getPhone
(),
sessionStruct
.
getTenantId
());
if
(
user
==
null
)
{
// 向该ipv4添加错误计数器
lockIpv4Service
.
countErrorByIpv4
(
sessionStruct
.
getIp
());
// 向该phoneNo添加错误计数器
lockIpv4Service
.
countErrorByPhoneNo
(
phonePasswordLoginParam
.
getPhone
());
throw
new
BizException
(
BizExceptionEnum
.
UN_EXIT_USER
);
}
// 优先校验新密码加密方式 如果有并且密码校验不通过
if
(
StringUtils
.
isNotBlank
(
user
.
getCipherPassword
()))
{
if
(!
BctyptPasswordUtil
.
BCryptCheckPw
(
phonePasswordLoginParam
.
getPassword
(),
user
.
getCipherPassword
()))
{
// 向该ipv4添加错误计数器
lockIpv4Service
.
countErrorByIpv4
(
sessionStruct
.
getIp
());
// 向该phoneNo添加错误计数器
lockIpv4Service
.
countErrorByPhoneNo
(
phonePasswordLoginParam
.
getPhone
());
throw
new
BizException
(
BizExceptionEnum
.
ERROR_PASSWORD
);
}
}
else
{
//验证密码
if
(!
PasswordUtil
.
validatePassword
(
phonePasswordLoginParam
.
getPassword
(),
user
.
getPassword
()))
{
// 向该ipv4添加错误计数器
lockIpv4Service
.
countErrorByIpv4
(
sessionStruct
.
getIp
());
// 向该phoneNo添加错误计数器
lockIpv4Service
.
countErrorByPhoneNo
(
phonePasswordLoginParam
.
getPhone
());
throw
new
BizException
(
BizExceptionEnum
.
ERROR_PASSWORD
);
}
// 校验老密码正确更新新加密方式
user
.
setCipherPassword
(
BctyptPasswordUtil
.
BCryptWithSalt
(
phonePasswordLoginParam
.
getPassword
()));
userRepository
.
save
(
user
);
}
// 向该ipv4添加成功计数器
lockIpv4Service
.
countSuccessByIpv4
(
sessionStruct
.
getIp
());
//尝试解锁
lockIpv4Service
.
unLockPhone
(
phonePasswordLoginParam
.
getPhone
());
LoginProperties
loginProperties
=
new
LoginProperties
(
1
,
Long
.
valueOf
(
sessionStruct
.
getRegisteredFrom
()),
sessionStruct
.
getTenantId
());
AuthBean
authBean
=
sessionService
.
createSession
(
user
,
loginProperties
,
LoginType
.
ACCOUNTPASSWORD
.
ordinal
(),
sessionStruct
.
getTenantId
());
if
(
authBean
!=
null
)
{
authBean
.
setRegister
(
false
);
}
//TODO:统一处理行为验证逻辑
// if (geetestLogId != null) {
// geetestLogService.updateByUidGeetestLog(geetestLogId, user.getId());
// }
return
null
;
}
@Override
public
BaseLoginParam
checkParam
(
LoginReq
loginReq
)
{
PhonePasswordLoginParam
param
=
loginReq
.
getData
().
toJavaObject
(
PhonePasswordLoginParam
.
class
);
validator
.
validate
(
param
);
return
param
;
}
}
src/main/java/cn/quantgroup/xyqb/service/v2/QuantGroupBehaviorStrategy.java
0 → 100644
View file @
c414a844
package
cn
.
quantgroup
.
xyqb
.
service
.
v2
;
import
cn.quantgroup.xyqb.controller.req.v2.LoginBehavior
;
/**
* 公司自有验证码模式
*/
public
class
QuantGroupBehaviorStrategy
implements
BehaviorStrategy
{
@Override
public
Integer
getType
()
{
return
1
;
}
@Override
public
boolean
validate
(
LoginBehavior
loginBehavior
)
{
return
false
;
}
@Override
public
void
checkParam
(
LoginBehavior
loginBehavior
)
{
}
}
src/main/java/cn/quantgroup/xyqb/service/v2/SMSDirectJiLoginStrategy.java
0 → 100644
View file @
c414a844
package
cn
.
quantgroup
.
xyqb
.
service
.
v2
;
import
cn.quantgroup.xyqb.controller.req.v2.LoginReq
;
import
cn.quantgroup.xyqb.model.LoginBean
;
import
cn.quantgroup.xyqb.model.v2.login.BaseLoginParam
;
import
org.springframework.stereotype.Service
;
/**
* 极光一键登录
*/
@Service
public
class
SMSDirectJiLoginStrategy
implements
LoginStrategy
{
@Override
public
Integer
getType
()
{
return
1201
;
}
@Override
public
LoginBean
login
(
BaseLoginParam
param
)
{
return
null
;
}
@Override
public
BaseLoginParam
checkParam
(
LoginReq
loginReq
)
{
return
null
;
}
}
src/main/java/cn/quantgroup/xyqb/service/v2/SMSLoginStrategy.java
0 → 100644
View file @
c414a844
package
cn
.
quantgroup
.
xyqb
.
service
.
v2
;
import
cn.quantgroup.xyqb.controller.req.v2.LoginReq
;
import
cn.quantgroup.xyqb.model.LoginBean
;
import
cn.quantgroup.xyqb.model.v2.login.BaseLoginParam
;
import
org.springframework.stereotype.Service
;
/**
* 短信验证码登录
*/
@Service
public
class
SMSLoginStrategy
implements
LoginStrategy
{
@Override
public
Integer
getType
()
{
return
1101
;
}
@Override
public
LoginBean
login
(
BaseLoginParam
param
)
{
return
null
;
}
@Override
public
BaseLoginParam
checkParam
(
LoginReq
loginReq
)
{
return
null
;
}
}
src/main/java/cn/quantgroup/xyqb/service/v2/WechatMiniLoginStrategy.java
0 → 100644
View file @
c414a844
package
cn
.
quantgroup
.
xyqb
.
service
.
v2
;
import
cn.quantgroup.xyqb.controller.req.v2.LoginReq
;
import
cn.quantgroup.xyqb.model.LoginBean
;
import
cn.quantgroup.xyqb.model.v2.login.BaseLoginParam
;
import
org.springframework.stereotype.Service
;
/**
* 微信小程序登录
*/
@Service
public
class
WechatMiniLoginStrategy
implements
LoginStrategy
{
@Override
public
Integer
getType
()
{
return
2101
;
}
@Override
public
LoginBean
login
(
BaseLoginParam
param
)
{
return
null
;
}
@Override
public
BaseLoginParam
checkParam
(
LoginReq
loginReq
)
{
return
null
;
}
}
src/main/java/cn/quantgroup/xyqb/service/v2/WechatMiniPhoneLoginStrategy.java
0 → 100644
View file @
c414a844
package
cn
.
quantgroup
.
xyqb
.
service
.
v2
;
import
cn.quantgroup.xyqb.controller.req.v2.LoginReq
;
import
cn.quantgroup.xyqb.model.LoginBean
;
import
cn.quantgroup.xyqb.model.v2.login.BaseLoginParam
;
import
org.springframework.stereotype.Service
;
/**
* 微信小程序手机号码登录
*/
@Service
public
class
WechatMiniPhoneLoginStrategy
implements
LoginStrategy
{
@Override
public
Integer
getType
()
{
return
2102
;
}
@Override
public
LoginBean
login
(
BaseLoginParam
param
)
{
return
null
;
}
@Override
public
BaseLoginParam
checkParam
(
LoginReq
loginReq
)
{
return
null
;
}
}
src/main/java/cn/quantgroup/xyqb/session/XyqbSessionContextHolder.java
View file @
c414a844
...
...
@@ -3,6 +3,7 @@ package cn.quantgroup.xyqb.session;
import
cn.quantgroup.xyqb.Constants
;
import
cn.quantgroup.xyqb.model.session.SessionStruct
;
import
cn.quantgroup.xyqb.model.session.SessionValue
;
import
cn.quantgroup.xyqb.util.IpUtil
;
import
com.alibaba.fastjson.JSON
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.StringUtils
;
...
...
@@ -11,7 +12,6 @@ import org.springframework.web.context.request.RequestContextHolder;
import
org.springframework.web.context.request.ServletRequestAttributes
;
import
javax.servlet.http.HttpServletRequest
;
import
java.util.Objects
;
/**
* Created by Miraculous on 2016/12/29.
...
...
@@ -37,6 +37,24 @@ public class XyqbSessionContextHolder {
return
sessionStruct
;
}
public
static
SessionStruct
initXSession
()
{
SessionStruct
sessionStruct
;
if
(
threadSession
.
get
()
!=
null
)
{
sessionStruct
=
threadSession
.
get
();
}
else
{
sessionStruct
=
new
SessionStruct
();
HttpServletRequest
request
=
((
ServletRequestAttributes
)
RequestContextHolder
.
getRequestAttributes
()).
getRequest
();
String
tenantId
=
request
.
getHeader
(
Constants
.
X_AUTH_TENANT
);
String
registered_from
=
request
.
getHeader
(
Constants
.
X_AUTH_FROM
);
String
ip
=
IpUtil
.
getRemoteIP
(
request
);
sessionStruct
.
setTenantId
(
Integer
.
valueOf
(
tenantId
));
sessionStruct
.
setRegisteredFrom
(
Integer
.
valueOf
(
registered_from
));
sessionStruct
.
setIp
(
ip
);
threadSession
.
set
(
sessionStruct
);
}
return
sessionStruct
;
}
public
static
SessionStruct
getXSessionFromRedis
()
{
HttpServletRequest
request
=
((
ServletRequestAttributes
)
RequestContextHolder
.
getRequestAttributes
()).
getRequest
();
String
token
=
request
.
getHeader
(
Constants
.
X_AUTH_TOKEN
);
...
...
@@ -52,13 +70,13 @@ public class XyqbSessionContextHolder {
String
linkToken
=
Constants
.
Session
.
USER_SESSION_CACHE
+
token
;
String
result
=
redisTemplate
.
opsForValue
().
get
(
linkToken
);
if
(
StringUtils
.
isEmpty
(
result
))
{
log
.
warn
(
"[XyqbSessionContextHolder][getXSessionFromRedis] session data 未找到:Tokekn:{},linkTokekn:{},sessionValue:{}"
,
token
,
linkToken
,
result
);
log
.
warn
(
"[XyqbSessionContextHolder][getXSessionFromRedis] session data 未找到:Tokekn:{},linkTokekn:{},sessionValue:{}"
,
token
,
linkToken
,
result
);
return
null
;
}
try
{
SessionValue
values
=
JSON
.
parseObject
(
result
,
SessionValue
.
class
);
if
(
values
==
null
)
{
log
.
warn
(
"[XyqbSessionContextHolder][getXSessionFromRedis] session data 序列化失败:token:{},linkTokekn:{},sessionValue:{}"
,
token
,
linkToken
,
result
);
log
.
warn
(
"[XyqbSessionContextHolder][getXSessionFromRedis] session data 序列化失败:token:{},linkTokekn:{},sessionValue:{}"
,
token
,
linkToken
,
result
);
return
null
;
}
SessionStruct
sessionStruct
=
new
SessionStruct
();
...
...
@@ -67,7 +85,7 @@ public class XyqbSessionContextHolder {
sessionStruct
.
setExpire
(
redisTemplate
.
getExpire
(
Constants
.
Session
.
USER_SESSION_CACHE
+
token
));
return
sessionStruct
;
}
catch
(
Exception
e
)
{
log
.
warn
(
"[XyqbSessionContextHolder][getXSessionFromRedis] 序列化SessionValue出错:Tokekn:{},linkTokekn:{},sessionValue:{}"
,
token
,
linkToken
,
result
,
e
);
log
.
warn
(
"[XyqbSessionContextHolder][getXSessionFromRedis] 序列化SessionValue出错:Tokekn:{},linkTokekn:{},sessionValue:{}"
,
token
,
linkToken
,
result
,
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