Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
D
dsk-cr20g
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
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
Administrator
dsk-cr20g
Commits
e3eec96a
Commit
e3eec96a
authored
Sep 04, 2023
by
tanyang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
新增短信配置
parent
fdc10cb4
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
118 additions
and
19 deletions
+118
-19
CaptchaController.java
...java/com/dsk/web/controller/common/CaptchaController.java
+23
-2
SysLoginController.java
...ava/com/dsk/web/controller/system/SysLoginController.java
+39
-6
application-dev.yml
dsk-admin/src/main/resources/application-dev.yml
+3
-3
SysLoginService.java
...src/main/java/com/dsk/system/service/SysLoginService.java
+53
-8
No files found.
dsk-admin/src/main/java/com/dsk/web/controller/common/CaptchaController.java
View file @
e3eec96a
...
@@ -10,6 +10,7 @@ import com.dsk.common.constant.Constants;
...
@@ -10,6 +10,7 @@ import com.dsk.common.constant.Constants;
import
com.dsk.common.constant.GlobalConstants
;
import
com.dsk.common.constant.GlobalConstants
;
import
com.dsk.common.core.domain.R
;
import
com.dsk.common.core.domain.R
;
import
com.dsk.common.enums.CaptchaType
;
import
com.dsk.common.enums.CaptchaType
;
import
com.dsk.common.exception.user.CaptchaException
;
import
com.dsk.common.exception.user.CaptchaExpireException
;
import
com.dsk.common.exception.user.CaptchaExpireException
;
import
com.dsk.common.helper.LoginHelper
;
import
com.dsk.common.helper.LoginHelper
;
import
com.dsk.common.utils.MessageUtils
;
import
com.dsk.common.utils.MessageUtils
;
...
@@ -29,6 +30,7 @@ import org.dromara.sms4j.api.SmsBlend;
...
@@ -29,6 +30,7 @@ import org.dromara.sms4j.api.SmsBlend;
import
org.dromara.sms4j.api.entity.SmsResponse
;
import
org.dromara.sms4j.api.entity.SmsResponse
;
import
org.dromara.sms4j.core.factory.SmsFactory
;
import
org.dromara.sms4j.core.factory.SmsFactory
;
import
org.dromara.sms4j.provider.enumerate.SupplierType
;
import
org.dromara.sms4j.provider.enumerate.SupplierType
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.expression.Expression
;
import
org.springframework.expression.Expression
;
import
org.springframework.expression.ExpressionParser
;
import
org.springframework.expression.ExpressionParser
;
import
org.springframework.expression.spel.standard.SpelExpressionParser
;
import
org.springframework.expression.spel.standard.SpelExpressionParser
;
...
@@ -60,18 +62,23 @@ public class CaptchaController {
...
@@ -60,18 +62,23 @@ public class CaptchaController {
private
final
MailProperties
mailProperties
;
private
final
MailProperties
mailProperties
;
private
final
SysUserMapper
userMapper
;
private
final
SysUserMapper
userMapper
;
@Value
(
"${captcha.enable}"
)
private
boolean
captchaEnabled
;
/**
/**
* 发送短信验证码
* 发送短信验证码
*
*
* @param phonenumber 用户手机号
* @param phonenumber 用户手机号
*/
*/
@GetMapping
(
"/captchaSms"
)
@GetMapping
(
"/captchaSms"
)
public
R
<
Void
>
smsCaptcha
(
@NotBlank
(
message
=
"{user.phonenumber.not.blank}"
)
String
phonenumber
)
{
public
R
<
Void
>
smsCaptcha
(
@NotBlank
(
message
=
"{user.phonenumber.not.blank}"
)
String
phonenumber
,
String
uid
,
String
captchaCode
,
String
templateId
)
{
String
key
=
GlobalConstants
.
CAPTCHA_CODE_KEY
+
phonenumber
;
String
key
=
GlobalConstants
.
CAPTCHA_CODE_KEY
+
phonenumber
;
// 验证码开关
if
(
captchaEnabled
)
{
validateCaptcha
(
phonenumber
,
captchaCode
,
uid
);
}
String
code
=
RandomUtil
.
randomNumbers
(
6
);
String
code
=
RandomUtil
.
randomNumbers
(
6
);
RedisUtils
.
setCacheObject
(
key
,
code
,
Duration
.
ofMinutes
(
Constants
.
CAPTCHA_EXPIRATION
));
RedisUtils
.
setCacheObject
(
key
,
code
,
Duration
.
ofMinutes
(
Constants
.
CAPTCHA_EXPIRATION
));
// 验证码模板id 自行处理 (查数据库或写死均可)
// 验证码模板id 自行处理 (查数据库或写死均可)
String
templateId
=
""
;
LinkedHashMap
<
String
,
String
>
map
=
new
LinkedHashMap
<>(
1
);
LinkedHashMap
<
String
,
String
>
map
=
new
LinkedHashMap
<>(
1
);
map
.
put
(
"code"
,
code
);
map
.
put
(
"code"
,
code
);
SmsBlend
smsBlend
=
SmsFactory
.
createSmsBlend
(
SupplierType
.
ALIBABA
);
SmsBlend
smsBlend
=
SmsFactory
.
createSmsBlend
(
SupplierType
.
ALIBABA
);
...
@@ -83,6 +90,20 @@ public class CaptchaController {
...
@@ -83,6 +90,20 @@ public class CaptchaController {
return
R
.
ok
();
return
R
.
ok
();
}
}
private
void
validateCaptcha
(
String
phonenumber
,
String
captchaCode
,
String
uuid
)
{
String
verifyKey
=
GlobalConstants
.
CAPTCHA_CODE_KEY
+
StringUtils
.
defaultString
(
uuid
,
""
);
String
captcha
=
RedisUtils
.
getCacheObject
(
verifyKey
);
RedisUtils
.
deleteObject
(
verifyKey
);
if
(
captcha
==
null
)
{
// recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
throw
new
CaptchaExpireException
();
}
if
(!
captchaCode
.
equalsIgnoreCase
(
captcha
))
{
// recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"));
throw
new
CaptchaException
();
}
}
/**
/**
* 开发需要,临时发送短信验证码
* 开发需要,临时发送短信验证码
*/
*/
...
...
dsk-admin/src/main/java/com/dsk/web/controller/system/SysLoginController.java
View file @
e3eec96a
...
@@ -5,6 +5,7 @@ import cn.dev33.satoken.annotation.SaIgnore;
...
@@ -5,6 +5,7 @@ import cn.dev33.satoken.annotation.SaIgnore;
import
cn.dev33.satoken.stp.StpUtil
;
import
cn.dev33.satoken.stp.StpUtil
;
import
cn.hutool.core.lang.Assert
;
import
cn.hutool.core.lang.Assert
;
import
cn.hutool.core.map.MapUtil
;
import
cn.hutool.core.map.MapUtil
;
import
cn.hutool.core.util.RandomUtil
;
import
com.dsk.common.constant.Constants
;
import
com.dsk.common.constant.Constants
;
import
com.dsk.common.constant.GlobalConstants
;
import
com.dsk.common.constant.GlobalConstants
;
import
com.dsk.common.core.domain.R
;
import
com.dsk.common.core.domain.R
;
...
@@ -24,6 +25,10 @@ import com.dsk.system.service.ISysMenuService;
...
@@ -24,6 +25,10 @@ import com.dsk.system.service.ISysMenuService;
import
com.dsk.system.service.ISysUserService
;
import
com.dsk.system.service.ISysUserService
;
import
com.dsk.system.service.SysLoginService
;
import
com.dsk.system.service.SysLoginService
;
import
lombok.RequiredArgsConstructor
;
import
lombok.RequiredArgsConstructor
;
import
org.dromara.sms4j.api.SmsBlend
;
import
org.dromara.sms4j.api.entity.SmsResponse
;
import
org.dromara.sms4j.core.factory.SmsFactory
;
import
org.dromara.sms4j.provider.enumerate.SupplierType
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.bind.annotation.*
;
...
@@ -32,6 +37,7 @@ import javax.servlet.http.HttpServletRequest;
...
@@ -32,6 +37,7 @@ import javax.servlet.http.HttpServletRequest;
import
javax.validation.constraints.NotBlank
;
import
javax.validation.constraints.NotBlank
;
import
java.time.Duration
;
import
java.time.Duration
;
import
java.util.HashMap
;
import
java.util.HashMap
;
import
java.util.LinkedHashMap
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Map
;
...
@@ -116,6 +122,36 @@ public class SysLoginController {
...
@@ -116,6 +122,36 @@ public class SysLoginController {
}
}
/**
* 获取当前用户默认租户
* @return
*/
@SaIgnore
@PostMapping
(
"/user/default/tenant/phone"
)
public
R
<
Map
>
userDefaultTenant
(
String
phone
)
{
// LoginUser loginUser = LoginHelper.getLoginUser();
// Assert.notNull(loginUser,"用户信息不存在!");
String
defaultTenantKey
=
GlobalConstants
.
PHONE_DEFAULT_TENANT
+
phone
;
String
defaultTenant
=
RedisUtils
.
getCacheObject
(
defaultTenantKey
);
return
R
.
ok
(
MapUtil
.
of
(
"tenantId"
,
defaultTenant
));
}
/**
* 发送短信验证码
*
* @param phones 电话号
* @param templateId 模板ID
*/
@SaIgnore
@GetMapping
(
"/send/sms/code"
)
public
R
<
Object
>
sendAliyun
(
String
phones
,
String
templateId
)
{
LinkedHashMap
<
String
,
String
>
map
=
new
LinkedHashMap
<>(
1
);
map
.
put
(
"code"
,
RandomUtil
.
randomNumbers
(
4
));
SmsBlend
smsBlend
=
SmsFactory
.
createSmsBlend
(
SupplierType
.
ALIBABA
);
SmsResponse
smsResponse
=
smsBlend
.
sendMessage
(
phones
,
templateId
,
map
);
return
R
.
ok
(
smsResponse
);
}
/**
/**
* 短信登录
* 短信登录
*
*
...
@@ -124,14 +160,11 @@ public class SysLoginController {
...
@@ -124,14 +160,11 @@ public class SysLoginController {
*/
*/
@SaIgnore
@SaIgnore
@PostMapping
(
"/smsLogin"
)
@PostMapping
(
"/smsLogin"
)
public
R
<
Map
<
String
,
Object
>>
smsLogin
(
@Validated
@RequestBody
SmsLoginBody
smsLoginBody
)
{
public
R
<
LoginVo
>
smsLogin
(
@Validated
@RequestBody
SmsLoginBody
smsLoginBody
)
{
Map
<
String
,
Object
>
ajax
=
new
HashMap
<>();
// 生成令牌
// 生成令牌
String
token
=
loginService
.
smsLogin
(
smsLoginBody
.
getPhonenumber
(),
smsLoginBody
.
getSmsCode
());
LoginVo
loginVo
=
loginService
.
smsLogin
(
smsLoginBody
.
getPhonenumber
(),
smsLoginBody
.
getSmsCode
());
ajax
.
put
(
Constants
.
TOKEN
,
token
);
return
R
.
ok
(
loginVo
);
return
R
.
ok
(
ajax
);
}
}
/**
/**
* 邮件登录
* 邮件登录
*
*
...
...
dsk-admin/src/main/resources/application-dev.yml
View file @
e3eec96a
...
@@ -167,11 +167,11 @@ sms:
...
@@ -167,11 +167,11 @@ sms:
#请求地址 默认为 dysmsapi.aliyuncs.com 如无特殊改变可以不用设置
#请求地址 默认为 dysmsapi.aliyuncs.com 如无特殊改变可以不用设置
requestUrl
:
dysmsapi.aliyuncs.com
requestUrl
:
dysmsapi.aliyuncs.com
#阿里云的accessKey
#阿里云的accessKey
accessKeyId
:
xxxxxxx
accessKeyId
:
LTAIC4Pb2jJZbUmD
#阿里云的accessKeySecret
#阿里云的accessKeySecret
accessKeySecret
:
xxxxxxx
accessKeySecret
:
L7VANFwqaTludkczLsg9jhvidk0e28
#短信签名
#短信签名
signature
:
测试
signature
:
大司空信息科技
tencent
:
tencent
:
#请求地址默认为 sms.tencentcloudapi.com 如无特殊改变可不用设置
#请求地址默认为 sms.tencentcloudapi.com 如无特殊改变可不用设置
requestUrl
:
sms.tencentcloudapi.com
requestUrl
:
sms.tencentcloudapi.com
...
...
dsk-system/src/main/java/com/dsk/system/service/SysLoginService.java
View file @
e3eec96a
...
@@ -187,19 +187,64 @@ public class SysLoginService {
...
@@ -187,19 +187,64 @@ public class SysLoginService {
return
StpUtil
.
getTokenValue
();
return
StpUtil
.
getTokenValue
();
}
}
public
String
smsLogin
(
String
phonenumber
,
String
smsCode
)
{
public
LoginVo
smsLogin
(
String
username
,
String
smsCode
)
{
// 通过手机号查找用户
String
tenantId
=
null
;
SysUser
user
=
loadUserByPhonenumber
(
phonenumber
);
if
(
ReUtil
.
isMatch
(
RegexPool
.
MOBILE
,
username
))
{
String
defaultTenantId
=
RedisUtils
.
getCacheObject
(
GlobalConstants
.
PHONE_DEFAULT_TENANT
+
username
);
log
.
info
(
"登录用户:{} 获取缓存默认租户:"
+
tenantId
,
username
);
if
(
StrUtil
.
isNotBlank
(
defaultTenantId
)){
tenantId
=
defaultTenantId
;
}
}
checkLogin
(
LoginType
.
SMS
,
user
.
getUserName
(),
()
->
!
validateSmsCode
(
phonenumber
,
smsCode
));
//查询手机号绑定的所有用户
if
(
StrUtil
.
isEmpty
(
tenantId
))
{
List
<
SysUser
>
sysUsers
=
queryListByPhone
(
username
);
if
(
CollectionUtil
.
isEmpty
(
sysUsers
))
{
log
.
info
(
"登录用户:{} 不存在."
,
username
);
throw
new
UserException
(
"user.not.exists"
,
username
);
}
else
if
(
sysUsers
.
size
()
>
1
)
{
//处理存在多个用户的情况,取一个最新租户
SysUser
sysUser
=
sysUsers
.
get
(
0
);
if
(
ObjectUtil
.
isEmpty
(
sysUser
))
{
log
.
info
(
"登录用户:{} 不存在."
,
username
);
throw
new
UserException
(
"user.not.exists"
,
username
);
}
tenantId
=
sysUser
.
getTenantId
();
}
else
{
SysUser
sysUser
=
sysUsers
.
get
(
0
);
tenantId
=
sysUser
.
getTenantId
();
}
}
// 校验租户
if
(
tenantId
!=
null
)
{
checkTenant
(
tenantId
);
}
if
(
tenantId
==
null
||
""
.
equals
(
tenantId
))
{
tenantId
=
TenantConstants
.
DEFAULT_TENANT_ID
;
}
TenantHelper
.
setTenantId
(
tenantId
);
// 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可
// SysUser user = loadUserByUsername(username);
// return TenantBroker.applyAs(tenantId, (id -> {
// 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可
SysUser
user
=
loadUserByUsername
(
username
);
checkLogin
(
LoginType
.
PASSWORD
,
username
,
()
->
!
validateSmsCode
(
username
,
smsCode
));
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
LoginUser
loginUser
=
buildLoginUser
(
user
);
LoginUser
loginUser
=
buildLoginUser
(
user
);
// 生成token
// 生成token
LoginHelper
.
loginByDevice
(
loginUser
,
DeviceType
.
APP
);
LoginHelper
.
loginByDevice
(
loginUser
,
DeviceType
.
PC
);
recordLogininfor
(
user
.
getUserName
(),
Constants
.
LOGIN_SUCCESS
,
MessageUtils
.
message
(
"user.login.success"
));
recordLogininfor
(
username
,
Constants
.
LOGIN_SUCCESS
,
MessageUtils
.
message
(
"user.login.success"
));
recordLoginInfo
(
user
.
getUserId
(),
user
.
getUserName
());
recordLoginInfo
(
user
.
getUserId
(),
username
);
return
StpUtil
.
getTokenValue
();
LoginVo
loginVo
=
new
LoginVo
();
loginVo
.
setTenantId
(
TenantHelper
.
getTenantId
());
loginVo
.
setAccessToken
(
StpUtil
.
getTokenValue
());
loginVo
.
setExpireIn
(
StpUtil
.
getTokenTimeout
());
return
loginVo
;
}
}
public
String
emailLogin
(
String
email
,
String
emailCode
)
{
public
String
emailLogin
(
String
email
,
String
emailCode
)
{
...
...
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