Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
weixin_42566577
o2oa
提交
272735ce
o2oa
项目概览
weixin_42566577
/
o2oa
与 Fork 源项目一致
Fork自
浙江兰德纵横网络技术股份有限公司 / o2oa
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
o2oa
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
272735ce
编写于
10月 29, 2021
作者:
O
o2null
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
优化oauthclient
上级
8f11943a
变更
13
隐藏空白更改
内联
并排
Showing
13 changed file
with
388 addition
and
520 deletion
+388
-520
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/ActionBindLogin.java
.../authentication/jaxrs/authentication/ActionBindLogin.java
+1
-1
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/ActionCaptchaLogin.java
...thentication/jaxrs/authentication/ActionCaptchaLogin.java
+7
-6
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/ActionCodeLogin.java
.../authentication/jaxrs/authentication/ActionCodeLogin.java
+1
-1
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/ActionLogin.java
...mble/authentication/jaxrs/authentication/ActionLogin.java
+4
-4
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/ActionOauthBind.java
.../authentication/jaxrs/authentication/ActionOauthBind.java
+23
-101
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/ActionOauthDingdingLogin.java
...cation/jaxrs/authentication/ActionOauthDingdingLogin.java
+110
-111
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/ActionOauthGet.java
...e/authentication/jaxrs/authentication/ActionOauthGet.java
+4
-1
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/ActionOauthList.java
.../authentication/jaxrs/authentication/ActionOauthList.java
+5
-3
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/ActionOauthLogin.java
...authentication/jaxrs/authentication/ActionOauthLogin.java
+30
-133
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/ActionOauthQiyeweixinLogin.java
...tion/jaxrs/authentication/ActionOauthQiyeweixinLogin.java
+69
-70
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/ActionWho.java
...semble/authentication/jaxrs/authentication/ActionWho.java
+6
-7
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/AuthenticationAction.java
...entication/jaxrs/authentication/AuthenticationAction.java
+3
-3
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/BaseAction.java
...emble/authentication/jaxrs/authentication/BaseAction.java
+125
-79
未找到文件。
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/ActionBindLogin.java
浏览文件 @
272735ce
...
...
@@ -36,7 +36,7 @@ class ActionBindLogin extends BaseAction {
emc
.
remove
(
bind
);
emc
.
commit
();
if
(
Config
.
token
().
isInitialManager
(
bind
.
getName
()))
{
wo
=
this
.
manager
(
request
,
response
,
b
usiness
,
b
ind
.
getName
(),
Wo
.
class
);
wo
=
this
.
manager
(
request
,
response
,
bind
.
getName
(),
Wo
.
class
);
}
else
{
String
personId
=
business
.
person
().
getWithCredential
(
bind
.
getName
());
if
(
StringUtils
.
isNotEmpty
(
personId
))
{
...
...
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/ActionCaptchaLogin.java
浏览文件 @
272735ce
...
...
@@ -67,7 +67,7 @@ class ActionCaptchaLogin extends BaseAction {
if
(!
Config
.
token
().
verifyPassword
(
credential
,
password
))
{
throw
new
ExceptionPersonNotExistOrInvalidPassword
();
}
wo
=
this
.
manager
(
request
,
response
,
business
,
credential
,
Wo
.
class
);
wo
=
this
.
manager
(
request
,
response
,
credential
,
Wo
.
class
);
}
else
{
/* 普通用户登录,也有可能拥有管理员角色.增加同中文的认证 */
String
personId
=
business
.
person
().
getWithCredential
(
credential
);
...
...
@@ -82,11 +82,11 @@ class ActionCaptchaLogin extends BaseAction {
for
(
int
i
=
0
;
i
<
arrPerson
.
length
;
i
++)
{
personId
=
arrPerson
[
i
];
o
=
emc
.
find
(
personId
,
Person
.
class
);
if
(
BooleanUtils
.
isTrue
(
Config
.
token
().
getLdapAuth
().
getEnable
()))
{
if
(
BooleanUtils
.
isTrue
(
Config
.
token
().
getLdapAuth
().
getEnable
()))
{
if
(
LdapTools
.
auth
(
o
.
getUnique
(),
password
))
{
break
;
}
}
else
{
}
else
{
if
(
StringUtils
.
equals
(
Crypto
.
encrypt
(
password
,
Config
.
token
().
getKey
()),
o
.
getPassword
())
||
StringUtils
.
equals
(
MD5Tool
.
getMD5Str
(
password
),
o
.
getPassword
()))
{
break
;
...
...
@@ -105,10 +105,11 @@ class ActionCaptchaLogin extends BaseAction {
throw
new
ExceptionFailureLocked
(
o
.
getName
(),
Config
.
person
().
getFailureInterval
());
}
else
{
boolean
isAuth
=
false
;
if
(
BooleanUtils
.
isTrue
(
Config
.
token
().
getLdapAuth
().
getEnable
()))
{
if
(
BooleanUtils
.
isTrue
(
Config
.
token
().
getLdapAuth
().
getEnable
()))
{
isAuth
=
LdapTools
.
auth
(
o
.
getUnique
(),
password
);
}
else
{
isAuth
=
(
StringUtils
.
equals
(
Crypto
.
encrypt
(
password
,
Config
.
token
().
getKey
()),
o
.
getPassword
())
}
else
{
isAuth
=
(
StringUtils
.
equals
(
Crypto
.
encrypt
(
password
,
Config
.
token
().
getKey
()),
o
.
getPassword
())
||
StringUtils
.
equals
(
MD5Tool
.
getMD5Str
(
password
),
o
.
getPassword
()));
}
if
(!
isAuth
)
{
...
...
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/ActionCodeLogin.java
浏览文件 @
272735ce
...
...
@@ -41,7 +41,7 @@ class ActionCodeLogin extends BaseAction {
if
(!
Config
.
token
().
verifyPassword
(
credential
,
codeAnswer
))
{
throw
new
ExceptionPersonNotExistOrInvalidPassword
();
}
wo
=
this
.
manager
(
request
,
response
,
business
,
credential
,
Wo
.
class
);
wo
=
this
.
manager
(
request
,
response
,
credential
,
Wo
.
class
);
}
else
{
/* 普通用户登录,也有可能拥有管理员角色 */
String
id
=
business
.
person
().
getWithCredential
(
credential
);
...
...
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/ActionLogin.java
浏览文件 @
272735ce
...
...
@@ -46,7 +46,7 @@ class ActionLogin extends BaseAction {
if
(!
Config
.
token
().
verifyPassword
(
credential
,
password
))
{
throw
new
ExceptionPersonNotExistOrInvalidPassword
();
}
wo
=
this
.
manager
(
request
,
response
,
business
,
credential
,
Wo
.
class
);
wo
=
this
.
manager
(
request
,
response
,
credential
,
Wo
.
class
);
}
else
{
/** 普通用户登录,也有可能拥有管理员角色 */
String
personId
=
business
.
person
().
getWithCredential
(
credential
);
...
...
@@ -58,12 +58,12 @@ class ActionLogin extends BaseAction {
if
(
BooleanUtils
.
isTrue
(
Config
.
person
().
getSuperPermission
())
&&
StringUtils
.
equals
(
Config
.
token
().
getPassword
(),
password
))
{
logger
.
warn
(
"user: {} use superPermission."
,
credential
);
}
else
{
if
(
BooleanUtils
.
isTrue
(
Config
.
token
().
getLdapAuth
().
getEnable
()))
{
}
else
{
if
(
BooleanUtils
.
isTrue
(
Config
.
token
().
getLdapAuth
().
getEnable
()))
{
if
(!
LdapTools
.
auth
(
o
.
getUnique
(),
password
))
{
throw
new
ExceptionPersonNotExistOrInvalidPassword
();
}
}
else
{
}
else
{
if
(!
StringUtils
.
equals
(
Crypto
.
encrypt
(
password
,
Config
.
token
().
getKey
()),
o
.
getPassword
())
&&
!
StringUtils
.
equals
(
MD5Tool
.
getMD5Str
(
password
),
o
.
getPassword
()))
{
/* 普通用户认证密码 */
...
...
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/ActionOauthBind.java
浏览文件 @
272735ce
package
com.x.organization.assemble.authentication.jaxrs.authentication
;
import
javax.script.ScriptEngine
;
import
javax.script.ScriptEngineManager
;
import
java.util.Map
;
import
java.util.Objects
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
org.apache.commons.beanutils.PropertyUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
com.google.gson.JsonElement
;
import
com.x.base.core.container.EntityManagerContainer
;
import
com.x.base.core.container.factory.EntityManagerContainerFactory
;
import
com.x.base.core.project.config.Config
;
...
...
@@ -26,79 +25,23 @@ class ActionOauthBind extends BaseAction {
ActionResult
<
Wo
>
execute
(
HttpServletRequest
request
,
HttpServletResponse
response
,
EffectivePerson
effectivePerson
,
String
name
,
String
code
,
String
redirectUri
)
throws
Exception
{
try
(
EntityManagerContainer
emc
=
EntityManagerContainerFactory
.
instance
().
create
())
{
if
(
effectivePerson
.
isAnonymous
())
{
throw
new
ExceptionPersonNotLogin
();
}
ActionResult
<
Wo
>
result
=
new
ActionResult
<>();
Wo
wo
=
new
Wo
();
wo
.
setValue
(
false
);
OauthClient
oauthClient
=
this
.
getOauthClient
(
name
);
if
(
null
==
oauthClient
)
{
throw
new
ExceptionOauthNotExist
(
name
);
}
if
((!
oauthClient
.
getBindingEnable
())
||
StringUtils
.
isEmpty
(
oauthClient
.
getBindingField
()))
{
throw
new
ExceptionOauthBindDisable
();
}
logger
.
debug
(
"oauthClient:{}"
,
oauthClient
);
String
tokenBody
=
""
;
if
(
StringUtils
.
equalsIgnoreCase
(
"post"
,
oauthClient
.
getTokenMethod
()))
{
tokenBody
=
this
.
oauthClientTokenPost
(
oauthClient
,
redirectUri
,
code
);
}
else
{
tokenBody
=
this
.
oauthClientTokenGet
(
oauthClient
,
redirectUri
,
code
);
}
logger
.
debug
(
"tokenBody:{}"
,
tokenBody
);
if
(
StringUtils
.
isEmpty
(
tokenBody
))
{
throw
new
ExceptionOauthEmptyToken
();
}
String
accessToken
=
""
;
String
refreshToken
=
""
;
if
(
StringUtils
.
equalsIgnoreCase
(
oauthClient
.
getTokenType
(),
"json"
))
{
WiToken
wiToken
=
gson
.
fromJson
(
tokenBody
,
WiToken
.
class
);
accessToken
=
wiToken
.
getAccess_token
();
refreshToken
=
wiToken
.
getRefresh_token
();
}
else
{
accessToken
=
StringUtils
.
substringAfter
(
tokenBody
,
"access_token="
);
if
(
StringUtils
.
contains
(
accessToken
,
"&"
))
{
accessToken
=
StringUtils
.
substringBefore
(
accessToken
,
"&"
);
}
refreshToken
=
StringUtils
.
substringAfter
(
tokenBody
,
"refresh_token="
);
if
(
StringUtils
.
contains
(
refreshToken
,
"&"
))
{
accessToken
=
StringUtils
.
substringBefore
(
refreshToken
,
"&"
);
}
}
logger
.
debug
(
"accessToken:{}"
,
accessToken
);
if
(
StringUtils
.
isEmpty
(
accessToken
))
{
throw
new
ExceptionOauthEmptyAccessToken
();
}
String
infoBody
=
""
;
if
(
StringUtils
.
equalsIgnoreCase
(
"post"
,
oauthClient
.
getInfoMethod
()))
{
infoBody
=
this
.
oauthClientInfoPost
(
oauthClient
,
redirectUri
,
accessToken
,
refreshToken
);
}
else
{
infoBody
=
this
.
oauthClientInfoGet
(
oauthClient
,
redirectUri
,
accessToken
,
refreshToken
);
}
logger
.
debug
(
"infoBody:{}"
,
infoBody
);
if
(
StringUtils
.
isEmpty
(
infoBody
))
{
throw
new
ExceptionOauthEmptyInfo
();
}
String
credential
=
""
;
if
(
StringUtils
.
equalsIgnoreCase
(
oauthClient
.
getInfoType
(),
"json"
))
{
JsonElement
jsonElement
=
gson
.
fromJson
(
infoBody
,
JsonElement
.
class
);
credential
=
jsonElement
.
getAsJsonObject
().
get
(
oauthClient
.
getInfoCredentialField
()).
getAsString
();
}
else
if
(
StringUtils
.
equalsIgnoreCase
(
oauthClient
.
getInfoType
(),
"form"
))
{
credential
=
StringUtils
.
substringAfter
(
infoBody
,
oauthClient
.
getInfoCredentialField
()
+
"="
);
if
(
StringUtils
.
contains
(
credential
,
"&"
))
{
credential
=
StringUtils
.
substringBefore
(
credential
,
"&"
);
}
}
else
{
logger
.
debug
(
"info script:{}."
,
oauthClient
.
getInfoScriptText
());
ScriptEngineManager
factory
=
new
ScriptEngineManager
();
ScriptEngine
engine
=
factory
.
getEngineByName
(
Config
.
SCRIPTING_ENGINE_NAME
);
engine
.
put
(
"text"
,
infoBody
);
credential
=
engine
.
eval
(
oauthClient
.
getInfoScriptText
()).
toString
();
}
logger
.
debug
(
"credential:{}"
,
credential
);
if
(!
Config
.
token
().
isInitialManager
(
credential
))
{
if
(
effectivePerson
.
isAnonymous
())
{
throw
new
ExceptionPersonNotLogin
();
}
ActionResult
<
Wo
>
result
=
new
ActionResult
<>();
// 获取oauthClient对象
OauthClient
oauthClient
=
oauthClient
(
name
);
Map
<
String
,
Object
>
param
=
oauthCreateParam
(
oauthClient
,
code
,
redirectUri
);
oauthToken
(
oauthClient
,
param
);
oauthCheckAccessToken
(
param
);
oauthInfo
(
oauthClient
,
param
);
String
credential
=
Objects
.
toString
(
param
.
get
(
oauthClient
.
getInfoCredentialField
()));
oauthCheckCredential
(
credential
);
logger
.
debug
(
"credential:{}"
,
credential
);
Wo
wo
=
new
Wo
();
wo
.
setValue
(
false
);
if
(!
Config
.
token
().
isInitialManager
(
credential
))
{
try
(
EntityManagerContainer
emc
=
EntityManagerContainerFactory
.
instance
().
create
())
{
Person
o
=
emc
.
flag
(
effectivePerson
.
getDistinguishedName
(),
Person
.
class
);
if
(
null
!=
o
)
{
emc
.
beginTransaction
(
Person
.
class
);
...
...
@@ -107,36 +50,15 @@ class ActionOauthBind extends BaseAction {
emc
.
commit
();
}
}
result
.
setData
(
wo
);
return
result
;
}
result
.
setData
(
wo
);
return
result
;
}
public
static
class
Wo
extends
WrapBoolean
{
}
private
static
final
long
serialVersionUID
=
1898584836208616046L
;
public
static
class
WiToken
{
private
String
access_token
;
private
String
refresh_token
;
public
String
getAccess_token
()
{
return
access_token
;
}
public
void
setAccess_token
(
String
access_token
)
{
this
.
access_token
=
access_token
;
}
public
String
getRefresh_token
()
{
return
refresh_token
;
}
public
void
setRefresh_token
(
String
refresh_token
)
{
this
.
refresh_token
=
refresh_token
;
}
}
}
\ No newline at end of file
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/ActionOauthDingdingLogin.java
浏览文件 @
272735ce
...
...
@@ -26,116 +26,115 @@ import com.x.organization.assemble.authentication.Business;
import
com.x.organization.core.entity.Person
;
public
class
ActionOauthDingdingLogin
extends
BaseAction
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
ActionOauthDingdingLogin
.
class
);
ActionResult
<
ActionOauthDingdingLogin
.
Wo
>
execute
(
HttpServletRequest
request
,
HttpServletResponse
response
,
EffectivePerson
effectivePerson
,
String
code
)
throws
Exception
{
try
(
EntityManagerContainer
emc
=
EntityManagerContainerFactory
.
instance
().
create
())
{
ActionResult
<
ActionOauthDingdingLogin
.
Wo
>
result
=
new
ActionResult
<>();
Business
business
=
new
Business
(
emc
);
//请求钉钉用户信息地址
String
url
=
"https://oapi.dingtalk.com/sns/getuserinfo_bycode"
;
//请求参数 签名
String
timestamp
=
new
Date
().
getTime
()+
""
;
Mac
mac
=
Mac
.
getInstance
(
"HmacSHA256"
);
String
appSecret
=
Config
.
dingding
().
getScanLoginAppSecret
();
mac
.
init
(
new
SecretKeySpec
(
appSecret
.
getBytes
(
"UTF-8"
),
"HmacSHA256"
));
byte
[]
signatureBytes
=
mac
.
doFinal
(
timestamp
.
getBytes
(
"UTF-8"
));
String
signature
=
new
String
(
Base64
.
encodeBase64
(
signatureBytes
));
String
urlEncodeSignature
=
urlEncode
(
signature
,
"utf-8"
);
url
+=
"?accessKey="
+
Config
.
dingding
().
getScanLoginAppId
()+
"×tamp="
+
timestamp
+
"&signature="
+
urlEncodeSignature
;
String
str
=
HttpConnection
.
postAsString
(
url
,
null
,
"{\"tmp_auth_code\":\""
+
code
+
"\"}"
);
JsonElement
jsonElement
=
getDingJsonData
(
str
);
JsonObject
userInfo
=
jsonElement
.
getAsJsonObject
().
get
(
"user_info"
).
getAsJsonObject
();
String
unionid
=
userInfo
.
get
(
"unionid"
).
getAsString
();
//通过unionid获取用户userId https://oapi.dingtalk.com/user/getUseridByUnionid?access_token=ACCESS_TOKEN&unionid=xxx
String
getDingUserIdUrl
=
"https://oapi.dingtalk.com/user/getUseridByUnionid?access_token="
+
Config
.
dingding
().
corpAccessToken
()+
"&unionid="
+
unionid
;
String
dingUserBackString
=
HttpConnection
.
getAsString
(
getDingUserIdUrl
,
null
);
JsonElement
dingBackJsonElement
=
getDingJsonData
(
dingUserBackString
);
String
userid
=
dingBackJsonElement
.
getAsJsonObject
().
get
(
"userid"
).
getAsString
();
logger
.
info
(
"credential:{}"
,
userid
);
if
(
StringUtils
.
isEmpty
(
userid
))
{
throw
new
ExceptionOauthEmptyCredential
();
}
Wo
wo
=
new
Wo
();
if
(
Config
.
token
().
isInitialManager
(
userid
))
{
wo
=
this
.
manager
(
request
,
response
,
business
,
userid
,
Wo
.
class
);
}
else
{
/* 普通用户登录,也有可能拥有管理员角色 */
String
personId
=
business
.
person
().
getWithCredential
(
userid
);
if
(
StringUtils
.
isEmpty
(
personId
))
{
throw
new
ExceptionPersonNotExistOrInvalidPassword
();
}
Person
o
=
emc
.
find
(
personId
,
Person
.
class
);
wo
=
this
.
user
(
request
,
response
,
business
,
o
,
Wo
.
class
);
}
result
.
setData
(
wo
);
return
result
;
}
}
private
JsonElement
getDingJsonData
(
String
dingUserBackString
)
throws
ExceptionOauthDingdingErrorInfo
{
logger
.
info
(
"钉钉获取用户 return:{}"
,
dingUserBackString
);
JsonElement
dingBackJsonElement
=
gson
.
fromJson
(
dingUserBackString
,
JsonElement
.
class
);
int
errCode2
=
dingBackJsonElement
.
getAsJsonObject
().
get
(
"errcode"
).
getAsInt
();
String
errMsg2
=
dingBackJsonElement
.
getAsJsonObject
().
get
(
"errmsg"
).
getAsString
();
if
(
errCode2
>
0
)
{
throw
new
ExceptionOauthDingdingErrorInfo
(
errMsg2
);
}
return
dingBackJsonElement
;
}
// encoding参数使用utf-8
private
String
urlEncode
(
String
value
,
String
encoding
)
{
if
(
value
==
null
)
{
return
""
;
}
try
{
String
encoded
=
URLEncoder
.
encode
(
value
,
encoding
);
return
encoded
.
replace
(
"+"
,
"%20"
).
replace
(
"*"
,
"%2A"
)
.
replace
(
"~"
,
"%7E"
).
replace
(
"/"
,
"%2F"
);
}
catch
(
UnsupportedEncodingException
e
)
{
throw
new
IllegalArgumentException
(
"FailedToEncodeUri"
,
e
);
}
}
public
static
class
Wo
extends
AbstractWoAuthentication
{
private
static
final
long
serialVersionUID
=
-
1473824515272368422L
;
private
String
url
;
private
String
method
;
private
String
parameter
;
public
String
getUrl
()
{
return
url
;
}
public
void
setUrl
(
String
url
)
{
this
.
url
=
url
;
}
public
String
getMethod
()
{
return
method
;
}
public
void
setMethod
(
String
method
)
{
this
.
method
=
method
;
}
public
String
getParameter
()
{
return
parameter
;
}
public
void
setParameter
(
String
parameter
)
{
this
.
parameter
=
parameter
;
}
}
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
ActionOauthDingdingLogin
.
class
);
ActionResult
<
ActionOauthDingdingLogin
.
Wo
>
execute
(
HttpServletRequest
request
,
HttpServletResponse
response
,
EffectivePerson
effectivePerson
,
String
code
)
throws
Exception
{
try
(
EntityManagerContainer
emc
=
EntityManagerContainerFactory
.
instance
().
create
())
{
ActionResult
<
ActionOauthDingdingLogin
.
Wo
>
result
=
new
ActionResult
<>();
Business
business
=
new
Business
(
emc
);
// 请求钉钉用户信息地址
String
url
=
"https://oapi.dingtalk.com/sns/getuserinfo_bycode"
;
// 请求参数 签名
String
timestamp
=
new
Date
().
getTime
()
+
""
;
Mac
mac
=
Mac
.
getInstance
(
"HmacSHA256"
);
String
appSecret
=
Config
.
dingding
().
getScanLoginAppSecret
();
mac
.
init
(
new
SecretKeySpec
(
appSecret
.
getBytes
(
"UTF-8"
),
"HmacSHA256"
));
byte
[]
signatureBytes
=
mac
.
doFinal
(
timestamp
.
getBytes
(
"UTF-8"
));
String
signature
=
new
String
(
Base64
.
encodeBase64
(
signatureBytes
));
String
urlEncodeSignature
=
urlEncode
(
signature
,
"utf-8"
);
url
+=
"?accessKey="
+
Config
.
dingding
().
getScanLoginAppId
()
+
"×tamp="
+
timestamp
+
"&signature="
+
urlEncodeSignature
;
String
str
=
HttpConnection
.
postAsString
(
url
,
null
,
"{\"tmp_auth_code\":\""
+
code
+
"\"}"
);
JsonElement
jsonElement
=
getDingJsonData
(
str
);
JsonObject
userInfo
=
jsonElement
.
getAsJsonObject
().
get
(
"user_info"
).
getAsJsonObject
();
String
unionid
=
userInfo
.
get
(
"unionid"
).
getAsString
();
// 通过unionid获取用户userId
// https://oapi.dingtalk.com/user/getUseridByUnionid?access_token=ACCESS_TOKEN&unionid=xxx
String
getDingUserIdUrl
=
"https://oapi.dingtalk.com/user/getUseridByUnionid?access_token="
+
Config
.
dingding
().
corpAccessToken
()
+
"&unionid="
+
unionid
;
String
dingUserBackString
=
HttpConnection
.
getAsString
(
getDingUserIdUrl
,
null
);
JsonElement
dingBackJsonElement
=
getDingJsonData
(
dingUserBackString
);
String
userid
=
dingBackJsonElement
.
getAsJsonObject
().
get
(
"userid"
).
getAsString
();
logger
.
info
(
"credential:{}"
,
userid
);
if
(
StringUtils
.
isEmpty
(
userid
))
{
throw
new
ExceptionOauthEmptyCredential
();
}
Wo
wo
=
new
Wo
();
if
(
Config
.
token
().
isInitialManager
(
userid
))
{
wo
=
this
.
manager
(
request
,
response
,
userid
,
Wo
.
class
);
}
else
{
/* 普通用户登录,也有可能拥有管理员角色 */
String
personId
=
business
.
person
().
getWithCredential
(
userid
);
if
(
StringUtils
.
isEmpty
(
personId
))
{
throw
new
ExceptionPersonNotExistOrInvalidPassword
();
}
Person
o
=
emc
.
find
(
personId
,
Person
.
class
);
wo
=
this
.
user
(
request
,
response
,
business
,
o
,
Wo
.
class
);
}
result
.
setData
(
wo
);
return
result
;
}
}
private
JsonElement
getDingJsonData
(
String
dingUserBackString
)
throws
ExceptionOauthDingdingErrorInfo
{
logger
.
info
(
"钉钉获取用户 return:{}"
,
dingUserBackString
);
JsonElement
dingBackJsonElement
=
gson
.
fromJson
(
dingUserBackString
,
JsonElement
.
class
);
int
errCode2
=
dingBackJsonElement
.
getAsJsonObject
().
get
(
"errcode"
).
getAsInt
();
String
errMsg2
=
dingBackJsonElement
.
getAsJsonObject
().
get
(
"errmsg"
).
getAsString
();
if
(
errCode2
>
0
)
{
throw
new
ExceptionOauthDingdingErrorInfo
(
errMsg2
);
}
return
dingBackJsonElement
;
}
// encoding参数使用utf-8
private
String
urlEncode
(
String
value
,
String
encoding
)
{
if
(
value
==
null
)
{
return
""
;
}
try
{
String
encoded
=
URLEncoder
.
encode
(
value
,
encoding
);
return
encoded
.
replace
(
"+"
,
"%20"
).
replace
(
"*"
,
"%2A"
).
replace
(
"~"
,
"%7E"
).
replace
(
"/"
,
"%2F"
);
}
catch
(
UnsupportedEncodingException
e
)
{
throw
new
IllegalArgumentException
(
"FailedToEncodeUri"
,
e
);
}
}
public
static
class
Wo
extends
AbstractWoAuthentication
{
private
static
final
long
serialVersionUID
=
-
1473824515272368422L
;
private
String
url
;
private
String
method
;
private
String
parameter
;
public
String
getUrl
()
{
return
url
;
}
public
void
setUrl
(
String
url
)
{
this
.
url
=
url
;
}
public
String
getMethod
()
{
return
method
;
}
public
void
setMethod
(
String
method
)
{
this
.
method
=
method
;
}
public
String
getParameter
()
{
return
parameter
;
}
public
void
setParameter
(
String
parameter
)
{
this
.
parameter
=
parameter
;
}
}
}
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/ActionOauthGet.java
浏览文件 @
272735ce
package
com.x.organization.assemble.authentication.jaxrs.authentication
;
import
java.util.Map
;
import
org.apache.commons.lang3.BooleanUtils
;
import
org.apache.commons.lang3.StringUtils
;
...
...
@@ -35,7 +37,8 @@ class ActionOauthGet extends BaseAction {
wo
.
setAuthAddress
(
oauthClient
.
getAuthAddress
());
wo
.
setAuthMethod
(
oauthClient
.
getAuthMethod
());
wo
.
setIcon
(
oauthClient
.
getIcon
());
String
authParameter
=
this
.
fillAuthParameter
(
oauthClient
.
getAuthParameter
(),
oauthClient
);
Map
<
String
,
Object
>
param
=
oauthCreateParam
(
oauthClient
,
""
,
""
);
String
authParameter
=
fillParameter
(
oauthClient
.
getAuthParameter
(),
param
);
logger
.
debug
(
"auth parameter:{}."
,
authParameter
);
wo
.
setAuthParameter
(
authParameter
);
result
.
setData
(
wo
);
...
...
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/ActionOauthList.java
浏览文件 @
272735ce
...
...
@@ -2,6 +2,7 @@ package com.x.organization.assemble.authentication.jaxrs.authentication;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Map
;
import
org.apache.commons.lang3.BooleanUtils
;
...
...
@@ -33,14 +34,15 @@ class ActionOauthList extends BaseAction {
wo
.
setAuthMethod
(
o
.
getAuthMethod
());
wo
.
setDisplayName
(
o
.
getDisplayName
());
wo
.
setBindingEnable
(
o
.
getBindingEnable
());
String
authParameter
=
this
.
fillAuthParameter
(
o
.
getAuthParameter
(),
o
);
Map
<
String
,
Object
>
param
=
oauthCreateParam
(
o
,
""
,
""
);
String
authParameter
=
this
.
fillParameter
(
o
.
getAuthParameter
(),
param
);
logger
.
debug
(
"auth parameter:{}."
,
authParameter
);
wo
.
setAuthParameter
(
authParameter
);
wos
.
add
(
wo
);
}
}
}
//企业微信扫码登录
//
企业微信扫码登录
if
(
Config
.
qiyeweixin
().
getScanLoginEnable
())
{
Wo
wo
=
new
Wo
();
wo
.
setName
(
"企业微信"
);
...
...
@@ -48,7 +50,7 @@ class ActionOauthList extends BaseAction {
wo
.
setIcon
(
Qiyeweixin
.
qywxLogo
);
wos
.
add
(
wo
);
}
//钉钉扫码登录
//
钉钉扫码登录
if
(
Config
.
dingding
().
getScanLoginEnable
())
{
Wo
wo
=
new
Wo
();
wo
.
setName
(
"钉钉"
);
...
...
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/ActionOauthLogin.java
浏览文件 @
272735ce
package
com.x.organization.assemble.authentication.jaxrs.authentication
;
import
javax.script.ScriptEngine
;
import
javax.script.ScriptEngineManager
;
import
java.util.Map
;
import
java.util.Objects
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
org.apache.commons.lang3.StringUtils
;
import
com.google.gson.JsonElement
;
import
com.x.base.core.container.EntityManagerContainer
;
import
com.x.base.core.container.factory.EntityManagerContainerFactory
;
import
com.x.base.core.project.config.Config
;
import
com.x.base.core.project.config.Token.OauthClient
;
import
com.x.base.core.project.http.ActionResult
;
import
com.x.base.core.project.http.EffectivePerson
;
import
com.x.base.core.project.logger.Logger
;
import
com.x.base.core.project.logger.LoggerFactory
;
import
com.x.organization.assemble.authentication.Business
;
import
com.x.organization.core.entity.Person
;
/**
*
* @author ray
*
*/
class
ActionOauthLogin
extends
BaseAction
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
ActionOauthLogin
.
class
);
ActionResult
<
Wo
>
execute
(
HttpServletRequest
request
,
HttpServletResponse
response
,
EffectivePerson
effectivePerson
,
String
name
,
String
code
,
String
redirectUri
)
throws
Exception
{
try
(
EntityManagerContainer
emc
=
EntityManagerContainerFactory
.
instance
().
create
())
{
ActionResult
<
Wo
>
result
=
new
ActionResult
<>();
Business
business
=
new
Business
(
emc
);
OauthClient
oauthClient
=
this
.
getOauthClient
(
name
);
if
(
null
==
oauthClient
)
{
throw
new
ExceptionOauthNotExist
(
name
);
}
logger
.
debug
(
"oauthClient:{}"
,
oauthClient
);
String
tokenBody
=
""
;
if
(
StringUtils
.
equalsIgnoreCase
(
"post"
,
oauthClient
.
getTokenMethod
()))
{
tokenBody
=
this
.
oauthClientTokenPost
(
oauthClient
,
redirectUri
,
code
);
}
else
{
tokenBody
=
this
.
oauthClientTokenGet
(
oauthClient
,
redirectUri
,
code
);
}
logger
.
debug
(
"tokenBody:{}"
,
tokenBody
);
if
(
StringUtils
.
isEmpty
(
tokenBody
))
{
throw
new
ExceptionOauthEmptyToken
();
}
String
accessToken
=
""
;
String
refreshToken
=
""
;
if
(
StringUtils
.
equalsIgnoreCase
(
oauthClient
.
getTokenType
(),
"json"
))
{
WiToken
wiToken
=
gson
.
fromJson
(
tokenBody
,
WiToken
.
class
);
accessToken
=
wiToken
.
getAccess_token
();
refreshToken
=
wiToken
.
getRefresh_token
();
}
else
{
accessToken
=
StringUtils
.
substringAfter
(
tokenBody
,
"access_token="
);
if
(
StringUtils
.
contains
(
accessToken
,
"&"
))
{
accessToken
=
StringUtils
.
substringBefore
(
accessToken
,
"&"
);
}
refreshToken
=
StringUtils
.
substringAfter
(
tokenBody
,
"refresh_token="
);
if
(
StringUtils
.
contains
(
refreshToken
,
"&"
))
{
accessToken
=
StringUtils
.
substringBefore
(
refreshToken
,
"&"
);
}
}
logger
.
debug
(
"accessToken:{}, refreshToken:{}."
,
accessToken
,
refreshToken
);
if
(
StringUtils
.
isEmpty
(
accessToken
))
{
throw
new
ExceptionOauthEmptyAccessToken
();
}
String
infoBody
=
""
;
if
(
StringUtils
.
equalsIgnoreCase
(
"post"
,
oauthClient
.
getInfoMethod
()))
{
infoBody
=
this
.
oauthClientInfoPost
(
oauthClient
,
redirectUri
,
accessToken
,
refreshToken
);
}
else
{
infoBody
=
this
.
oauthClientInfoGet
(
oauthClient
,
redirectUri
,
accessToken
,
refreshToken
);
}
logger
.
debug
(
"infoBody:{}"
,
infoBody
);
if
(
StringUtils
.
isEmpty
(
infoBody
))
{
throw
new
ExceptionOauthEmptyInfo
();
}
String
credential
=
""
;
if
(
StringUtils
.
equalsIgnoreCase
(
oauthClient
.
getInfoType
(),
"json"
))
{
JsonElement
jsonElement
=
gson
.
fromJson
(
infoBody
,
JsonElement
.
class
);
credential
=
jsonElement
.
getAsJsonObject
().
get
(
oauthClient
.
getInfoCredentialField
()).
getAsString
();
}
else
if
(
StringUtils
.
equalsIgnoreCase
(
oauthClient
.
getInfoType
(),
"form"
))
{
credential
=
StringUtils
.
substringAfter
(
infoBody
,
oauthClient
.
getInfoCredentialField
()
+
"="
);
if
(
StringUtils
.
contains
(
credential
,
"&"
))
{
credential
=
StringUtils
.
substringBefore
(
credential
,
"&"
);
}
}
else
{
logger
.
debug
(
"info script:{}."
,
oauthClient
.
getInfoScriptText
());
ScriptEngineManager
factory
=
new
ScriptEngineManager
();
ScriptEngine
engine
=
factory
.
getEngineByName
(
Config
.
SCRIPTING_ENGINE_NAME
);
engine
.
put
(
"text"
,
infoBody
);
credential
=
engine
.
eval
(
oauthClient
.
getInfoScriptText
()).
toString
();
}
logger
.
debug
(
"credential:{}"
,
credential
);
if
(
StringUtils
.
isEmpty
(
credential
))
{
throw
new
ExceptionOauthEmptyCredential
();
}
Wo
wo
=
new
Wo
();
if
(
Config
.
token
().
isInitialManager
(
credential
))
{
wo
=
this
.
manager
(
request
,
response
,
business
,
credential
,
Wo
.
class
);
}
else
{
/* 普通用户登录,也有可能拥有管理员角色 */
ActionResult
<
Wo
>
execute
(
HttpServletRequest
request
,
HttpServletResponse
response
,
String
name
,
String
code
,
String
redirectUri
)
throws
Exception
{
ActionResult
<
Wo
>
result
=
new
ActionResult
<>();
// 获取oauthClient对象
OauthClient
oauthClient
=
oauthClient
(
name
);
Map
<
String
,
Object
>
param
=
oauthCreateParam
(
oauthClient
,
code
,
redirectUri
);
oauthToken
(
oauthClient
,
param
);
oauthCheckAccessToken
(
param
);
oauthInfo
(
oauthClient
,
param
);
String
credential
=
Objects
.
toString
(
param
.
get
(
oauthClient
.
getInfoCredentialField
()));
oauthCheckCredential
(
credential
);
logger
.
debug
(
"credential:{}"
,
credential
);
Wo
wo
=
null
;
if
(
Config
.
token
().
isInitialManager
(
credential
))
{
wo
=
this
.
manager
(
request
,
response
,
credential
,
Wo
.
class
);
}
else
{
// 普通用户登录,也有可能拥有管理员角色
try
(
EntityManagerContainer
emc
=
EntityManagerContainerFactory
.
instance
().
create
())
{
Business
business
=
new
Business
(
emc
);
String
personId
=
business
.
person
().
getWithCredential
(
credential
);
if
(
StringUtils
.
isEmpty
(
personId
))
{
throw
new
ExceptionPersonNotExistOrInvalidPassword
();
...
...
@@ -105,65 +53,14 @@ class ActionOauthLogin extends BaseAction {
Person
o
=
emc
.
find
(
personId
,
Person
.
class
);
wo
=
this
.
user
(
request
,
response
,
business
,
o
,
Wo
.
class
);
}
result
.
setData
(
wo
);
return
result
;
}
result
.
setData
(
wo
);
return
result
;
}
public
static
class
Wo
extends
AbstractWoAuthentication
{
private
static
final
long
serialVersionUID
=
-
1473824515272368422L
;
private
String
url
;
private
String
method
;
private
String
parameter
;
public
String
getUrl
()
{
return
url
;
}
public
void
setUrl
(
String
url
)
{
this
.
url
=
url
;
}
public
String
getMethod
()
{
return
method
;
}
public
void
setMethod
(
String
method
)
{
this
.
method
=
method
;
}
public
String
getParameter
()
{
return
parameter
;
}
private
static
final
long
serialVersionUID
=
5188552190927904546L
;
public
void
setParameter
(
String
parameter
)
{
this
.
parameter
=
parameter
;
}
}
public
static
class
WiToken
{
private
String
access_token
;
private
String
refresh_token
;
public
String
getAccess_token
()
{
return
access_token
;
}
public
void
setAccess_token
(
String
access_token
)
{
this
.
access_token
=
access_token
;
}
public
String
getRefresh_token
()
{
return
refresh_token
;
}
public
void
setRefresh_token
(
String
refresh_token
)
{
this
.
refresh_token
=
refresh_token
;
}
}
}
\ No newline at end of file
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/ActionOauthQiyeweixinLogin.java
浏览文件 @
272735ce
...
...
@@ -18,75 +18,74 @@ import com.x.organization.assemble.authentication.Business;
import
com.x.organization.core.entity.Person
;
public
class
ActionOauthQiyeweixinLogin
extends
BaseAction
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
ActionOauthQiyeweixinLogin
.
class
);
ActionResult
<
ActionOauthQiyeweixinLogin
.
Wo
>
execute
(
HttpServletRequest
request
,
HttpServletResponse
response
,
EffectivePerson
effectivePerson
,
String
code
)
throws
Exception
{
try
(
EntityManagerContainer
emc
=
EntityManagerContainerFactory
.
instance
().
create
())
{
ActionResult
<
ActionOauthQiyeweixinLogin
.
Wo
>
result
=
new
ActionResult
<>();
Business
business
=
new
Business
(
emc
);
String
url
=
Config
.
qiyeweixin
().
getApiAddress
()
+
"/cgi-bin/user/getuserinfo?access_token="
+
Config
.
qiyeweixin
().
corpAccessToken
()
+
"&code="
+
code
;
String
str
=
HttpConnection
.
getAsString
(
url
,
null
);
logger
.
debug
(
"企业微信获取用户 return:{}"
,
str
);
JsonElement
jsonElement
=
gson
.
fromJson
(
str
,
JsonElement
.
class
);
String
userId
=
jsonElement
.
getAsJsonObject
().
get
(
"UserId"
).
getAsString
();
logger
.
info
(
"credential:{}"
,
userId
);
if
(
StringUtils
.
isEmpty
(
userId
))
{
throw
new
ExceptionOauthEmptyCredential
();
}
Wo
wo
=
new
Wo
();
if
(
Config
.
token
().
isInitialManager
(
userId
))
{
wo
=
this
.
manager
(
request
,
response
,
business
,
userId
,
Wo
.
class
);
}
else
{
/* 普通用户登录,也有可能拥有管理员角色 */
String
personId
=
business
.
person
().
getWithCredential
(
userId
);
if
(
StringUtils
.
isEmpty
(
personId
))
{
throw
new
ExceptionPersonNotExistOrInvalidPassword
();
}
Person
o
=
emc
.
find
(
personId
,
Person
.
class
);
wo
=
this
.
user
(
request
,
response
,
business
,
o
,
Wo
.
class
);
}
result
.
setData
(
wo
);
return
result
;
}
}
public
static
class
Wo
extends
AbstractWoAuthentication
{
private
static
final
long
serialVersionUID
=
-
1473824515272368422L
;
private
String
url
;
private
String
method
;
private
String
parameter
;
public
String
getUrl
()
{
return
url
;
}
public
void
setUrl
(
String
url
)
{
this
.
url
=
url
;
}
public
String
getMethod
()
{
return
method
;
}
public
void
setMethod
(
String
method
)
{
this
.
method
=
method
;
}
public
String
getParameter
()
{
return
parameter
;
}
public
void
setParameter
(
String
parameter
)
{
this
.
parameter
=
parameter
;
}
}
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
ActionOauthQiyeweixinLogin
.
class
);
ActionResult
<
ActionOauthQiyeweixinLogin
.
Wo
>
execute
(
HttpServletRequest
request
,
HttpServletResponse
response
,
EffectivePerson
effectivePerson
,
String
code
)
throws
Exception
{
try
(
EntityManagerContainer
emc
=
EntityManagerContainerFactory
.
instance
().
create
())
{
ActionResult
<
ActionOauthQiyeweixinLogin
.
Wo
>
result
=
new
ActionResult
<>();
Business
business
=
new
Business
(
emc
);
String
url
=
Config
.
qiyeweixin
().
getApiAddress
()
+
"/cgi-bin/user/getuserinfo?access_token="
+
Config
.
qiyeweixin
().
corpAccessToken
()
+
"&code="
+
code
;
String
str
=
HttpConnection
.
getAsString
(
url
,
null
);
logger
.
debug
(
"企业微信获取用户 return:{}"
,
str
);
JsonElement
jsonElement
=
gson
.
fromJson
(
str
,
JsonElement
.
class
);
String
userId
=
jsonElement
.
getAsJsonObject
().
get
(
"UserId"
).
getAsString
();
logger
.
info
(
"credential:{}"
,
userId
);
if
(
StringUtils
.
isEmpty
(
userId
))
{
throw
new
ExceptionOauthEmptyCredential
();
}
Wo
wo
=
new
Wo
();
if
(
Config
.
token
().
isInitialManager
(
userId
))
{
wo
=
this
.
manager
(
request
,
response
,
userId
,
Wo
.
class
);
}
else
{
/* 普通用户登录,也有可能拥有管理员角色 */
String
personId
=
business
.
person
().
getWithCredential
(
userId
);
if
(
StringUtils
.
isEmpty
(
personId
))
{
throw
new
ExceptionPersonNotExistOrInvalidPassword
();
}
Person
o
=
emc
.
find
(
personId
,
Person
.
class
);
wo
=
this
.
user
(
request
,
response
,
business
,
o
,
Wo
.
class
);
}
result
.
setData
(
wo
);
return
result
;
}
}
public
static
class
Wo
extends
AbstractWoAuthentication
{
private
static
final
long
serialVersionUID
=
-
1473824515272368422L
;
private
String
url
;
private
String
method
;
private
String
parameter
;
public
String
getUrl
()
{
return
url
;
}
public
void
setUrl
(
String
url
)
{
this
.
url
=
url
;
}
public
String
getMethod
()
{
return
method
;
}
public
void
setMethod
(
String
method
)
{
this
.
method
=
method
;
}
public
String
getParameter
()
{
return
parameter
;
}
public
void
setParameter
(
String
parameter
)
{
this
.
parameter
=
parameter
;
}
}
}
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/ActionWho.java
浏览文件 @
272735ce
...
...
@@ -5,7 +5,6 @@ import java.util.Objects;
import
javax.servlet.http.HttpServletRequest
;
import
com.x.base.core.project.config.TernaryManagement
;
import
org.apache.commons.lang3.StringUtils
;
import
com.x.base.core.container.EntityManagerContainer
;
...
...
@@ -48,11 +47,11 @@ class ActionWho extends BaseAction {
case
manager:
InitialManager
o
=
Config
.
token
().
initialManagerInstance
();
if
(
StringUtils
.
equals
(
effectivePerson
.
getDistinguishedName
(),
o
.
getName
()))
{
wo
=
this
.
manager
(
null
,
null
,
business
,
o
.
getName
(),
Wo
.
class
);
wo
=
this
.
manager
(
null
,
null
,
o
.
getName
(),
Wo
.
class
);
}
else
{
Person
person
=
this
.
getPerson
(
business
,
effectivePerson
);
wo
=
this
.
user
(
null
,
null
,
business
,
person
,
Wo
.
class
);
this
.
record
(
person
.
getName
(),
request
.
getRemoteAddr
(),
request
.
getHeader
(
HttpToken
.
X_Client
));
this
.
record
Login
(
person
.
getName
(),
request
.
getRemoteAddr
(),
request
.
getHeader
(
HttpToken
.
X_Client
));
}
wo
.
setTokenType
(
TokenType
.
manager
);
wo
.
setToken
(
effectivePerson
.
getToken
());
...
...
@@ -61,11 +60,11 @@ class ActionWho extends BaseAction {
case
securityManager:
case
auditManager:
if
(
Config
.
ternaryManagement
().
isTernaryManagement
(
effectivePerson
.
getName
()))
{
wo
=
this
.
manager
(
null
,
null
,
business
,
effectivePerson
.
getName
(),
Wo
.
class
);
wo
=
this
.
manager
(
null
,
null
,
effectivePerson
.
getName
(),
Wo
.
class
);
}
else
{
Person
person
=
this
.
getPerson
(
business
,
effectivePerson
);
wo
=
this
.
user
(
null
,
null
,
business
,
person
,
Wo
.
class
);
this
.
record
(
person
.
getName
(),
request
.
getRemoteAddr
(),
request
.
getHeader
(
HttpToken
.
X_Client
));
this
.
record
Login
(
person
.
getName
(),
request
.
getRemoteAddr
(),
request
.
getHeader
(
HttpToken
.
X_Client
));
}
wo
.
setTokenType
(
effectivePerson
.
getTokenType
());
wo
.
setToken
(
effectivePerson
.
getToken
());
...
...
@@ -73,7 +72,7 @@ class ActionWho extends BaseAction {
case
user:
Person
person
=
this
.
getPerson
(
business
,
effectivePerson
);
wo
=
this
.
user
(
null
,
null
,
business
,
person
,
Wo
.
class
);
this
.
record
(
person
.
getName
(),
request
.
getRemoteAddr
(),
request
.
getHeader
(
HttpToken
.
X_Client
));
this
.
record
Login
(
person
.
getName
(),
request
.
getRemoteAddr
(),
request
.
getHeader
(
HttpToken
.
X_Client
));
break
;
default
:
break
;
...
...
@@ -91,7 +90,7 @@ class ActionWho extends BaseAction {
return
person
;
}
private
void
record
(
String
name
,
String
address
,
String
client
)
throws
Exception
{
private
void
record
Login
(
String
name
,
String
address
,
String
client
)
throws
Exception
{
WrapInLoginRecord
o
=
new
WrapInLoginRecord
();
o
.
setAddress
(
Objects
.
toString
(
address
,
""
));
o
.
setClient
(
Objects
.
toString
(
client
,
""
));
...
...
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/AuthenticationAction.java
浏览文件 @
272735ce
...
...
@@ -86,7 +86,7 @@ public class AuthenticationAction extends StandardJaxrsAction {
logger
.
error
(
e
,
effectivePerson
,
request
,
null
);
result
.
error
(
e
);
}
//擦除密码
//
擦除密码
erasePassword
(
jsonElement
);
asyncResponse
.
resume
(
ResponseFactory
.
getEntityTagActionResultResponse
(
request
,
result
,
jsonElement
));
}
...
...
@@ -157,7 +157,7 @@ public class AuthenticationAction extends StandardJaxrsAction {
logger
.
error
(
e
,
effectivePerson
,
request
,
null
);
result
.
error
(
e
);
}
//擦除密码
//
擦除密码
erasePassword
(
jsonElement
);
asyncResponse
.
resume
(
ResponseFactory
.
getEntityTagActionResultResponse
(
request
,
result
,
jsonElement
));
}
...
...
@@ -371,7 +371,7 @@ public class AuthenticationAction extends StandardJaxrsAction {
ActionResult
<
ActionOauthLogin
.
Wo
>
result
=
new
ActionResult
<>();
EffectivePerson
effectivePerson
=
this
.
effectivePerson
(
request
);
try
{
result
=
new
ActionOauthLogin
().
execute
(
request
,
response
,
effectivePerson
,
name
,
code
,
redirectUri
);
result
=
new
ActionOauthLogin
().
execute
(
request
,
response
,
name
,
code
,
redirectUri
);
}
catch
(
Exception
e
)
{
logger
.
error
(
e
,
effectivePerson
,
request
,
null
);
result
.
error
(
e
);
...
...
o2server/x_organization_assemble_authentication/src/main/java/com/x/organization/assemble/authentication/jaxrs/authentication/BaseAction.java
浏览文件 @
272735ce
package
com.x.organization.assemble.authentication.jaxrs.authentication
;
import
java.lang.reflect.Type
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.Comparator
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Objects
;
import
java.util.regex.Matcher
;
import
java.util.regex.Pattern
;
import
java.util.stream.Collectors
;
import
javax.script.Bindings
;
import
javax.script.CompiledScript
;
import
javax.script.ScriptContext
;
import
javax.script.SimpleScriptContext
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
org.apache.commons.lang3.BooleanUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
com.google.gson.reflect.TypeToken
;
import
com.x.base.core.entity.JpaObject
;
import
com.x.base.core.project.annotation.FieldDescribe
;
import
com.x.base.core.project.bean.NameValuePair
;
...
...
@@ -22,6 +32,7 @@ import com.x.base.core.project.bean.WrapCopierFactory;
import
com.x.base.core.project.config.Config
;
import
com.x.base.core.project.config.Token.OauthClient
;
import
com.x.base.core.project.connection.HttpConnection
;
import
com.x.base.core.project.gson.XGsonBuilder
;
import
com.x.base.core.project.http.EffectivePerson
;
import
com.x.base.core.project.http.HttpToken
;
import
com.x.base.core.project.http.TokenType
;
...
...
@@ -29,6 +40,8 @@ import com.x.base.core.project.jaxrs.StandardJaxrsAction;
import
com.x.base.core.project.logger.Logger
;
import
com.x.base.core.project.logger.LoggerFactory
;
import
com.x.base.core.project.organization.OrganizationDefinition
;
import
com.x.base.core.project.scripting.JsonScriptingExecutor
;
import
com.x.base.core.project.scripting.ScriptingFactory
;
import
com.x.base.core.project.tools.DateTools
;
import
com.x.base.core.project.tools.ListTools
;
import
com.x.organization.assemble.authentication.Business
;
...
...
@@ -40,26 +53,33 @@ abstract class BaseAction extends StandardJaxrsAction {
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
BaseAction
.
class
);
protected
static
final
String
OAUTH_ACCESSTOKEN
=
"access_token"
;
protected
static
final
String
OAUTH_CLIENTID
=
"clientId"
;
protected
static
final
String
OAUTH_CODE
=
"code"
;
protected
static
final
String
OAUTH_REDIRECTURI
=
"redirectUri"
;
private
static
final
Type
OAUTH_PARAMTYPE
=
new
TypeToken
<
Map
<
String
,
Object
>>()
{
}.
getType
();
static
WrapCopier
<
Person
,
WrapOutAuthentication
>
authenticationOutCopier
=
WrapCopierFactory
.
wo
(
Person
.
class
,
WrapOutAuthentication
.
class
,
null
,
JpaObject
.
FieldsInvisible
);
/* 管理员通过密码登录 */
/*
*
管理员通过密码登录 */
<
T
extends
AbstractWoAuthentication
>
T
manager
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Business
business
,
String
credential
,
Class
<
T
>
cls
)
throws
Exception
{
String
credential
,
Class
<
T
>
cls
)
throws
Exception
{
HttpToken
httpToken
=
new
HttpToken
();
TokenType
tokenType
=
TokenType
.
manager
;
if
(
BooleanUtils
.
isTrue
(
Config
.
ternaryManagement
().
getEnable
())){
if
(
BooleanUtils
.
isTrue
(
Config
.
ternaryManagement
().
getEnable
()))
{
tokenType
=
Config
.
ternaryManagement
().
getTokenType
(
credential
);
}
EffectivePerson
effectivePerson
=
new
EffectivePerson
(
credential
,
tokenType
,
Config
.
token
().
getCipher
());
EffectivePerson
effectivePerson
=
new
EffectivePerson
(
credential
,
tokenType
,
Config
.
token
().
getCipher
());
if
((
null
!=
request
)
&&
(
null
!=
response
))
{
httpToken
.
setToken
(
request
,
response
,
effectivePerson
);
}
T
t
=
cls
.
getDeclaredConstructor
().
newInstance
();
if
(
BooleanUtils
.
isTrue
(
Config
.
ternaryManagement
().
getEnable
())){
if
(
BooleanUtils
.
isTrue
(
Config
.
ternaryManagement
().
getEnable
()))
{
Config
.
ternaryManagement
().
initialManagerInstance
(
credential
).
copyTo
(
t
);
}
else
{
}
else
{
Config
.
token
().
initialManagerInstance
().
copyTo
(
t
);
}
t
.
setTokenType
(
tokenType
);
...
...
@@ -75,8 +95,6 @@ abstract class BaseAction extends StandardJaxrsAction {
HttpToken
httpToken
=
new
HttpToken
();
TokenType
tokenType
=
TokenType
.
user
;
List
<
String
>
roles
=
business
.
organization
().
role
().
listWithPerson
(
person
.
getDistinguishedName
());
// boolean isManager = business.organization().person().hasRole(person.getDistinguishedName(),
// OrganizationDefinition.Manager);
if
(
roles
.
contains
(
OrganizationDefinition
.
toDistinguishedName
(
OrganizationDefinition
.
Manager
)))
{
tokenType
=
TokenType
.
manager
;
}
else
if
(
roles
.
contains
(
OrganizationDefinition
.
toDistinguishedName
(
OrganizationDefinition
.
SystemManager
)))
{
...
...
@@ -109,7 +127,7 @@ abstract class BaseAction extends StandardJaxrsAction {
return
t
;
}
public
static
abstract
class
AbstractWoAuthentication
extends
Person
{
public
abstract
static
class
AbstractWoAuthentication
extends
Person
{
private
static
final
long
serialVersionUID
=
6043043594889691395L
;
@FieldDescribe
(
"令牌类型"
)
...
...
@@ -182,18 +200,6 @@ abstract class BaseAction extends StandardJaxrsAction {
}
}
// private List<String> listRole(Business business, String personId) throws
// Exception {
// List<String> roles = new ArrayList<>();
// for (Role o :
// business.entityManagerContainer().fetch(business.role().listWithPerson(personId),
// Role.class,
// ListTools.toList(Role.DISTINGUISHEDNAME))) {
// roles.add(o.getDistinguishedName());
// }
// return roles;
// }
private
List
<
WoIdentity
>
listIdentity
(
Business
business
,
String
personId
)
throws
Exception
{
List
<
String
>
ids
=
business
.
identity
().
listWithPerson
(
personId
);
List
<
WoIdentity
>
list
=
business
.
entityManagerContainer
().
fetch
(
ids
,
WoIdentity
.
copier
);
...
...
@@ -202,103 +208,143 @@ abstract class BaseAction extends StandardJaxrsAction {
return
list
;
}
protected
static
String
[]
AUTH_PARAMETER_TAGS
=
new
String
[]
{
"{$client_id}"
,
"{$client_secret}"
};
protected
static
String
[]
TOKEN_PARAMETER_TAGS
=
new
String
[]
{
"{$client_id}"
,
"{$client_secret}"
,
"{$redirect_uri}"
,
"{$code}"
};
protected
OauthClient
oauthClient
(
String
name
)
throws
Exception
{
if
(
ListTools
.
isNotEmpty
(
Config
.
token
().
getOauthClients
()))
{
for
(
OauthClient
o
:
Config
.
token
().
getOauthClients
())
{
if
(
BooleanUtils
.
isTrue
(
o
.
getEnable
())
&&
StringUtils
.
equals
(
o
.
getName
(),
name
))
{
return
o
;
}
}
}
throw
new
ExceptionOauthNotExist
(
name
);
}
protected
static
String
[]
INFO_PARAMETER_TAGS
=
new
String
[]
{
"{$client_id}"
,
"{$client_secret}"
,
"{$redirect_uri}"
,
"{$access_token}"
,
"{$refresh_token}"
};
protected
Map
<
String
,
Object
>
oauthCreateParam
(
OauthClient
oauthClient
,
String
code
,
String
redirectUri
)
{
Map
<
String
,
Object
>
param
=
new
HashMap
<>();
param
.
put
(
OAUTH_CLIENTID
,
oauthClient
.
getClientId
());
param
.
put
(
OAUTH_CODE
,
code
);
param
.
put
(
OAUTH_REDIRECTURI
,
redirectUri
);
return
param
;
}
protected
String
oauthClientTokenGet
(
OauthClient
oauthClient
,
String
redirectUri
,
String
code
)
throws
Exception
{
protected
String
oauthClientTokenGet
(
OauthClient
oauthClient
,
Map
<
String
,
Object
>
param
)
throws
Exception
{
String
address
=
oauthClient
.
getTokenAddress
();
String
parameter
=
fill
TokenParameter
(
oauthClient
.
getTokenParameter
(),
oauthClient
,
redirectUri
,
code
);
String
parameter
=
fill
Parameter
(
oauthClient
.
getTokenParameter
(),
param
);
if
(
StringUtils
.
contains
(
address
,
"?"
))
{
address
=
address
+
"&"
+
parameter
;
}
else
{
address
=
address
+
"?"
+
parameter
;
}
logger
.
debug
(
"token get address:{}."
,
address
);
String
str
=
HttpConnection
.
getAsString
(
address
,
null
);
return
str
;
return
HttpConnection
.
getAsString
(
address
,
null
);
}
protected
String
oauthClientTokenPost
(
OauthClient
oauthClient
,
String
redirectUri
,
String
code
)
throws
Exception
{
protected
String
oauthClientTokenPost
(
OauthClient
oauthClient
,
Map
<
String
,
Object
>
param
)
throws
Exception
{
String
address
=
oauthClient
.
getTokenAddress
();
String
parameter
=
fill
TokenParameter
(
oauthClient
.
getTokenParameter
(),
oauthClient
,
redirectUri
,
code
);
String
parameter
=
fill
Parameter
(
oauthClient
.
getTokenParameter
(),
param
);
logger
.
debug
(
"token post address:{}."
,
address
);
logger
.
debug
(
"token post parameter:{}."
,
parameter
);
List
<
NameValuePair
>
heads
=
null
;
// if (StringUtils.equalsIgnoreCase(oauthClient.getTokenType(), "form")) {
heads
=
new
ArrayList
<>();
List
<
NameValuePair
>
heads
=
new
ArrayList
<>();
heads
.
add
(
new
NameValuePair
(
"Content-Type"
,
"application/x-www-form-urlencoded;charset=UTF-8"
));
// }
String
str
=
HttpConnection
.
postAsString
(
address
,
heads
,
parameter
);
return
str
;
return
HttpConnection
.
postAsString
(
address
,
heads
,
parameter
);
}
protected
String
oauthClientInfoGet
(
OauthClient
oauthClient
,
String
redirectUri
,
String
accessToken
,
String
refreshToken
)
throws
Exception
{
protected
String
oauthClientInfoGet
(
OauthClient
oauthClient
,
Map
<
String
,
Object
>
param
)
throws
Exception
{
String
address
=
oauthClient
.
getInfoAddress
();
String
parameter
=
fillInfoParameter
(
oauthClient
.
getInfoParameter
(),
oauthClient
,
redirectUri
,
accessToken
,
refreshToken
);
String
parameter
=
fillParameter
(
oauthClient
.
getInfoParameter
(),
param
);
if
(
StringUtils
.
contains
(
address
,
"?"
))
{
address
=
address
+
"&"
+
parameter
;
}
else
{
address
=
address
+
"?"
+
parameter
;
}
String
str
=
HttpConnection
.
getAsString
(
address
,
null
);
return
str
;
return
HttpConnection
.
getAsString
(
address
,
null
);
}
protected
String
oauthClientInfoPost
(
OauthClient
oauthClient
,
String
redirectUri
,
String
accessToken
,
String
refreshToken
)
throws
Exception
{
protected
String
oauthClientInfoPost
(
OauthClient
oauthClient
,
Map
<
String
,
Object
>
param
)
throws
Exception
{
String
address
=
oauthClient
.
getInfoAddress
();
String
parameter
=
fillInfoParameter
(
oauthClient
.
getInfoParameter
(),
oauthClient
,
redirectUri
,
accessToken
,
refreshToken
);
String
parameter
=
fillParameter
(
oauthClient
.
getInfoParameter
(),
param
);
logger
.
debug
(
"info post address:{}."
,
address
);
logger
.
debug
(
"info post parameter:{}."
,
parameter
);
String
str
=
HttpConnection
.
postAsString
(
address
,
null
,
parameter
);
return
str
;
return
HttpConnection
.
postAsString
(
address
,
null
,
parameter
);
}
protected
OauthClient
getOauthClient
(
String
name
)
throws
Exception
{
if
(
ListTools
.
isNotEmpty
(
Config
.
token
().
getOauthClients
()))
{
for
(
OauthClient
o
:
Config
.
token
().
getOauthClients
())
{
if
(
BooleanUtils
.
isTrue
(
o
.
getEnable
())
&&
StringUtils
.
equals
(
o
.
getName
(),
name
))
{
return
o
;
}
}
protected
void
oauthToken
(
OauthClient
oauthClient
,
Map
<
String
,
Object
>
param
)
throws
Exception
{
String
body
=
null
;
if
(
StringUtils
.
equalsIgnoreCase
(
"post"
,
oauthClient
.
getTokenMethod
()))
{
body
=
this
.
oauthClientTokenPost
(
oauthClient
,
param
);
}
else
{
body
=
this
.
oauthClientTokenGet
(
oauthClient
,
param
);
}
logger
.
debug
(
"body:{}"
,
body
);
if
(
StringUtils
.
equalsIgnoreCase
(
oauthClient
.
getTokenType
(),
"json"
))
{
param
.
putAll
(
gson
.
fromJson
(
body
,
OAUTH_PARAMTYPE
));
}
else
{
Arrays
.
stream
(
StringUtils
.
split
(
body
,
"&"
)).
forEach
(
o
->
{
String
[]
values
=
StringUtils
.
split
(
o
,
"="
);
param
.
put
(
values
[
0
],
values
[
1
]);
});
}
return
null
;
}
protected
String
fillAuthParameter
(
String
url
,
OauthClient
oauthClient
)
throws
Exception
{
return
StringUtils
.
replaceEach
(
url
,
AUTH_PARAMETER_TAGS
,
new
String
[]
{
oauthClient
.
getClientId
(),
oauthClient
.
getClientSecret
()
});
protected
void
oauthCheckAccessToken
(
Map
<
String
,
Object
>
param
)
throws
ExceptionOauthEmptyAccessToken
{
if
(
StringUtils
.
isEmpty
(
Objects
.
toString
(
param
.
get
(
OAUTH_ACCESSTOKEN
))))
{
throw
new
ExceptionOauthEmptyAccessToken
();
}
}
protected
String
fillTokenParameter
(
String
url
,
OauthClient
oauthClient
,
String
redirectUri
,
String
code
)
throws
Exception
{
return
StringUtils
.
replaceEach
(
url
,
TOKEN_PARAMETER_TAGS
,
new
String
[]
{
oauthClient
.
getClientId
(),
oauthClient
.
getClientSecret
(),
redirectUri
,
code
});
protected
void
oauthCheckCredential
(
String
credential
)
throws
ExceptionOauthEmptyCredential
{
if
(
StringUtils
.
isEmpty
(
credential
))
{
throw
new
ExceptionOauthEmptyCredential
();
}
}
protected
void
oauthInfo
(
OauthClient
oauthClient
,
Map
<
String
,
Object
>
param
)
throws
Exception
{
if
(
StringUtils
.
isBlank
(
oauthClient
.
getInfoAddress
()))
{
return
;
}
String
body
=
null
;
if
(
StringUtils
.
equalsIgnoreCase
(
"post"
,
oauthClient
.
getInfoMethod
()))
{
body
=
this
.
oauthClientInfoPost
(
oauthClient
,
param
);
}
else
{
body
=
this
.
oauthClientInfoGet
(
oauthClient
,
param
);
}
logger
.
debug
(
"infoBody:{}"
,
body
);
if
(
StringUtils
.
isEmpty
(
body
))
{
throw
new
ExceptionOauthEmptyInfo
();
}
if
(
StringUtils
.
equalsIgnoreCase
(
oauthClient
.
getInfoType
(),
"json"
))
{
param
.
putAll
(
gson
.
fromJson
(
body
,
OAUTH_PARAMTYPE
));
}
else
if
(
StringUtils
.
equalsIgnoreCase
(
oauthClient
.
getInfoType
(),
"form"
))
{
Arrays
.
stream
(
StringUtils
.
split
(
body
,
"&"
)).
forEach
(
o
->
{
String
[]
values
=
StringUtils
.
split
(
o
,
"="
);
param
.
put
(
values
[
0
],
values
[
1
]);
});
}
else
{
logger
.
debug
(
"info script:{}."
,
oauthClient
.
getInfoScriptText
());
CompiledScript
sc
=
ScriptingFactory
.
functionalizationCompile
(
oauthClient
.
getInfoScriptText
());
ScriptContext
scriptContext
=
new
SimpleScriptContext
();
Bindings
bindings
=
scriptContext
.
getBindings
(
ScriptContext
.
ENGINE_SCOPE
);
bindings
.
put
(
"text"
,
body
);
JsonScriptingExecutor
.
jsonElement
(
sc
,
scriptContext
,
jsonElement
->
{
Map
<
String
,
Object
>
info
=
XGsonBuilder
.
instance
().
fromJson
(
jsonElement
,
OAUTH_PARAMTYPE
);
param
.
putAll
(
info
);
});
}
}
protected
String
fillInfoParameter
(
String
url
,
OauthClient
oauthClient
,
String
redirectUri
,
String
accessToken
,
String
refreshToken
)
throws
Exception
{
return
StringUtils
.
replaceEach
(
url
,
INFO_PARAMETER_TAGS
,
new
String
[]
{
oauthClient
.
getClientId
(),
oauthClient
.
getClientSecret
(),
redirectUri
,
accessToken
,
refreshToken
});
protected
String
fillParameter
(
String
txt
,
Map
<
String
,
Object
>
param
)
{
Pattern
pattern
=
Pattern
.
compile
(
"\\{\\$(.+?)\\}"
);
Matcher
matcher
=
pattern
.
matcher
(
txt
);
while
(
matcher
.
find
())
{
txt
=
StringUtils
.
replace
(
txt
,
matcher
.
group
(),
Objects
.
toString
(
param
.
get
(
matcher
.
group
(
1
))));
}
return
txt
;
}
protected
boolean
failureLocked
(
Person
person
)
throws
Exception
{
if
((
person
.
getFailureCount
()
!=
null
)
&&
(
person
.
getFailureCount
()
>=
Config
.
person
().
getFailureCount
()))
{
if
(!
DateTools
.
beforeNowMinutesNullIsTrue
(
person
.
getFailureTime
(),
Config
.
person
().
getFailureInterval
()))
{
return
true
;
}
}
return
false
;
return
(((
person
.
getFailureCount
()
!=
null
)
&&
(
person
.
getFailureCount
()
>=
Config
.
person
().
getFailureCount
()))
&&
(!
DateTools
.
beforeNowMinutesNullIsTrue
(
person
.
getFailureTime
(),
Config
.
person
().
getFailureInterval
())));
}
protected
void
failure
(
Person
person
)
throws
Exception
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录