Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
yujianwangzivayy
MaxKey
提交
b7db556e
MaxKey
项目概览
yujianwangzivayy
/
MaxKey
与 Fork 源项目一致
Fork自
MaxKey单点登录官方(MaxKeyTop) / MaxKey
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
MaxKey
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
b7db556e
编写于
4月 01, 2020
作者:
MaxKey单点登录官方
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
v1.3 RC
上级
9cd40518
变更
15
展开全部
隐藏空白更改
内联
并排
Showing
15 changed file
with
894 addition
and
847 deletion
+894
-847
maxkey-core/src/main/java/org/maxkey/authn/AbstractAuthenticationProvider.java
...java/org/maxkey/authn/AbstractAuthenticationProvider.java
+81
-73
maxkey-core/src/main/java/org/maxkey/authn/BasicAuthentication.java
...e/src/main/java/org/maxkey/authn/BasicAuthentication.java
+58
-55
maxkey-core/src/main/java/org/maxkey/authn/RealmAuthenticationProvider.java
...in/java/org/maxkey/authn/RealmAuthenticationProvider.java
+24
-19
maxkey-core/src/main/java/org/maxkey/authn/realm/AbstractAuthenticationRealm.java
...a/org/maxkey/authn/realm/AbstractAuthenticationRealm.java
+310
-332
maxkey-core/src/main/java/org/maxkey/authn/realm/jdbc/DefaultJdbcAuthenticationRealm.java
...xkey/authn/realm/jdbc/DefaultJdbcAuthenticationRealm.java
+30
-27
maxkey-core/src/main/java/org/maxkey/authn/realm/jdbc/JdbcAuthenticationRealm.java
.../org/maxkey/authn/realm/jdbc/JdbcAuthenticationRealm.java
+10
-11
maxkey-core/src/main/java/org/maxkey/authn/support/rememberme/AbstractRemeberMeService.java
...ey/authn/support/rememberme/AbstractRemeberMeService.java
+7
-1
maxkey-core/src/main/java/org/maxkey/web/WebContext.java
maxkey-core/src/main/java/org/maxkey/web/WebContext.java
+351
-306
maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas10AuthorizeEndpoint.java
...org/maxkey/authz/cas/endpoint/Cas10AuthorizeEndpoint.java
+1
-1
maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas20AuthorizeEndpoint.java
...org/maxkey/authz/cas/endpoint/Cas20AuthorizeEndpoint.java
+1
-1
maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas30AuthorizeEndpoint.java
...org/maxkey/authz/cas/endpoint/Cas30AuthorizeEndpoint.java
+2
-2
maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/approval/controller/OAuth20AccessConfirmationController.java
...roval/controller/OAuth20AccessConfirmationController.java
+1
-1
maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/endpoint/TokenEndpointAuthenticationFilter.java
.../provider/endpoint/TokenEndpointAuthenticationFilter.java
+1
-1
maxkey-web-manage/src/main/resources/templates/views/login.ftl
...y-web-manage/src/main/resources/templates/views/login.ftl
+5
-5
maxkey-web-maxkey/src/main/resources/templates/views/login.ftl
...y-web-maxkey/src/main/resources/templates/views/login.ftl
+12
-12
未找到文件。
maxkey-core/src/main/java/org/maxkey/authn/AbstractAuthenticationProvider.java
浏览文件 @
b7db556e
...
...
@@ -20,14 +20,14 @@ import org.springframework.security.core.Authentication;
import
org.springframework.security.core.AuthenticationException
;
/**
* login Authentication abstract class
* login Authentication abstract class
.
*
* @author Crystal.Sea
*
*/
public
abstract
class
AbstractAuthenticationProvider
{
private
static
final
Logger
_logger
=
LoggerFactory
.
getLogger
(
AbstractAuthenticationProvider
.
class
);
private
static
final
Logger
_logger
=
LoggerFactory
.
getLogger
(
AbstractAuthenticationProvider
.
class
);
@Autowired
@Qualifier
(
"applicationConfig"
)
...
...
@@ -39,7 +39,7 @@ public abstract class AbstractAuthenticationProvider {
@Autowired
@Qualifier
(
"tfaOTPAuthn"
)
protected
AbstractOTPAuthn
tfaO
TP
Authn
;
protected
AbstractOTPAuthn
tfaO
pt
Authn
;
@Autowired
@Qualifier
(
"remeberMeService"
)
...
...
@@ -54,21 +54,22 @@ public abstract class AbstractAuthenticationProvider {
return
(
UsernamePasswordAuthenticationToken
.
class
.
isAssignableFrom
(
authentication
));
}
/*
* authenticate
(non-Javadoc)
/*
*
* authenticate
.
*
* @see org.springframework.security.authentication.AuthenticationProvider#
* authenticate(org.springframework.security.core.Authentication)
*/
public
Authentication
authenticate
(
Authentication
authentication
)
throws
AuthenticationException
{
_logger
.
debug
(
"Trying to authenticate user '{}' via {}"
,
authentication
.
getPrincipal
(),
getProviderName
());
public
Authentication
authenticate
(
Authentication
authentication
)
throws
AuthenticationException
{
_logger
.
debug
(
"Trying to authenticate user '{}' via {}"
,
authentication
.
getPrincipal
(),
getProviderName
());
try
{
authentication
=
doInternalAuthenticate
(
authentication
);
}
catch
(
AuthenticationException
e
)
{
e
.
printStackTrace
();
_logger
.
error
(
"Failed to authenticate user {} via {}: {}"
,
new
Object
[]
{
authentication
.
getPrincipal
(),
getProviderName
(),
e
.
getMessage
()
});
new
Object
[]
{
authentication
.
getPrincipal
(),
getProviderName
(),
e
.
getMessage
()
});
throw
e
;
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
...
...
@@ -81,39 +82,45 @@ public abstract class AbstractAuthenticationProvider {
}
// user authenticated
_logger
.
debug
(
"'{}' authenticated successfully by {}."
,
authentication
.
getPrincipal
(),
getProviderName
());
_logger
.
debug
(
"'{}' authenticated successfully by {}."
,
authentication
.
getPrincipal
(),
getProviderName
());
UserInfo
userInfo
=
WebContext
.
getUserInfo
();
Object
password_set_t
ype
=
WebContext
.
getSession
()
final
UserInfo
userInfo
=
WebContext
.
getUserInfo
();
final
Object
passwordSetT
ype
=
WebContext
.
getSession
()
.
getAttribute
(
WebConstants
.
CURRENT_LOGIN_USER_PASSWORD_SET_TYPE
);
// 登录完成后切换SESSION
_logger
.
debug
(
"Login Session {}."
,
WebContext
.
getSession
().
getId
());
WebContext
.
getSession
().
invalidate
();
WebContext
.
setAttribute
(
WebConstants
.
CURRENT_USER_SESSION_ID
,
WebContext
.
getSession
().
getId
());
WebContext
.
setAttribute
(
WebConstants
.
CURRENT_USER_SESSION_ID
,
WebContext
.
getSession
().
getId
());
_logger
.
debug
(
"Login Success Session {}."
,
WebContext
.
getSession
().
getId
());
authenticationRealm
.
insertLoginHistory
(
userInfo
,
LOGINTYPE
.
LOCAL
,
""
,
"xe00000004"
,
"success"
);
authenticationRealm
.
insertLoginHistory
(
userInfo
,
LOGINTYPE
.
LOCAL
,
""
,
"xe00000004"
,
"success"
);
// 认证设置
WebContext
.
setAuthentication
(
authentication
);
WebContext
.
setUserInfo
(
userInfo
);
WebContext
.
getSession
().
setAttribute
(
WebConstants
.
CURRENT_LOGIN_USER_PASSWORD_SET_TYPE
,
password_set_type
);
WebContext
.
getSession
().
setAttribute
(
WebConstants
.
CURRENT_LOGIN_USER_PASSWORD_SET_TYPE
,
passwordSetType
);
// create new authentication response containing the user and it's authorities
UsernamePasswordAuthenticationToken
simpleUserAuthentication
=
new
UsernamePasswordAuthenticationToken
(
userInfo
.
getUsername
(),
authentication
.
getCredentials
(),
authentication
.
getAuthorities
());
UsernamePasswordAuthenticationToken
simpleUserAuthentication
=
new
UsernamePasswordAuthenticationToken
(
userInfo
.
getUsername
(),
authentication
.
getCredentials
(),
authentication
.
getAuthorities
()
);
return
simpleUserAuthentication
;
}
/**
* session validate
* session validate
.
*
* @param j_username
* @param j_cname
* @param sessionId
* @param sessionId String
*/
protected
void
sessionValid
(
String
j_
sessionId
)
{
if
(
j_sessionId
==
null
||
!
j_
sessionId
.
equals
(
WebContext
.
getSession
().
getId
()))
{
protected
void
sessionValid
(
String
sessionId
)
{
if
(
sessionId
==
null
||
!
sessionId
.
equals
(
WebContext
.
getSession
().
getId
()))
{
String
message
=
WebContext
.
getI18nValue
(
"login.error.session"
);
_logger
.
debug
(
"login session valid error."
);
throw
new
BadCredentialsException
(
message
);
...
...
@@ -121,15 +128,13 @@ public abstract class AbstractAuthenticationProvider {
}
/**
* session validate
* session validate
.
*
* @param j_username
* @param j_cname
* @param sessionId
* @param jwtToken String
*/
protected
void
jwtTokenValid
(
String
j
_j
wtToken
)
{
protected
void
jwtTokenValid
(
String
jwtToken
)
{
/*
* if(j
_jwtToken!=null && ! j_
jwtToken.equals("")){
* if(j
wtToken!=null && !
jwtToken.equals("")){
* if(jwtLoginService.jwtTokenValidation(j_jwtToken)){ return; } }
*/
String
message
=
WebContext
.
getI18nValue
(
"login.error.session"
);
...
...
@@ -137,8 +142,8 @@ public abstract class AbstractAuthenticationProvider {
throw
new
BadCredentialsException
(
message
);
}
protected
void
authTypeValid
(
String
j_auth_t
ype
)
{
if
(
j_auth_t
ype
==
null
)
{
protected
void
authTypeValid
(
String
authT
ype
)
{
if
(
authT
ype
==
null
)
{
String
message
=
WebContext
.
getI18nValue
(
"login.error.authtype"
);
_logger
.
debug
(
"login AuthN type can not been null ."
);
throw
new
BadCredentialsException
(
message
);
...
...
@@ -146,19 +151,21 @@ public abstract class AbstractAuthenticationProvider {
}
/**
* captcha validate
* captcha validate
.
*
* @param j_username
* @param j_cname
* @param captcha
* @param authType String
* @param captcha String
*/
protected
void
captchaValid
(
String
j_captcha
,
String
j_auth_type
)
{
if
(
applicationConfig
.
getLoginConfig
().
isCaptcha
())
{
// for basic
if
(
j_auth_type
.
equalsIgnoreCase
(
"common"
))
{
protected
void
captchaValid
(
String
captcha
,
String
authType
)
{
if
(
applicationConfig
.
getLoginConfig
().
isCaptcha
())
{
// for basic
if
(
authType
.
equalsIgnoreCase
(
"common"
))
{
_logger
.
info
(
"captcha : "
+
WebContext
.
getSession
().
getAttribute
(
WebConstants
.
KAPTCHA_SESSION_KEY
).
toString
());
if
(
j_captcha
==
null
||
!
j_captcha
.
equals
(
WebContext
.
getSession
().
getAttribute
(
WebConstants
.
KAPTCHA_SESSION_KEY
).
toString
()))
{
+
WebContext
.
getSession
().
getAttribute
(
WebConstants
.
KAPTCHA_SESSION_KEY
).
toString
());
if
(
captcha
==
null
||
!
captcha
.
equals
(
WebContext
.
getSession
().
getAttribute
(
WebConstants
.
KAPTCHA_SESSION_KEY
).
toString
()))
{
String
message
=
WebContext
.
getI18nValue
(
"login.error.captcha"
);
_logger
.
debug
(
"login captcha valid error."
);
throw
new
BadCredentialsException
(
message
);
...
...
@@ -168,22 +175,24 @@ public abstract class AbstractAuthenticationProvider {
}
/**
* captcha validate
* captcha validate
.
*
* @param
j_username
* @param
j_cname
* @param
j_otp_captcha
* @param
otpCaptcha String
* @param
authType String
* @param
userInfo UserInfo
*/
protected
void
tftcaptchaValid
(
String
j_otp_captcha
,
String
j_auth_type
,
UserInfo
userInfo
)
{
if
(
applicationConfig
.
getLoginConfig
().
isOneTimePwd
())
{
// for one time password 2 factor
if
(
j_auth_type
.
equalsIgnoreCase
(
"tfa"
))
{
protected
void
tftcaptchaValid
(
String
otpCaptcha
,
String
authType
,
UserInfo
userInfo
)
{
// for one time password 2 factor
if
(
applicationConfig
.
getLoginConfig
().
isOneTimePwd
())
{
if
(
authType
.
equalsIgnoreCase
(
"tfa"
))
{
UserInfo
validUserInfo
=
new
UserInfo
();
validUserInfo
.
setUsername
(
userInfo
.
getUsername
());
String
sharedSecret
=
PasswordReciprocal
.
getInstance
().
decoder
(
userInfo
.
getSharedSecret
());
String
sharedSecret
=
PasswordReciprocal
.
getInstance
().
decoder
(
userInfo
.
getSharedSecret
());
validUserInfo
.
setSharedSecret
(
sharedSecret
);
validUserInfo
.
setSharedCounter
(
userInfo
.
getSharedCounter
());
validUserInfo
.
setId
(
userInfo
.
getId
());
if
(
j_otp_captcha
==
null
||
!
tfaOTPAuthn
.
validate
(
validUserInfo
,
j_otp_c
aptcha
))
{
if
(
otpCaptcha
==
null
||
!
tfaOptAuthn
.
validate
(
validUserInfo
,
otpC
aptcha
))
{
String
message
=
WebContext
.
getI18nValue
(
"login.error.captcha"
);
_logger
.
debug
(
"login captcha valid error."
);
throw
new
BadCredentialsException
(
message
);
...
...
@@ -195,14 +204,14 @@ public abstract class AbstractAuthenticationProvider {
/**
* login user by j_username and j_cname first query user by j_cname if first
* step userinfo is null,query user from system
* step userinfo is null,query user from system
.
*
* @param
j_username
* @param
j_cname
* @param
username String
* @param
password String
* @return
*/
protected
UserInfo
loadUserInfo
(
String
j_username
,
String
j_
password
)
{
UserInfo
userInfo
=
authenticationRealm
.
loadUserInfo
(
j_username
,
j_
password
);
protected
UserInfo
loadUserInfo
(
String
username
,
String
password
)
{
UserInfo
userInfo
=
authenticationRealm
.
loadUserInfo
(
username
,
password
);
if
(
userInfo
!=
null
)
{
if
(
userInfo
.
getUserType
()
==
"SYSTEM"
)
{
...
...
@@ -216,50 +225,49 @@ public abstract class AbstractAuthenticationProvider {
}
/**
* check input password empty
* check input password empty
.
*
* @param password
* @param password
String
* @return
*/
protected
boolean
emptyPasswordValid
(
String
j_
password
)
{
if
(
null
==
j_password
||
""
.
equals
(
j_
password
))
{
protected
boolean
emptyPasswordValid
(
String
password
)
{
if
(
null
==
password
||
""
.
equals
(
password
))
{
throw
new
BadCredentialsException
(
WebContext
.
getI18nValue
(
"login.error.password.null"
));
}
return
true
;
}
/**
* check input username or password empty
* check input username or password empty
.
*
* @param j_username
* @param password
* @param email String
* @return
*/
protected
boolean
emptyEmailValid
(
String
j_
email
)
{
if
(
null
==
j_email
||
""
.
equals
(
j_
email
))
{
protected
boolean
emptyEmailValid
(
String
email
)
{
if
(
null
==
email
||
""
.
equals
(
email
))
{
throw
new
BadCredentialsException
(
"login.error.email.null"
);
}
return
true
;
}
/**
* check input username empty
* check input username empty
.
*
* @param
j_username
* @param
username String
* @return
*/
protected
boolean
emptyUsernameValid
(
String
j_
username
)
{
if
(
null
==
j_username
||
""
.
equals
(
j_
username
))
{
protected
boolean
emptyUsernameValid
(
String
username
)
{
if
(
null
==
username
||
""
.
equals
(
username
))
{
throw
new
BadCredentialsException
(
WebContext
.
getI18nValue
(
"login.error.username.null"
));
}
return
true
;
}
protected
boolean
userinfoValid
(
UserInfo
userInfo
,
String
j_
username
)
{
protected
boolean
userinfoValid
(
UserInfo
userInfo
,
String
username
)
{
if
(
null
==
userInfo
)
{
String
message
=
WebContext
.
getI18nValue
(
"login.error.username"
);
_logger
.
debug
(
"login user "
+
j_
username
+
" not in this System ."
+
message
);
UserInfo
loginUser
=
new
UserInfo
(
j_
username
);
_logger
.
debug
(
"login user "
+
username
+
" not in this System ."
+
message
);
UserInfo
loginUser
=
new
UserInfo
(
username
);
loginUser
.
setId
(
loginUser
.
generateId
());
loginUser
.
setDisplayName
(
"not exist"
);
loginUser
.
setLoginCount
(
0
);
...
...
maxkey-core/src/main/java/org/maxkey/authn/BasicAuthentication.java
浏览文件 @
b7db556e
...
...
@@ -6,22 +6,23 @@ import org.springframework.security.core.Authentication;
import
org.springframework.security.core.GrantedAuthority
;
import
org.springframework.security.core.authority.SimpleGrantedAuthority
;
public
class
BasicAuthentication
implements
Authentication
{
/**
*
*/
private
static
final
long
serialVersionUID
=
-
110742975439268030L
;
String
j_
username
;
String
j_
password
;
String
j_sessioni
d
;
String
j_
captcha
;
String
j_otp_c
aptcha
;
String
j_remeberm
e
;
String
j_auth_t
ype
;
String
j
_jwt_t
oken
;
String
username
;
String
password
;
String
sessionI
d
;
String
captcha
;
String
otpC
aptcha
;
String
remeberM
e
;
String
authT
ype
;
String
j
wtT
oken
;
ArrayList
<
GrantedAuthority
>
grantedAuthority
;
boolean
authenticated
;
/**
* BasicAuthentication.
*/
public
BasicAuthentication
()
{
grantedAuthority
=
new
ArrayList
<
GrantedAuthority
>();
grantedAuthority
.
add
(
new
SimpleGrantedAuthority
(
"ROLE_USER"
));
...
...
@@ -40,7 +41,7 @@ public class BasicAuthentication implements Authentication {
@Override
public
Object
getCredentials
()
{
return
this
.
get
J_p
assword
();
return
this
.
get
P
assword
();
}
@Override
...
...
@@ -50,7 +51,7 @@ public class BasicAuthentication implements Authentication {
@Override
public
Object
getPrincipal
()
{
return
this
.
get
J_u
sername
();
return
this
.
get
U
sername
();
}
@Override
...
...
@@ -64,76 +65,69 @@ public class BasicAuthentication implements Authentication {
}
public
String
getJ_username
()
{
return
j_username
;
}
public
String
getUsername
()
{
return
j_username
;
}
public
void
setJ_username
(
String
j_username
)
{
this
.
j_username
=
j_username
;
return
username
;
}
public
String
getJ_password
(
)
{
return
j_password
;
public
void
setUsername
(
String
username
)
{
this
.
username
=
username
;
}
public
void
setJ_password
(
String
j_password
)
{
this
.
j_password
=
j_
password
;
public
String
getPassword
(
)
{
return
password
;
}
public
String
getJ_sessionid
(
)
{
return
j_sessioni
d
;
public
void
setPassword
(
String
password
)
{
this
.
password
=
passwor
d
;
}
public
String
getSession
i
d
()
{
return
j_sessioni
d
;
public
String
getSession
I
d
()
{
return
sessionI
d
;
}
public
void
set
J_sessionid
(
String
j_sessioni
d
)
{
this
.
j_sessionid
=
j_sessioni
d
;
public
void
set
SessionId
(
String
sessionI
d
)
{
this
.
sessionId
=
sessionI
d
;
}
public
String
get
J_c
aptcha
()
{
return
j_
captcha
;
public
String
get
C
aptcha
()
{
return
captcha
;
}
public
void
set
J_captcha
(
String
j_
captcha
)
{
this
.
j_captcha
=
j_
captcha
;
public
void
set
Captcha
(
String
captcha
)
{
this
.
captcha
=
captcha
;
}
public
String
get
J_otp_c
aptcha
()
{
return
j_otp_c
aptcha
;
public
String
get
OtpC
aptcha
()
{
return
otpC
aptcha
;
}
public
void
set
J_otp_captcha
(
String
j_otp_c
aptcha
)
{
this
.
j_otp_captcha
=
j_otp_c
aptcha
;
public
void
set
OtpCaptcha
(
String
otpC
aptcha
)
{
this
.
otpCaptcha
=
otpC
aptcha
;
}
public
String
get
J_remeberm
e
()
{
return
j_remeberm
e
;
public
String
get
RemeberM
e
()
{
return
remeberM
e
;
}
public
void
set
J_remeberme
(
String
j_remeberm
e
)
{
this
.
j_remeberme
=
j_remeberm
e
;
public
void
set
RemeberMe
(
String
remeberM
e
)
{
this
.
remeberMe
=
remeberM
e
;
}
public
String
get
J_auth_t
ype
()
{
return
j_auth_t
ype
;
public
String
get
AuthT
ype
()
{
return
authT
ype
;
}
public
void
set
J_auth_type
(
String
j_auth_t
ype
)
{
this
.
j_auth_type
=
j_auth_t
ype
;
public
void
set
AuthType
(
String
authT
ype
)
{
this
.
authType
=
authT
ype
;
}
public
String
getJ
_jwt_t
oken
()
{
return
j
_jwt_t
oken
;
public
String
getJ
wtT
oken
()
{
return
j
wtT
oken
;
}
public
void
setJ
_jwt_token
(
String
j_jwt_t
oken
)
{
this
.
j
_jwt_token
=
j_jwt_t
oken
;
public
void
setJ
wtToken
(
String
jwtT
oken
)
{
this
.
j
wtToken
=
jwtT
oken
;
}
public
ArrayList
<
GrantedAuthority
>
getGrantedAuthority
()
{
...
...
@@ -146,9 +140,18 @@ public class BasicAuthentication implements Authentication {
@Override
public
String
toString
()
{
return
"BasicAuthentication [j_username="
+
j_username
+
", j_sessionId="
+
j_sessionid
+
", j_captcha="
+
j_captcha
+
", j_otp_captcha="
+
j_otp_captcha
+
", j_remeberMe="
+
j_remeberme
+
", j_auth_type="
+
j_auth_type
+
", j_jwtToken="
+
j_jwt_token
+
", authenticated="
+
authenticated
+
"]"
;
StringBuilder
builder
=
new
StringBuilder
();
builder
.
append
(
"BasicAuthentication [username="
).
append
(
username
)
.
append
(
", password="
).
append
(
password
)
.
append
(
", sessionId="
).
append
(
sessionId
)
.
append
(
", captcha="
).
append
(
captcha
)
.
append
(
", otpCaptcha="
).
append
(
otpCaptcha
)
.
append
(
", remeberMe="
).
append
(
remeberMe
)
.
append
(
", authType="
).
append
(
authType
)
.
append
(
", jwtToken="
).
append
(
jwtToken
)
.
append
(
", grantedAuthority="
).
append
(
grantedAuthority
)
.
append
(
", authenticated="
).
append
(
authenticated
)
.
append
(
"]"
);
return
builder
.
toString
();
}
}
maxkey-core/src/main/java/org/maxkey/authn/RealmAuthenticationProvider.java
浏览文件 @
b7db556e
...
...
@@ -13,13 +13,13 @@ import org.springframework.web.context.request.ServletRequestAttributes;
/**
* database Authentication provider
* database Authentication provider
.
* @author Crystal.Sea
*
*/
public
class
RealmAuthenticationProvider
extends
AbstractAuthenticationProvider
{
private
static
final
Logger
_logger
=
LoggerFactory
.
getLogger
(
RealmAuthenticationProvider
.
class
);
private
static
final
Logger
_logger
=
LoggerFactory
.
getLogger
(
RealmAuthenticationProvider
.
class
);
protected
String
getProviderName
()
{
return
"RealmAuthenticationProvider"
;
...
...
@@ -31,53 +31,58 @@ public class RealmAuthenticationProvider extends AbstractAuthenticationProvider
_logger
.
debug
(
"authentication "
+
auth
);
sessionValid
(
auth
.
get
J_sessioni
d
());
sessionValid
(
auth
.
get
SessionI
d
());
//jwtTokenValid(j_jwtToken);
authTypeValid
(
auth
.
get
J_auth_t
ype
());
authTypeValid
(
auth
.
get
AuthT
ype
());
captchaValid
(
auth
.
get
J_captcha
(),
auth
.
getJ_auth_t
ype
());
captchaValid
(
auth
.
get
Captcha
(),
auth
.
getAuthT
ype
());
emptyPasswordValid
(
auth
.
get
J_p
assword
());
emptyPasswordValid
(
auth
.
get
P
assword
());
UserInfo
userInfo
=
null
;
emptyUsernameValid
(
auth
.
get
J_u
sername
());
emptyUsernameValid
(
auth
.
get
U
sername
());
userInfo
=
loadUserInfo
(
auth
.
getJ_username
(),
auth
.
getJ_p
assword
());
userInfo
=
loadUserInfo
(
auth
.
getUsername
(),
auth
.
getP
assword
());
userinfoValid
(
userInfo
,
auth
.
get
J_p
assword
());
userinfoValid
(
userInfo
,
auth
.
get
P
assword
());
tftcaptchaValid
(
auth
.
get
J_otp_captcha
(),
auth
.
getJ_auth_t
ype
(),
userInfo
);
tftcaptchaValid
(
auth
.
get
OtpCaptcha
(),
auth
.
getAuthT
ype
(),
userInfo
);
authenticationRealm
.
passwordPolicyValid
(
userInfo
);
authenticationRealm
.
passwordMatches
(
userInfo
,
auth
.
get
J_p
assword
());
authenticationRealm
.
passwordMatches
(
userInfo
,
auth
.
get
P
assword
());
authenticationRealm
.
grantAuthority
(
userInfo
);
/*
*
/*
* put userInfo to current session context
*/
WebContext
.
setUserInfo
(
userInfo
);
auth
.
setAuthenticated
(
true
);
if
(
auth
.
isAuthenticated
()&&
applicationConfig
.
getLoginConfig
().
isRemeberMe
()){
if
(
auth
.
getJ_remeberme
()!=
null
&&
auth
.
getJ_remeberme
().
equals
(
"remeberMe"
)){
WebContext
.
getSession
().
setAttribute
(
WebConstants
.
REMEBER_ME_SESSION
,
auth
.
getJ_username
());
if
(
auth
.
isAuthenticated
()
&&
applicationConfig
.
getLoginConfig
().
isRemeberMe
())
{
if
(
auth
.
getRemeberMe
()
!=
null
&&
auth
.
getRemeberMe
().
equals
(
"remeberMe"
))
{
WebContext
.
getSession
().
setAttribute
(
WebConstants
.
REMEBER_ME_SESSION
,
auth
.
getUsername
());
_logger
.
debug
(
"do Remeber Me"
);
remeberMeService
.
createRemeberMe
(
userInfo
.
getUsername
(),
WebContext
.
getRequest
(),
((
ServletRequestAttributes
)
RequestContextHolder
.
getRequestAttributes
()).
getResponse
());
((
ServletRequestAttributes
)
RequestContextHolder
.
getRequestAttributes
())
.
getResponse
()
);
}
}
UsernamePasswordAuthenticationToken
usernamePasswordAuthenticationToken
=
new
UsernamePasswordAuthenticationToken
(
UsernamePasswordAuthenticationToken
usernamePasswordAuthenticationToken
=
new
UsernamePasswordAuthenticationToken
(
auth
,
"PASSWORD"
,
authenticationRealm
.
grantAuthority
(
userInfo
));
usernamePasswordAuthenticationToken
.
setDetails
(
new
WebAuthenticationDetails
(
WebContext
.
getRequest
()));
usernamePasswordAuthenticationToken
.
setDetails
(
new
WebAuthenticationDetails
(
WebContext
.
getRequest
()));
return
usernamePasswordAuthenticationToken
;
}
...
...
maxkey-core/src/main/java/org/maxkey/authn/realm/AbstractAuthenticationRealm.java
浏览文件 @
b7db556e
此差异已折叠。
点击以展开。
maxkey-core/src/main/java/org/maxkey/authn/realm/jdbc/DefaultJdbcAuthenticationRealm.java
浏览文件 @
b7db556e
...
...
@@ -11,38 +11,41 @@ import org.springframework.jdbc.core.JdbcTemplate;
import
org.springframework.security.authentication.BadCredentialsException
;
import
org.springframework.security.crypto.password.PasswordEncoder
;
/**
* same as JdbcAuthenticationRealm
* same as JdbcAuthenticationRealm.
*
* @author Crystal.Sea
*
*/
public
class
DefaultJdbcAuthenticationRealm
extends
AbstractAuthenticationRealm
{
private
static
Logger
_logger
=
LoggerFactory
.
getLogger
(
DefaultJdbcAuthenticationRealm
.
class
);
@Autowired
private
PasswordEncoder
passwordEncoder
;
public
class
DefaultJdbcAuthenticationRealm
extends
AbstractAuthenticationRealm
{
private
static
Logger
_logger
=
LoggerFactory
.
getLogger
(
DefaultJdbcAuthenticationRealm
.
class
);
@Autowired
private
PasswordEncoder
passwordEncoder
;
public
DefaultJdbcAuthenticationRealm
()
{
}
public
DefaultJdbcAuthenticationRealm
(
JdbcTemplate
jdbcTemplate
)
{
this
.
jdbcTemplate
=
jdbcTemplate
;
}
public
DefaultJdbcAuthenticationRealm
()
{
}
public
boolean
passwordMatches
(
UserInfo
userInfo
,
String
j_password
)
{
boolean
passwordMatches
=
false
;
_logger
.
info
(
"password : "
+
PasswordReciprocal
.
getInstance
().
rawPassword
(
userInfo
.
getUsername
(),
j_password
));
passwordMatches
=
passwordEncoder
.
matches
(
PasswordReciprocal
.
getInstance
().
rawPassword
(
userInfo
.
getUsername
(),
j_password
),
userInfo
.
getPassword
());
_logger
.
debug
(
"passwordvalid : "
+
passwordMatches
);
if
(!
passwordMatches
){
setBadPasswordCount
(
userInfo
);
throw
new
BadCredentialsException
(
WebContext
.
getI18nValue
(
"login.error.password"
));
}
return
passwordMatches
;
}
public
DefaultJdbcAuthenticationRealm
(
JdbcTemplate
jdbcTemplate
)
{
this
.
jdbcTemplate
=
jdbcTemplate
;
}
/**
* passwordMatches.
*/
public
boolean
passwordMatches
(
UserInfo
userInfo
,
String
password
)
{
boolean
passwordMatches
=
false
;
_logger
.
info
(
"password : "
+
PasswordReciprocal
.
getInstance
().
rawPassword
(
userInfo
.
getUsername
(),
password
));
passwordMatches
=
passwordEncoder
.
matches
(
PasswordReciprocal
.
getInstance
().
rawPassword
(
userInfo
.
getUsername
(),
password
),
userInfo
.
getPassword
());
_logger
.
debug
(
"passwordvalid : "
+
passwordMatches
);
if
(!
passwordMatches
)
{
setBadPasswordCount
(
userInfo
);
throw
new
BadCredentialsException
(
WebContext
.
getI18nValue
(
"login.error.password"
));
}
return
passwordMatches
;
}
}
maxkey-core/src/main/java/org/maxkey/authn/realm/jdbc/JdbcAuthenticationRealm.java
浏览文件 @
b7db556e
...
...
@@ -4,21 +4,20 @@ import org.slf4j.Logger;
import
org.slf4j.LoggerFactory
;
import
org.springframework.jdbc.core.JdbcTemplate
;
/**
* JdbcAuthenticationRealm.
* @author Crystal.Sea
*
*/
public
class
JdbcAuthenticationRealm
extends
DefaultJdbcAuthenticationRealm
{
private
static
Logger
_logger
=
LoggerFactory
.
getLogger
(
JdbcAuthenticationRealm
.
class
);
public
class
JdbcAuthenticationRealm
extends
DefaultJdbcAuthenticationRealm
{
private
static
Logger
_logger
=
LoggerFactory
.
getLogger
(
JdbcAuthenticationRealm
.
class
);
public
JdbcAuthenticationRealm
()
{
_logger
.
debug
(
"init . "
);
}
public
JdbcAuthenticationRealm
()
{
_logger
.
debug
(
"init . "
);
}
public
JdbcAuthenticationRealm
(
JdbcTemplate
jdbcTemplate
)
{
this
.
jdbcTemplate
=
jdbcTemplate
;
}
public
JdbcAuthenticationRealm
(
JdbcTemplate
jdbcTemplate
)
{
this
.
jdbcTemplate
=
jdbcTemplate
;
}
}
maxkey-core/src/main/java/org/maxkey/authn/support/rememberme/AbstractRemeberMeService.java
浏览文件 @
b7db556e
...
...
@@ -94,7 +94,13 @@ public abstract class AbstractRemeberMeService {
DateTime
expiryDate
=
loginDate
.
plusSeconds
(
getRemeberMeValidity
());
DateTime
now
=
new
DateTime
();
if
(
now
.
isBefore
(
expiryDate
))
{
if
(
WebContext
.
setAuthentication
(
storeRemeberMe
.
getUsername
(),
LOGINTYPE
.
REMEBER_ME
,
""
,
""
,
"success"
))
{
if
(
WebContext
.
setAuthentication
(
storeRemeberMe
.
getUsername
(),
LOGINTYPE
.
REMEBER_ME
,
""
,
""
,
"success"
)
)
{
return
updateRemeberMe
(
remeberMeCookie
,
response
);
}
}
...
...
maxkey-core/src/main/java/org/maxkey/web/WebContext.java
浏览文件 @
b7db556e
此差异已折叠。
点击以展开。
maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas10AuthorizeEndpoint.java
浏览文件 @
b7db556e
...
...
@@ -90,7 +90,7 @@ renew [OPTIONAL] - if this parameter is set, ticket validation will only succeed
}
if
(
storedTicket
!=
null
){
String
principal
=((
BasicAuthentication
)
storedTicket
.
getAuthentication
().
getPrincipal
()).
get
J_u
sername
();
String
principal
=((
BasicAuthentication
)
storedTicket
.
getAuthentication
().
getPrincipal
()).
get
U
sername
();
_logger
.
debug
(
"principal "
+
principal
);
return
new
Service10ResponseBuilder
().
success
()
.
setUser
(
principal
)
...
...
maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas20AuthorizeEndpoint.java
浏览文件 @
b7db556e
...
...
@@ -190,7 +190,7 @@ For all error codes, it is RECOMMENDED that CAS provide a more detailed message
ServiceResponseBuilder
serviceResponseBuilder
=
new
ServiceResponseBuilder
();
if
(
storedTicket
!=
null
){
String
principal
=((
BasicAuthentication
)
storedTicket
.
getAuthentication
().
getPrincipal
()).
get
J_u
sername
();
String
principal
=((
BasicAuthentication
)
storedTicket
.
getAuthentication
().
getPrincipal
()).
get
U
sername
();
_logger
.
debug
(
"principal "
+
principal
);
serviceResponseBuilder
.
success
().
setUser
(
principal
);
...
...
maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas30AuthorizeEndpoint.java
浏览文件 @
b7db556e
...
...
@@ -71,7 +71,7 @@ public class Cas30AuthorizeEndpoint extends AuthorizeBaseEndpoint{
ServiceResponseBuilder
serviceResponseBuilder
=
new
ServiceResponseBuilder
();
if
(
storedTicket
!=
null
){
String
principal
=((
BasicAuthentication
)
storedTicket
.
getAuthentication
().
getPrincipal
()).
get
J_u
sername
();
String
principal
=((
BasicAuthentication
)
storedTicket
.
getAuthentication
().
getPrincipal
()).
get
U
sername
();
serviceResponseBuilder
.
success
().
setUser
(
principal
);
if
(
BOOLEAN
.
isTrue
(
storedTicket
.
getCasDetails
().
getIsAdapter
())){
...
...
@@ -111,7 +111,7 @@ public class Cas30AuthorizeEndpoint extends AuthorizeBaseEndpoint{
ServiceResponseBuilder
serviceResponseBuilder
=
new
ServiceResponseBuilder
();
if
(
storedTicket
!=
null
){
String
principal
=((
BasicAuthentication
)
storedTicket
.
getAuthentication
().
getPrincipal
()).
get
J_u
sername
();
String
principal
=((
BasicAuthentication
)
storedTicket
.
getAuthentication
().
getPrincipal
()).
get
U
sername
();
serviceResponseBuilder
.
success
().
setUser
(
principal
);
if
(
BOOLEAN
.
isTrue
(
storedTicket
.
getCasDetails
().
getIsAdapter
())){
...
...
maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/approval/controller/OAuth20AccessConfirmationController.java
浏览文件 @
b7db556e
...
...
@@ -52,7 +52,7 @@ public class OAuth20AccessConfirmationController {
for
(
Object
key:
model
.
keySet
()){
modelRequest
.
put
(
key
.
toString
(),
model
.
get
(
key
).
toString
());
}
String
principal
=((
BasicAuthentication
)
WebContext
.
getAuthentication
().
getPrincipal
()).
get
J_u
sername
();
String
principal
=((
BasicAuthentication
)
WebContext
.
getAuthentication
().
getPrincipal
()).
get
U
sername
();
//Map<String, Object> model
AuthorizationRequest
clientAuth
=
(
AuthorizationRequest
)
WebContext
.
getAttribute
(
"authorizationRequest"
);
ClientDetails
client
=
clientDetailsService
.
loadClientByClientId
(
clientAuth
.
getClientId
());
...
...
maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/endpoint/TokenEndpointAuthenticationFilter.java
浏览文件 @
b7db556e
...
...
@@ -132,7 +132,7 @@ public class TokenEndpointAuthenticationFilter implements Filter {
}
else
{
Authentication
authentication
=
ClientCredentials
(
request
,
response
);
BasicAuthentication
auth
=
new
BasicAuthentication
();
auth
.
set
J_u
sername
(((
User
)
authentication
.
getPrincipal
()).
getUsername
());
auth
.
set
U
sername
(((
User
)
authentication
.
getPrincipal
()).
getUsername
());
auth
.
setAuthenticated
(
true
);
UsernamePasswordAuthenticationToken
simpleUserAuthentication
=
new
UsernamePasswordAuthenticationToken
(
auth
,
authentication
.
getCredentials
(),
authentication
.
getAuthorities
());
WebContext
.
setAuthentication
(
simpleUserAuthentication
);
...
...
maxkey-web-manage/src/main/resources/templates/views/login.ftl
浏览文件 @
b7db556e
...
...
@@ -29,19 +29,19 @@
<form
class=
"form-horizontal m-t-20"
id=
"loginForm"
name=
"loginForm"
action=
"<@base />/logon.do"
method=
"post"
>
<div
class=
"form-group"
>
<span
class=
"input-group-addon"
><i
class=
"fa fa-user"
></i></span>
<input
id=
'j_username'
name=
'
j_
username'
value=
"admin"
class=
"form-control"
type=
"text"
required=
""
placeholder=
"<@locale code="
login.text.username
"
/>
">
<input
id=
'j_username'
name=
'username'
value=
"admin"
class=
"form-control"
type=
"text"
required=
""
placeholder=
"<@locale code="
login.text.username
"
/>
">
</div>
<div
class=
"form-group"
>
<span
class=
"input-group-addon"
><i
class=
"fa fa-key"
></i></span>
<input
id=
'j_password'
name=
'
j_
password'
class=
"form-control"
type=
"password"
required=
""
placeholder=
"<@locale code="
login.text.password
"
/>
">
<input
id=
'j_password'
name=
'password'
class=
"form-control"
type=
"password"
required=
""
placeholder=
"<@locale code="
login.text.password
"
/>
">
</div>
<div
class=
"form-group"
>
<input
id=
"j_captcha"
name=
"
j_
captcha"
class=
"form-control"
value=
""
type=
"text"
required=
""
placeholder=
"<@locale code="
login.text.captcha
"
/>
">
<input
id=
"j_captcha"
name=
"captcha"
class=
"form-control"
value=
""
type=
"text"
required=
""
placeholder=
"<@locale code="
login.text.captcha
"
/>
">
<img
id=
"j_captchaimg"
src=
"<@base/>/captcha"
/>
</div>
<div
class=
"form-group text-center m-t-20"
>
<input
type=
"hidden"
name=
"
j_auth_t
ype"
value=
"basic"
/>
<input
type=
'hidden'
id=
"sessionid"
name=
"
j_sessioni
d"
value=
"${sessionid}"
/>
<input
type=
"hidden"
name=
"
authT
ype"
value=
"basic"
/>
<input
type=
'hidden'
id=
"sessionid"
name=
"
sessionI
d"
value=
"${sessionid}"
/>
<button
id=
"loginSubmit"
class=
"button btn-primary btn btn-common btn-block"
type=
"submit"
>
<
@
locale
code=
"login.button.login"
/>
</button>
...
...
maxkey-web-maxkey/src/main/resources/templates/views/login.ftl
浏览文件 @
b7db556e
...
...
@@ -186,20 +186,20 @@ $(function(){
<td>
<div
id=
"div_commonLogin"
>
<form
id=
"loginForm"
name=
"loginForm"
action=
"<@base />/logon.do"
method=
"post"
>
<input
type=
"hidden"
name=
"
j_auth_t
ype"
value=
"basic"
/>
<input
type=
"hidden"
name=
"
authT
ype"
value=
"basic"
/>
<table
class=
"table login_form_table"
>
<tr>
<td><
@
locale
code=
"login.text.username"
/>
:
</td>
<td><input
class=
"form-control"
type=
'text'
id=
'j_username'
name=
'
j_
username'
value=
"admin"
tabindex=
"1"
/></td>
<td><input
class=
"form-control"
type=
'text'
id=
'j_username'
name=
'username'
value=
"admin"
tabindex=
"1"
/></td>
</tr>
<tr>
<td><
@
locale
code=
"login.text.password"
/>
:
</td>
<td><input
class=
"form-control"
type=
'password'
id=
'j_password'
name=
'
j_
password'
value=
"admin"
tabindex=
"2"
/></td>
<td><input
class=
"form-control"
type=
'password'
id=
'j_password'
name=
'password'
value=
"admin"
tabindex=
"2"
/></td>
</tr>
<
#if
true=
=isCaptcha
>
<tr>
<td><
@
locale
code=
"login.text.captcha"
/>
:
</td>
<td><input
class=
"form-control"
type=
'text'
id=
"j_captcha"
name=
"
j_
captcha"
tabindex=
"3"
value=
""
style=
"float: left;"
/><img
id=
"j_captchaimg"
src=
"<@base/>/captcha"
/></td>
<td><input
class=
"form-control"
type=
'text'
id=
"j_captcha"
name=
"captcha"
tabindex=
"3"
value=
""
style=
"float: left;"
/><img
id=
"j_captchaimg"
src=
"<@base/>/captcha"
/></td>
</tr>
</
#
if>
...
...
@@ -210,7 +210,7 @@ $(function(){
<tr>
<td
style=
"width:50%"
>
<span
class=
"form_checkbox_label"
>
<input
type=
'checkbox'
id=
"remeberMe"
name=
"
j_remeberm
e"
class=
"checkbox"
tabindex=
"4"
value=
"remeberMe"
/>
<input
type=
'checkbox'
id=
"remeberMe"
name=
"
remeberM
e"
class=
"checkbox"
tabindex=
"4"
value=
"remeberMe"
/>
<
@
locale
code=
"login.text.remeberme"
/>
</span>
</td>
...
...
@@ -222,7 +222,7 @@ $(function(){
</
#
if>
<tr
style=
"display:none"
>
<td>
sessionid:
</td>
<td><input
class=
"form-control"
type=
'text'
id=
"
sessionid"
name=
"j_sessioni
d"
value=
"${sessionid}"
/></td>
<td><input
class=
"form-control"
type=
'text'
id=
"
j_sessionid"
name=
"sessionI
d"
value=
"${sessionid}"
/></td>
</tr>
<tr
>
...
...
@@ -235,15 +235,15 @@ $(function(){
</div>
<div
id=
"div_tfaLogin"
>
<form
id=
"tfaLoginForm"
name=
"tfaLoginForm"
action=
"<@base />/logon.do"
method=
"post"
>
<input
type=
"hidden"
name=
"
j_auth_t
ype"
value=
"tfa"
/>
<input
type=
"hidden"
name=
"
authT
ype"
value=
"tfa"
/>
<table
class=
"login_form_table"
>
<tr>
<td><
@
locale
code=
"login.text.username"
/>
:
</td>
<td><input
class=
"form-control"
type=
'text'
id=
'tfa_j_username'
name=
'
j_
username'
value=
""
tabindex=
"1"
/></td>
<td><input
class=
"form-control"
type=
'text'
id=
'tfa_j_username'
name=
'username'
value=
""
tabindex=
"1"
/></td>
</tr>
<tr>
<td><
@
locale
code=
"login.text.password"
/>
:
</td>
<td><input
class=
"form-control"
type=
'password'
id=
'tfa_j_password'
name=
'
j_
password'
value=
""
tabindex=
"2"
/></td>
<td><input
class=
"form-control"
type=
'password'
id=
'tfa_j_password'
name=
'password'
value=
""
tabindex=
"2"
/></td>
</tr>
<
#if
true=
=isOneTimePwd
>
<tr>
...
...
@@ -255,7 +255,7 @@ $(function(){
<tr>
<td><
@
locale
code=
"login.text.captcha"
/>
:
</td>
<td>
<input
class=
"form-control"
type=
'text'
id=
"tfa_j_otp_captcha"
name=
"
j_otp_c
aptcha"
tabindex=
"3"
value=
""
style=
"float: left;"
/>
<input
class=
"form-control"
type=
'text'
id=
"tfa_j_otp_captcha"
name=
"
otpC
aptcha"
tabindex=
"3"
value=
""
style=
"float: left;"
/>
<input
class=
"form-control"
id=
"tfa_j_otp_captcha_button"
type=
"button"
tabindex=
"5"
class=
"button"
value=
"获取动态验证码"
/>
</td>
...
...
@@ -274,7 +274,7 @@ $(function(){
<tr>
<td
style=
"width:50%"
>
<span
class=
"form_checkbox_label"
>
<input
type=
'checkbox'
id=
"tfa_remeberMe"
name=
"
j_remeberm
e"
class=
"checkbox"
tabindex=
"4"
value=
"remeberMe"
/>
<input
type=
'checkbox'
id=
"tfa_remeberMe"
name=
"
remeberM
e"
class=
"checkbox"
tabindex=
"4"
value=
"remeberMe"
/>
<
@
locale
code=
"login.text.remeberme"
/>
</span>
</td>
...
...
@@ -286,7 +286,7 @@ $(function(){
</
#
if>
<tr
style=
"display:none"
>
<td>
sessionid:
</td>
<td><input
class=
"form-control"
type=
'text'
id=
"tfa_sessionid"
name=
"
j_sessioni
d"
value=
"${sessionid}"
/></td>
<td><input
class=
"form-control"
type=
'text'
id=
"tfa_sessionid"
name=
"
sessionI
d"
value=
"${sessionid}"
/></td>
</tr>
<tr
>
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录