Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
MaxKey单点登录官方(MaxKeyTop)
MaxKey
提交
f80582fb
MaxKey
项目概览
MaxKey单点登录官方(MaxKeyTop)
/
MaxKey
9 个月 前同步成功
通知
75
Star
3
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
MaxKey
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
f80582fb
编写于
8月 19, 2021
作者:
M
MaxKey
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
v2.9.0 & loginSession
上级
eda9eeb6
变更
14
隐藏空白更改
内联
并排
Showing
14 changed file
with
302 addition
and
11 deletion
+302
-11
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/AbstractAuthenticationProvider.java
...java/org/maxkey/authn/AbstractAuthenticationProvider.java
+1
-0
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/RealmAuthenticationProvider.java
...in/java/org/maxkey/authn/RealmAuthenticationProvider.java
+1
-1
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/realm/AbstractAuthenticationRealm.java
...a/org/maxkey/authn/realm/AbstractAuthenticationRealm.java
+5
-4
maxkey-core/src/main/java/org/maxkey/persistence/db/LoginHistoryService.java
...n/java/org/maxkey/persistence/db/LoginHistoryService.java
+5
-5
maxkey-persistence/src/main/java/org/maxkey/persistence/mapper/HistoryLoginMapper.java
...ava/org/maxkey/persistence/mapper/HistoryLoginMapper.java
+5
-1
maxkey-persistence/src/main/java/org/maxkey/persistence/service/HistoryLoginService.java
...a/org/maxkey/persistence/service/HistoryLoginService.java
+5
-0
maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/HistoryLoginMapper.xml
...axkey/persistence/mapper/xml/mysql/HistoryLoginMapper.xml
+27
-0
maxkey-webs/maxkey-web-maxkey/src/main/java/org/maxkey/MaxKeyMvcConfig.java
...-web-maxkey/src/main/java/org/maxkey/MaxKeyMvcConfig.java
+2
-0
maxkey-webs/maxkey-web-maxkey/src/main/java/org/maxkey/web/historys/contorller/LoginSessionController.java
...axkey/web/historys/contorller/LoginSessionController.java
+141
-0
maxkey-webs/maxkey-web-maxkey/src/main/resources/messages/message.properties
...web-maxkey/src/main/resources/messages/message.properties
+2
-0
maxkey-webs/maxkey-web-maxkey/src/main/resources/messages/message_en.properties
...-maxkey/src/main/resources/messages/message_en.properties
+2
-0
maxkey-webs/maxkey-web-maxkey/src/main/resources/messages/message_zh_CN.properties
...xkey/src/main/resources/messages/message_zh_CN.properties
+2
-0
maxkey-webs/maxkey-web-maxkey/src/main/resources/templates/views/historys/loginSessionList.ftl
...n/resources/templates/views/historys/loginSessionList.ftl
+98
-0
maxkey-webs/maxkey-web-maxkey/src/main/resources/templates/views/layout/nav_primary.ftl
...src/main/resources/templates/views/layout/nav_primary.ftl
+6
-0
未找到文件。
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/AbstractAuthenticationProvider.java
浏览文件 @
f80582fb
...
...
@@ -331,6 +331,7 @@ public abstract class AbstractAuthenticationProvider {
_logger
.
debug
(
"login user "
+
username
+
" not in this System ."
+
message
);
UserInfo
loginUser
=
new
UserInfo
(
username
);
loginUser
.
setId
(
loginUser
.
generateId
());
loginUser
.
setUsername
(
username
);
loginUser
.
setDisplayName
(
"not exist"
);
loginUser
.
setLoginCount
(
0
);
authenticationRealm
.
insertLoginHistory
(
loginUser
,
ConstantsLoginType
.
LOCAL
,
""
,
...
...
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/RealmAuthenticationProvider.java
浏览文件 @
f80582fb
...
...
@@ -94,7 +94,7 @@ public class RealmAuthenticationProvider extends AbstractAuthenticationProvider
userInfo
=
loadUserInfo
(
loginCredential
.
getUsername
(),
loginCredential
.
getPassword
());
userinfoValid
(
userInfo
,
loginCredential
.
get
Password
());
userinfoValid
(
userInfo
,
loginCredential
.
get
Username
());
tftcaptchaValid
(
loginCredential
.
getOtpCaptcha
(),
loginCredential
.
getAuthType
(),
userInfo
);
...
...
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/realm/AbstractAuthenticationRealm.java
浏览文件 @
f80582fb
...
...
@@ -139,15 +139,16 @@ public abstract class AbstractAuthenticationRealm {
public
boolean
insertLoginHistory
(
UserInfo
userInfo
,
String
type
,
String
provider
,
String
code
,
String
message
)
{
String
sessionId
=
WebContext
.
genId
();
OnlineTicket
onlineTicket
=
null
;
int
sessionStatus
=
7
;
Authentication
authentication
=
WebContext
.
getAuthentication
();
if
(
authentication
.
getPrincipal
()
instanceof
SigninPrincipal
)
{
if
(
authentication
!=
null
&&
authentication
.
getPrincipal
()
instanceof
SigninPrincipal
)
{
sessionStatus
=
1
;
SigninPrincipal
signinPrincipal
=
(
SigninPrincipal
)
authentication
.
getPrincipal
();
onlineTicket
=
signinPrincipal
.
getOnlineTicket
();
sessionId
=
onlineTicket
.
getTicketId
().
substring
(
3
);
WebContext
.
setAttribute
(
WebConstants
.
CURRENT_USER_SESSION_ID
,
sessionId
);
}
WebContext
.
setAttribute
(
WebConstants
.
CURRENT_USER_SESSION_ID
,
sessionId
);
_logger
.
debug
(
"user session id is {} , online ticket {} "
,
sessionId
,(
onlineTicket
==
null
?
""
:
onlineTicket
.
getTicketId
()));
userInfo
.
setLastLoginTime
(
DateUtils
.
formatDateTime
(
new
Date
()));
...
...
@@ -189,7 +190,7 @@ public abstract class AbstractAuthenticationRealm {
}
loginHistoryService
.
login
(
userInfo
,
sessionId
,
type
,
message
,
code
,
provider
,
browser
,
platform
);
loginHistoryService
.
login
(
userInfo
,
sessionId
,
type
,
message
,
code
,
provider
,
browser
,
platform
,
sessionStatus
);
loginService
.
setLastLoginInfo
(
userInfo
);
...
...
maxkey-core/src/main/java/org/maxkey/persistence/db/LoginHistoryService.java
浏览文件 @
f80582fb
...
...
@@ -28,9 +28,9 @@ import org.springframework.jdbc.core.JdbcTemplate;
public
class
LoginHistoryService
{
private
static
Logger
_logger
=
LoggerFactory
.
getLogger
(
LoginHistoryService
.
class
);
private
static
final
String
HISTORY_LOGIN_INSERT_STATEMENT
=
"insert into mxk_history_login (id , sessionid , uid , username , displayname , logintype , message , code , provider , sourceip , browser , platform , application , loginurl
)values(
? , ? , ? , ? , ?, ? , ? , ?, ? , ? , ?, ? , ? , ?)"
;
private
static
final
String
HISTORY_LOGIN_INSERT_STATEMENT
=
"insert into mxk_history_login (id , sessionid , uid , username , displayname , logintype , message , code , provider , sourceip , browser , platform , application , loginurl
, sessionstatus)values( ? ,
? , ? , ? , ? , ?, ? , ? , ?, ? , ? , ?, ? , ? , ?)"
;
private
static
final
String
HISTORY_LOGOUT_UPDATE_STATEMENT
=
"update mxk_history_login set logouttime = ? where sessionid = ?"
;
private
static
final
String
HISTORY_LOGOUT_UPDATE_STATEMENT
=
"update mxk_history_login set logouttime = ?
,sessionstatus = 7
where sessionid = ?"
;
protected
JdbcTemplate
jdbcTemplate
;
...
...
@@ -39,14 +39,14 @@ public class LoginHistoryService {
}
public
void
login
(
UserInfo
userInfo
,
String
sessionId
,
String
type
,
String
message
,
String
code
,
String
provider
,
String
browser
,
String
platform
)
{
String
type
,
String
message
,
String
code
,
String
provider
,
String
browser
,
String
platform
,
int
sessionStatus
)
{
jdbcTemplate
.
update
(
HISTORY_LOGIN_INSERT_STATEMENT
,
new
Object
[]
{
WebContext
.
genId
(),
sessionId
,
userInfo
.
getId
(),
userInfo
.
getUsername
(),
userInfo
.
getDisplayName
(),
type
,
message
,
code
,
provider
,
userInfo
.
getLastLoginIp
(),
browser
,
platform
,
"Browser"
,
WebContext
.
getRequest
().
getRequestURI
()
},
"Browser"
,
WebContext
.
getRequest
().
getRequestURI
()
,
sessionStatus
},
new
int
[]
{
Types
.
VARCHAR
,
Types
.
VARCHAR
,
Types
.
VARCHAR
,
Types
.
VARCHAR
,
Types
.
VARCHAR
,
Types
.
VARCHAR
,
Types
.
VARCHAR
,
Types
.
VARCHAR
,
Types
.
VARCHAR
,
Types
.
VARCHAR
,
Types
.
VARCHAR
,
Types
.
VARCHAR
,
Types
.
VARCHAR
,
Types
.
VARCHAR
});
Types
.
VARCHAR
,
Types
.
VARCHAR
,
Types
.
INTEGER
});
}
...
...
maxkey-persistence/src/main/java/org/maxkey/persistence/mapper/HistoryLoginMapper.java
浏览文件 @
f80582fb
...
...
@@ -18,6 +18,8 @@
package
org.maxkey.persistence.mapper
;
import
java.util.List
;
import
org.apache.mybatis.jpa.persistence.IJpaBaseMapper
;
import
org.maxkey.entity.HistoryLogin
;
...
...
@@ -26,5 +28,7 @@ import org.maxkey.entity.HistoryLogin;
*
*/
public
interface
HistoryLoginMapper
extends
IJpaBaseMapper
<
HistoryLogin
>
{
public
List
<
HistoryLogin
>
queryOnlineSession
(
HistoryLogin
historyLogin
);
}
maxkey-persistence/src/main/java/org/maxkey/persistence/service/HistoryLoginService.java
浏览文件 @
f80582fb
...
...
@@ -18,6 +18,7 @@
package
org.maxkey.persistence.service
;
import
org.apache.mybatis.jpa.persistence.JpaBaseService
;
import
org.apache.mybatis.jpa.persistence.JpaPageResults
;
import
org.maxkey.entity.HistoryLogin
;
import
org.maxkey.persistence.mapper.HistoryLoginMapper
;
import
org.springframework.stereotype.Repository
;
...
...
@@ -37,4 +38,8 @@ public class HistoryLoginService extends JpaBaseService<HistoryLogin>{
// TODO Auto-generated method stub
return
(
HistoryLoginMapper
)
super
.
getMapper
();
}
public
JpaPageResults
<
HistoryLogin
>
queryOnlineSession
(
HistoryLogin
historyLogin
)
{
return
this
.
queryPageResults
(
"queryOnlineSession"
,
historyLogin
);
}
}
maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/HistoryLoginMapper.xml
浏览文件 @
f80582fb
...
...
@@ -63,6 +63,33 @@
order by logintime desc
</select>
<select
id=
"queryOnlineSession"
parameterType=
"HistoryLogin"
resultType=
"HistoryLogin"
>
select
sessionid id,
sessionid,
uid,
username,
displayname,
logintype,
message,
code,
provider,
sourceip,
browser,
platform,
application,
loginurl,
date_format(logintime, '%Y-%m-%d %H:%i:%s') as logintime,
date_format(logouttime, '%Y-%m-%d %H:%i:%s') as logouttime
from mxk_history_login
where sessionstatus = 1
<include
refid=
"dao_where_statement"
/>
order by logintime desc
</select>
<update
id=
"logout"
parameterType=
"java.lang.String"
>
update mxk_history_login set
logouttime = current_timestamp()
...
...
maxkey-webs/maxkey-web-maxkey/src/main/java/org/maxkey/MaxKeyMvcConfig.java
浏览文件 @
f80582fb
...
...
@@ -150,6 +150,8 @@ public class MaxKeyMvcConfig implements WebMvcConfigurer {
.
addPathPatterns
(
"/profile/**"
)
.
addPathPatterns
(
"/safe/**"
)
.
addPathPatterns
(
"/historys/**"
)
.
addPathPatterns
(
"/loginsession/**"
)
.
addPathPatterns
(
"loginsession/loginSessionList/grid"
)
.
addPathPatterns
(
"/appList"
)
.
addPathPatterns
(
"/appList/**"
)
.
addPathPatterns
(
"/socialsignon/**"
)
...
...
maxkey-webs/maxkey-web-maxkey/src/main/java/org/maxkey/web/historys/contorller/LoginSessionController.java
0 → 100644
浏览文件 @
f80582fb
/*
* Copyright [2020] [MaxKey of copyright http://www.maxkey.top]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org.maxkey.web.historys.contorller
;
import
java.text.SimpleDateFormat
;
import
java.util.Date
;
import
org.apache.mybatis.jpa.persistence.JpaPageResults
;
import
org.maxkey.authn.SigninPrincipal
;
import
org.maxkey.authn.online.OnlineTicket
;
import
org.maxkey.authn.online.OnlineTicketServices
;
import
org.maxkey.constants.ConstantsOperateMessage
;
import
org.maxkey.entity.HistoryLogin
;
import
org.maxkey.entity.HistoryLoginApps
;
import
org.maxkey.entity.HistoryLogs
;
import
org.maxkey.entity.UserInfo
;
import
org.maxkey.persistence.db.LoginHistoryService
;
import
org.maxkey.persistence.db.LoginService
;
import
org.maxkey.persistence.service.HistoryLoginAppsService
;
import
org.maxkey.persistence.service.HistoryLoginService
;
import
org.maxkey.persistence.service.HistorySystemLogsService
;
import
org.maxkey.util.DateUtils
;
import
org.maxkey.util.StringUtils
;
import
org.maxkey.web.WebContext
;
import
org.maxkey.web.message.Message
;
import
org.maxkey.web.message.MessageType
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.propertyeditors.CustomDateEditor
;
import
org.springframework.security.core.Authentication
;
import
org.springframework.stereotype.Controller
;
import
org.springframework.web.bind.WebDataBinder
;
import
org.springframework.web.bind.annotation.InitBinder
;
import
org.springframework.web.bind.annotation.ModelAttribute
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.bind.annotation.ResponseBody
;
/**
* 登录日志查询.
*
* @author Crystal.sea
*
*/
@Controller
@RequestMapping
(
value
=
{
"/loginsession"
})
public
class
LoginSessionController
{
static
final
Logger
_logger
=
LoggerFactory
.
getLogger
(
LoginSessionController
.
class
);
@Autowired
HistoryLoginService
historyLoginService
;
@Autowired
LoginService
loginService
;
@Autowired
LoginHistoryService
loginHistoryService
;
@Autowired
OnlineTicketServices
onlineTicketServices
;
@RequestMapping
(
value
=
{
"/loginSessionList"
})
public
String
authList
()
{
return
"historys/loginSessionList"
;
}
/**
* 查询登录日志.
*
* @param logsAuth
* @return
*/
@RequestMapping
(
value
=
{
"/loginSessionList/grid"
})
@ResponseBody
public
JpaPageResults
<
HistoryLogin
>
loginSessionListGrid
(
@ModelAttribute
(
"historyLogin"
)
HistoryLogin
historyLogin
)
{
_logger
.
debug
(
"history/loginsession/ loginSessionListGrid() "
+
historyLogin
);
historyLogin
.
setUid
(
WebContext
.
getUserInfo
().
getId
());
return
historyLoginService
.
queryOnlineSession
(
historyLogin
);
}
@ResponseBody
@RequestMapping
(
value
=
"/terminate"
)
public
Message
deleteUsersById
(
@RequestParam
(
"id"
)
String
ids
)
{
_logger
.
debug
(
ids
);
boolean
isTerminated
=
false
;
try
{
OnlineTicket
onlineTicket
=
null
;
Authentication
authentication
=
WebContext
.
getAuthentication
();
if
(
authentication
.
getPrincipal
()
instanceof
SigninPrincipal
)
{
SigninPrincipal
signinPrincipal
=
(
SigninPrincipal
)
authentication
.
getPrincipal
();
//onlineTicket
onlineTicket
=
signinPrincipal
.
getOnlineTicket
();
}
for
(
String
sessionId
:
StringUtils
.
string2List
(
ids
,
","
))
{
_logger
.
trace
(
"terminate session Id {} "
,
sessionId
);
if
(
onlineTicket
.
getTicketId
().
contains
(
sessionId
))
{
//skip current session
continue
;
}
UserInfo
userInfo
=
WebContext
.
getUserInfo
();
String
lastLogoffTime
=
DateUtils
.
formatDateTime
(
new
Date
());
loginService
.
setLastLogoffInfo
(
userInfo
);
loginHistoryService
.
logoff
(
lastLogoffTime
,
sessionId
);
onlineTicketServices
.
remove
(
"OT-"
+
sessionId
);
}
isTerminated
=
true
;
}
catch
(
Exception
e
)
{
_logger
.
debug
(
"terminate Exception ."
,
e
);
}
if
(
isTerminated
)
{
return
new
Message
(
WebContext
.
getI18nValue
(
ConstantsOperateMessage
.
DELETE_SUCCESS
),
MessageType
.
success
);
}
else
{
return
new
Message
(
WebContext
.
getI18nValue
(
ConstantsOperateMessage
.
DELETE_ERROR
),
MessageType
.
error
);
}
}
@InitBinder
public
void
initBinder
(
WebDataBinder
binder
)
{
SimpleDateFormat
dateFormat
=
new
SimpleDateFormat
(
DateUtils
.
FORMAT_DATE_HH_MM_SS
);
dateFormat
.
setLenient
(
false
);
binder
.
registerCustomEditor
(
Date
.
class
,
new
CustomDateEditor
(
dateFormat
,
true
));
}
}
maxkey-webs/maxkey-web-maxkey/src/main/resources/messages/message.properties
浏览文件 @
f80582fb
...
...
@@ -217,6 +217,7 @@ button.text.select=\u8bf7\u9009\u62e9
button.text.search
=
\u
67e5
\u
8be2
button.text.expandsearch
=
\u
5c55
\u
5f00
button.text.collapsesearch
=
\u6536\u
7f29
button.text.terminate
=
\u
7EC8
\u
6B62
forgotpassword.emailmobile
=
\u
90ae
\u
7bb1
\u6216\u
624b
\u
673a
forgotpassword.email
=
\u
90ae
\u
7bb1
...
...
@@ -284,6 +285,7 @@ navs.setting.timetoken=\u65f6\u95f4\u4ee4\u724c
navs.myprofile
=
\u6211\u7684\u
8d44
\u6599
navs.audit
=
\u
5ba1
\u
8ba1
navs.audit.loginsession
=
\u
4F1A
\u
8BDD
navs.audit.login
=
\u
767b
\u
5f55
\u
65e5
\u
5fd7
navs.audit.signon
=
\u
8bbf
\u
95ee
\u
65e5
\u
5fd7
navs.audit.operation
=
\u
7BA1
\u7406\u
65e5
\u
5fd7
...
...
maxkey-webs/maxkey-web-maxkey/src/main/resources/messages/message_en.properties
浏览文件 @
f80582fb
...
...
@@ -216,6 +216,7 @@ button.text.select=Select
button.text.search
=
Search
button.text.expandsearch
=
Expand
button.text.collapsesearch
=
Collapse
button.text.terminate
=
Terminate
forgotpassword.emailmobile
=
Email OR Mobile
forgotpassword.email
=
Email
...
...
@@ -285,6 +286,7 @@ navs.setting.timetoken=Timetoken
navs.myprofile
=
My Profile
navs.audit
=
Audit
navs.audit.loginsession
=
Session
navs.audit.login
=
Login
navs.audit.signon
=
Sign-on
navs.audit.operation
=
Management
...
...
maxkey-webs/maxkey-web-maxkey/src/main/resources/messages/message_zh_CN.properties
浏览文件 @
f80582fb
...
...
@@ -217,6 +217,7 @@ button.text.select=\u8bf7\u9009\u62e9
button.text.search
=
\u
67e5
\u
8be2
button.text.expandsearch
=
\u
5c55
\u
5f00
button.text.collapsesearch
=
\u6536\u
7f29
button.text.terminate
=
\u
7EC8
\u
6B62
forgotpassword.emailmobile
=
\u
90ae
\u
7bb1
\u6216\u
624b
\u
673a
forgotpassword.email
=
\u
90ae
\u
7bb1
...
...
@@ -284,6 +285,7 @@ navs.setting.timetoken=\u65f6\u95f4\u4ee4\u724c
navs.myprofile
=
\u6211\u7684\u
8d44
\u6599
navs.audit
=
\u
5ba1
\u
8ba1
navs.audit.loginsession
=
\u
4F1A
\u
8BDD
navs.audit.login
=
\u
767b
\u
5f55
\u
65e5
\u
5fd7
navs.audit.signon
=
\u
8bbf
\u
95ee
\u
65e5
\u
5fd7
navs.audit.operation
=
\u
7BA1
\u7406\u
65e5
\u
5fd7
...
...
maxkey-webs/maxkey-web-maxkey/src/main/resources/templates/views/historys/loginSessionList.ftl
0 → 100644
浏览文件 @
f80582fb
<!DOCTYPE HTML >
<html>
<head>
<
#include
"../
layout
/
header.ftl
"
/>
<
#include
"../
layout
/
common.cssjs.ftl
"
/>
</head>
<body>
<
#include
"../
layout
/
top.ftl
"
/>
<
#include
"../
layout
/
nav_primary.ftl
"
/>
<div
class=
"container"
>
<div
id=
"tool_box"
>
<table
class=
"table table-bordered"
>
<tr>
<td
width=
"120px"
>
<
@
locale
code=
"log.loginhistory.sourceIp"
/>
</td>
<td
width=
"375px"
>
<form
id=
"basic_search_form"
>
<input
class=
"form-control"
name=
"sourceIp"
type=
"text"
style =
"width:150px;float:left;"
>
<input
class=
"button btn btn-primary mr-3"
id=
"searchBtn"
type=
"button"
size=
"50"
value=
"<@locale code="
button.text.search
"
/>
">
<input
class=
"button btn btn-secondary"
id=
"advancedSearchExpandBtn"
type=
"button"
size=
"50"
value=
"<@locale code="
button.text.expandsearch
"
/>
" expandValue="
<
@
locale
code=
"button.text.expandsearch"
/>
" collapseValue="
<
@
locale
code=
"button.text.collapsesearch"
/>
">
</form>
</td>
<td
colspan=
"2"
>
<div
id=
"tool_box_right"
>
<input
id=
"deleteBtn"
type=
"button"
class=
"button btn btn-danger mr-3 "
value=
"<@locale code="
button.text.terminate
"
/>
"
wurl="
<
@
base
/>
/loginsession/terminate" />
</div>
</td>
</tr>
</table>
</div>
<div
id=
"advanced_search"
>
<form
id=
"advanced_search_form"
>
<table
class=
"table table-bordered"
>
<tr>
<td
width=
"120px"
><
@
locale
code=
"common.text.startdate"
/></td>
<td
width=
"360px"
>
<input
class=
"datetimepicker form-control"
name=
"startDate"
type=
"text"
>
</td>
<td
width=
"120px"
><
@
locale
code=
"common.text.enddate"
/></td>
<td
width=
"360px"
>
<input
style=
"width:70%"
class=
"datetimepicker form-control"
type=
"text"
id=
"endDate"
name=
"endDate"
title=
""
value=
""
/>
</td>
</tr>
</table>
</form>
</div>
<div
class=
"mainwrap"
id=
"main"
>
<table
data-url=
"<@base />/loginsession/loginSessionList/grid"
id=
"datagrid"
data-toggle=
"table"
data-classes=
"table table-bordered table-hover table-striped"
data-pagination=
"true"
data-click-to-select=
"true"
data-total-field=
"records"
data-page-list=
"[10, 25, 50, 100]"
data-search=
"false"
data-locale=
"zh-CN"
data-query-params=
"dataGridQueryParams"
data-query-params-type=
"pageSize"
data-side-pagination=
"server"
>
<thead>
<tr>
<th
data-checkbox=
"true"
></th>
<th
data-sortable=
"true"
data-field=
"id"
data-visible=
"false"
><
@
locale
code=
"log.loginhistory.id"
/></th>
<th
data-field=
"sessionId"
><
@
locale
code=
"log.loginhistory.sessionId"
/></th>
<th
data-field=
"username"
><
@
locale
code=
"log.loginhistory.username"
/></th>
<th
data-field=
"displayName"
><
@
locale
code=
"log.loginhistory.displayName"
/></th>
<th
data-field=
"provider"
><
@
locale
code=
"log.loginhistory.provider"
/></th>
<th
data-field=
"message"
><
@
locale
code=
"log.loginhistory.message"
/></th>
<th
data-field=
"loginType"
><
@
locale
code=
"log.loginhistory.loginType"
/></th>
<th
data-field=
"sourceIp"
><
@
locale
code=
"log.loginhistory.sourceIp"
/></th>
<th
data-field=
"browser"
><
@
locale
code=
"log.loginhistory.browser"
/></th>
<th
data-field=
"loginTime"
><
@
locale
code=
"log.loginhistory.loginTime"
/></th>
<th
data-field=
"logoutTime"
><
@
locale
code=
"log.loginhistory.logoutTime"
/></th>
<th
data-field=
"platform"
><
@
locale
code=
"log.loginhistory.platform"
/></th>
<th
data-field=
"application"
data-visible=
"false"
><
@
locale
code=
"log.loginhistory.application"
/></th>
<th
data-field=
"loginUrl"
data-visible=
"false"
><
@
locale
code=
"log.loginhistory.loginUrl"
/></th>
<th
data-field=
"code"
data-visible=
"false"
><
@
locale
code=
"log.loginhistory.code"
/></th>
<th
data-field=
"rpUserInfo"
data-visible=
"false"
><
@
locale
code=
"log.loginhistory.rpUserInfo"
/></th>
</tr>
</thead>
</table>
</div>
</div>
<div
id=
"footer"
>
<
#include
"../
layout
/
footer.ftl
"
/>
</div>
</body>
</html>
\ No newline at end of file
maxkey-webs/maxkey-web-maxkey/src/main/resources/templates/views/layout/nav_primary.ftl
浏览文件 @
f80582fb
...
...
@@ -52,6 +52,12 @@
<li id="nav_primay_15" class="nav_primay_level primaryleft" xpath="">
<a href="<@base/>/historys/loginList"><@locale code="navs.audit"/></a>
<div id="nav_child_1501" class="nav_second_child">
<ul>
<!--登录日志-->
<li id="nav_second_1501" class="nav_second_level">
<a href="<@base/>/loginsession/loginSessionList"><@locale code="navs.audit.loginsession"/></a>
</li>
</ul>
<ul>
<!--登录日志-->
<li id="nav_second_1501" class="nav_second_level">
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录