Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
shengzhang_
sa-token
提交
89b1a2a3
sa-token
项目概览
shengzhang_
/
sa-token
通知
68
Star
16
Fork
4
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
sa-token
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
89b1a2a3
编写于
4月 05, 2021
作者:
shengzhang_
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
账号封禁功能
上级
37f1642f
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
166 addition
and
11 deletion
+166
-11
sa-token-core/src/main/java/cn/dev33/satoken/exception/DisableLoginException.java
...ava/cn/dev33/satoken/exception/DisableLoginException.java
+78
-0
sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java
...ken-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java
+45
-1
sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java
...oken-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java
+28
-0
sa-token-demo-springboot/pom.xml
sa-token-demo-springboot/pom.xml
+4
-4
sa-token-demo-springboot/src/main/java/com/pj/test/GlobalException.java
...springboot/src/main/java/com/pj/test/GlobalException.java
+4
-0
sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java
...-springboot/src/main/java/com/pj/test/TestController.java
+0
-5
sa-token-doc/index.css
sa-token-doc/index.css
+1
-1
sa-token-doc/index.html
sa-token-doc/index.html
+6
-0
未找到文件。
sa-token-core/src/main/java/cn/dev33/satoken/exception/DisableLoginException.java
0 → 100644
浏览文件 @
89b1a2a3
package
cn.dev33.satoken.exception
;
/**
* 一个异常:代表账号已被封禁
*
* @author kong
*/
public
class
DisableLoginException
extends
SaTokenException
{
/**
* 序列化版本号
*/
private
static
final
long
serialVersionUID
=
6806129545290130143L
;
/** 异常标记值 */
public
static
final
String
BE_VALUE
=
"disable"
;
/** 异常提示语 */
public
static
final
String
BE_MESSAGE
=
"此账号已被封禁"
;
/**
* LoginKey
*/
private
String
loginKey
;
/**
* 被封禁的账号id
*/
private
Object
loginId
;
/**
* 封禁剩余时间,单位:秒
*/
private
long
disableTime
;
/**
* 获得LoginKey
*
* @return See above
*/
public
String
getLoginKey
()
{
return
loginKey
;
}
/**
* 获取: 被封禁的账号id
*
* @return See above
*/
public
Object
getLoginId
()
{
return
loginId
;
}
/**
* 获取: 封禁剩余时间,单位:秒
* @return See above
*/
public
long
getDisableTime
()
{
return
disableTime
;
}
/**
* 构造方法创建一个
*
* @param loginKey loginKey
* @param loginId 被封禁的账号id
* @param disableTime 封禁剩余时间,单位:秒
*/
public
DisableLoginException
(
String
loginKey
,
Object
loginId
,
long
disableTime
)
{
super
(
BE_MESSAGE
);
this
.
loginId
=
loginId
;
this
.
loginKey
=
loginKey
;
this
.
disableTime
=
disableTime
;
}
}
sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java
浏览文件 @
89b1a2a3
...
...
@@ -17,6 +17,7 @@ import cn.dev33.satoken.annotation.SaCheckRole;
import
cn.dev33.satoken.annotation.SaMode
;
import
cn.dev33.satoken.config.SaTokenConfig
;
import
cn.dev33.satoken.dao.SaTokenDao
;
import
cn.dev33.satoken.exception.DisableLoginException
;
import
cn.dev33.satoken.exception.NotLoginException
;
import
cn.dev33.satoken.exception.NotPermissionException
;
import
cn.dev33.satoken.exception.NotRoleException
;
...
...
@@ -181,6 +182,8 @@ public class StpLogic {
// =================== 登录相关操作 ===================
// 登录与注销
/**
* 在当前会话上登录id
* @param loginId 登录id,建议的类型:(long | int | String)
...
...
@@ -214,6 +217,11 @@ public class StpLogic {
*/
public
void
setLoginId
(
Object
loginId
,
SaLoginModel
loginModel
)
{
// ------ 0、检查此账号是否已被封禁
if
(
isDisable
(
loginId
))
{
throw
new
DisableLoginException
(
loginKey
,
loginId
,
getDisableTime
(
loginId
));
}
// ------ 1、获取相应对象
SaTokenConfig
config
=
getConfig
();
SaTokenDao
dao
=
SaTokenManager
.
getSaTokenDao
();
...
...
@@ -353,6 +361,34 @@ public class StpLogic {
session
.
logoutByTokenSignCountToZero
();
}
/**
* 封禁指定账号
* <p> 此方法不会直接将此账号id踢下线,而是在对方再次登录时抛出`DisableLoginException`异常
* @param loginId 指定账号id
* @param disableTime 封禁时间, 单位: 秒 (-1=永久封禁)
*/
public
void
disableLoginId
(
Object
loginId
,
long
disableTime
)
{
SaTokenManager
.
getSaTokenDao
().
set
(
splicingKeyDisable
(
loginId
),
DisableLoginException
.
BE_VALUE
,
disableTime
);
}
/**
* 指定账号是否已被封禁 (true=已被封禁, false=未被封禁)
* @param loginId 账号id
* @return see note
*/
public
boolean
isDisable
(
Object
loginId
)
{
return
SaTokenManager
.
getSaTokenDao
().
get
(
splicingKeyDisable
(
loginId
))
!=
null
;
}
/**
* 获取指定账号剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁)
* @param loginId 账号id
* @return see note
*/
public
long
getDisableTime
(
Object
loginId
)
{
return
SaTokenManager
.
getSaTokenDao
().
getTimeout
(
splicingKeyDisable
(
loginId
));
}
// 查询相关
/**
...
...
@@ -1129,7 +1165,15 @@ public class StpLogic {
public
String
splicingKeyJustCreatedSave
()
{
return
SaTokenConsts
.
JUST_CREATED_SAVE_KEY
+
loginKey
;
}
/**
* 拼接key: 账号封禁
* @param loginId 账号id
* @return key
*/
public
String
splicingKeyDisable
(
Object
loginId
)
{
return
getConfig
().
getTokenName
()
+
":"
+
loginKey
+
":disable:"
+
loginId
;
}
// =================== Bean对象代理 ===================
...
...
sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java
浏览文件 @
89b1a2a3
...
...
@@ -132,7 +132,35 @@ public class StpUtil {
public
static
void
logoutByLoginId
(
Object
loginId
,
String
device
)
{
stpLogic
.
logoutByLoginId
(
loginId
,
device
);
}
/**
* 封禁指定账号
* <p> 此方法不会直接将此账号id踢下线,而是在对方再次登录时抛出`DisableLoginException`异常
* @param loginId 指定账号id
* @param disableTime 封禁时间, 单位: 秒 (-1=永久封禁)
*/
public
static
void
disableLoginId
(
Object
loginId
,
long
disableTime
)
{
stpLogic
.
disableLoginId
(
loginId
,
disableTime
);
}
/**
* 指定账号是否已被封禁 (true=已被封禁, false=未被封禁)
* @param loginId 账号id
* @return see note
*/
public
static
boolean
isDisable
(
Object
loginId
)
{
return
stpLogic
.
isDisable
(
loginId
);
}
/**
* 获取指定账号剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁)
* @param loginId 账号id
* @return see note
*/
public
static
long
getDisableTime
(
Object
loginId
)
{
return
stpLogic
.
getDisableTime
(
loginId
);
}
// 查询相关
...
...
sa-token-demo-springboot/pom.xml
浏览文件 @
89b1a2a3
...
...
@@ -46,17 +46,17 @@
</dependency> -->
<!-- sa-token整合redis (使用jackson序列化方式) -->
<
!-- <
dependency>
<dependency>
<groupId>
cn.dev33
</groupId>
<artifactId>
sa-token-dao-redis-jackson
</artifactId>
<version>
${sa-token-version}
</version>
</dependency>
-->
</dependency>
<!-- 提供redis连接池 -->
<
!-- <
dependency>
<dependency>
<groupId>
org.apache.commons
</groupId>
<artifactId>
commons-pool2
</artifactId>
</dependency>
-->
</dependency>
<!-- sa-token整合SpringAOP实现注解鉴权 -->
<!-- <dependency>
...
...
sa-token-demo-springboot/src/main/java/com/pj/test/GlobalException.java
浏览文件 @
89b1a2a3
...
...
@@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
import
com.pj.util.AjaxJson
;
import
cn.dev33.satoken.exception.DisableLoginException
;
import
cn.dev33.satoken.exception.NotLoginException
;
import
cn.dev33.satoken.exception.NotPermissionException
;
import
cn.dev33.satoken.exception.NotRoleException
;
...
...
@@ -50,6 +51,9 @@ public class GlobalException {
}
else
if
(
e
instanceof
NotPermissionException
)
{
// 如果是权限异常
NotPermissionException
ee
=
(
NotPermissionException
)
e
;
aj
=
AjaxJson
.
getNotJur
(
"无此权限:"
+
ee
.
getCode
());
}
else
if
(
e
instanceof
DisableLoginException
)
{
// 如果是被封禁异常
DisableLoginException
ee
=
(
DisableLoginException
)
e
;
aj
=
AjaxJson
.
getNotJur
(
"账号被封禁:"
+
ee
.
getDisableTime
()
+
"秒后解封"
);
}
else
{
// 普通异常, 输出:500 + 异常信息
aj
=
AjaxJson
.
getError
(
e
.
getMessage
());
}
...
...
sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java
浏览文件 @
89b1a2a3
...
...
@@ -241,11 +241,6 @@ public class TestController {
@RequestMapping
(
"test"
)
public
AjaxJson
test
()
{
System
.
out
.
println
(
"进来了"
);
// StpUtil.setLoginId(10001, new SaLoginModel()
// .setDevice("PC") // 此次登录的客户端设备标识, 用于[同端互斥登录]时指定此次登录的设备名称
// .setIsLastingCookie(true) // 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在)
// .setTimeout(60 * 60 * 24 * 7) // 指定此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的timeout值)
// );
return
AjaxJson
.
getSuccess
(
"访问成功"
);
}
...
...
sa-token-doc/index.css
浏览文件 @
89b1a2a3
...
...
@@ -25,7 +25,7 @@ body{font-size: 16px; color: #34495E; font-family: "Source Sans Pro","Helvetica
.nav-right
a
:hover
{
color
:
#42B983
;}
/* -------- 海报部分 --------- */
.main-box
{
width
:
100%
;
/* height: 80vh; */
text-align
:
center
;
background-image
:
url(http://yun94.cn/static/images/comment_bg.jpg2)
;
}
.main-box
{
width
:
100%
;
/* height: 80vh; */
text-align
:
center
;}
.main-box
{}
.fenge
{
min-height
:
90px
;}
.content-box
{
color
:
#000
;}
...
...
sa-token-doc/index.html
浏览文件 @
89b1a2a3
...
...
@@ -176,6 +176,9 @@
<a
href=
"https://shop.jfh.com/6089/"
target=
"_blank"
>
<img
src=
"https://oss.dev33.cn/sa-token/com/banxiawangluo.png"
>
</a>
<a
href=
"https://ms.airsr.com/"
target=
"_blank"
>
<img
src=
"https://oss.dev33.cn/sa-token/com/tianquhangkong.png"
>
</a>
</div>
<div
style=
"height: 10px; clear: both;"
></div>
<p
style=
"color: #666;"
>
...
...
@@ -213,6 +216,9 @@
<a
href=
"https://cubic.jiagoujishu.com/"
target=
"_blank"
>
<img
src=
"https://oss.dev33.cn/sa-token/link/cubic.png"
>
</a>
<a
href=
"http://www.pearadmin.com/"
target=
"_blank"
>
<img
src=
"https://oss.dev33.cn/sa-token/link/pear-admin.png"
>
</a>
</div>
<div
style=
"height: 10px; clear: both;"
></div>
</div>
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录