Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
yujianwangzivayy
MaxKey
提交
8110d994
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,发现更多精彩内容 >>
提交
8110d994
编写于
1月 06, 2020
作者:
MaxKey单点登录官方
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add banner
add banner
上级
b6b81c30
变更
22
隐藏空白更改
内联
并排
Showing
22 changed file
with
102 addition
and
349 deletion
+102
-349
build.gradle
build.gradle
+1
-1
maxkey-core/src/main/java/org/maxkey/web/ImageEndpoint.java
maxkey-core/src/main/java/org/maxkey/web/ImageEndpoint.java
+2
-2
maxkey-web-manage/src/main/java/org/maxkey/web/endpoint/LogoutEndpoint.java
...src/main/java/org/maxkey/web/endpoint/LogoutEndpoint.java
+0
-2
maxkey-web-manage/src/main/java/org/maxkey/web/interceptor/PermissionAdapter.java
...in/java/org/maxkey/web/interceptor/PermissionAdapter.java
+2
-1
maxkey-web-manage/src/main/resources/application.properties
maxkey-web-manage/src/main/resources/application.properties
+3
-0
maxkey-web-manage/src/main/resources/banner.txt
maxkey-web-manage/src/main/resources/banner.txt
+7
-0
maxkey-web-manage/src/main/resources/log4j2.xml
maxkey-web-manage/src/main/resources/log4j2.xml
+5
-2
maxkey-web-manage/src/main/resources/spring/maxkey-mgt-security.xml
...-manage/src/main/resources/spring/maxkey-mgt-security.xml
+11
-18
maxkey-web-manage/src/main/resources/templates/views/layout/left.ftl
...manage/src/main/resources/templates/views/layout/left.ftl
+0
-2
maxkey-web-manage/src/main/resources/templates/views/layout/nav_primary.ftl
...src/main/resources/templates/views/layout/nav_primary.ftl
+0
-84
maxkey-web-manage/src/main/resources/templates/views/layout/nav_second.ftl
.../src/main/resources/templates/views/layout/nav_second.ftl
+0
-1
maxkey-web-manage/src/main/resources/templates/views/layout/nav_third.ftl
...e/src/main/resources/templates/views/layout/nav_third.ftl
+0
-0
maxkey-web-maxkey/src/main/java/org/maxkey/MaxKeyConfig.java
maxkey-web-maxkey/src/main/java/org/maxkey/MaxKeyConfig.java
+24
-0
maxkey-web-maxkey/src/main/java/org/maxkey/web/contorller/OneTimePasswordController.java
.../org/maxkey/web/contorller/OneTimePasswordController.java
+17
-26
maxkey-web-maxkey/src/main/java/org/maxkey/web/endpoint/ImageEndpoint.java
.../src/main/java/org/maxkey/web/endpoint/ImageEndpoint.java
+0
-138
maxkey-web-maxkey/src/main/java/org/maxkey/web/interceptor/PermissionAdapter.java
...in/java/org/maxkey/web/interceptor/PermissionAdapter.java
+2
-1
maxkey-web-maxkey/src/main/resources/application.properties
maxkey-web-maxkey/src/main/resources/application.properties
+3
-0
maxkey-web-maxkey/src/main/resources/banner.txt
maxkey-web-maxkey/src/main/resources/banner.txt
+7
-0
maxkey-web-maxkey/src/main/resources/log4j2.xml
maxkey-web-maxkey/src/main/resources/log4j2.xml
+5
-2
maxkey-web-maxkey/src/main/resources/spring/maxkey-security.xml
...-web-maxkey/src/main/resources/spring/maxkey-security.xml
+13
-67
maxkey-web-maxkey/src/main/resources/templates/views/layout/left.ftl
...maxkey/src/main/resources/templates/views/layout/left.ftl
+0
-2
maxkey-web-maxkey/src/main/resources/templates/views/layout/nav_third.ftl
...y/src/main/resources/templates/views/layout/nav_third.ftl
+0
-0
未找到文件。
build.gradle
浏览文件 @
8110d994
...
...
@@ -147,7 +147,7 @@ subprojects {
compile
group:
'org.apache.httpcomponents'
,
name:
'httpcore'
,
version:
'4.4.10'
compile
group:
'org.apache.velocity'
,
name:
'velocity'
,
version:
'1.7'
compile
group:
'velocity'
,
name:
'velocity-dep'
,
version:
'1.4'
compile
group:
'org.freemarker'
,
name:
'freemarker'
,
version:
'2.3.2
8
'
compile
group:
'org.freemarker'
,
name:
'freemarker'
,
version:
'2.3.2
9
'
compile
group:
'org.apache.commons'
,
name:
'not-yet-commons-ssl'
,
version:
'0.3.9'
//logs
compile
group:
'org.apache.logging.log4j'
,
name:
'log4j-1.2-api'
,
version:
"${log4jVersion}"
...
...
maxkey-
web-manage/src/main/java/org/maxkey/web/endpoint
/ImageEndpoint.java
→
maxkey-
core/src/main/java/org/maxkey/web
/ImageEndpoint.java
浏览文件 @
8110d994
package
org.maxkey.web
.endpoint
;
package
org.maxkey.web
;
import
java.awt.image.BufferedImage
;
import
java.io.ByteArrayInputStream
;
...
...
@@ -52,7 +52,7 @@ public class ImageEndpoint {
response
.
setContentType
(
"image/jpeg"
);
// create the text for the image
String
capText
=
captchaProducer
.
createText
();
_logger
.
debug
(
"Sesssion id "
+
request
.
getSession
().
getId
()
+
" , Captcha Text is "
+
capText
);
_logger
.
trace
(
"Sesssion id "
+
request
.
getSession
().
getId
()
+
" , Captcha Text is "
+
capText
);
// store the text in the session
request
.
getSession
().
setAttribute
(
WebConstants
.
KAPTCHA_SESSION_KEY
,
capText
);
// create the image with the text
...
...
maxkey-web-manage/src/main/java/org/maxkey/web/endpoint/LogoutEndpoint.java
浏览文件 @
8110d994
...
...
@@ -3,8 +3,6 @@ package org.maxkey.web.endpoint;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
org.apache.commons.logging.Log
;
import
org.apache.commons.logging.LogFactory
;
import
org.maxkey.authn.realm.AbstractAuthenticationRealm
;
import
org.maxkey.web.WebConstants
;
import
org.maxkey.web.WebContext
;
...
...
maxkey-web-manage/src/main/java/org/maxkey/web/interceptor/PermissionAdapter.java
浏览文件 @
8110d994
...
...
@@ -36,10 +36,11 @@ public class PermissionAdapter extends HandlerInterceptorAdapter {
*/
@Override
public
boolean
preHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
)
throws
Exception
{
_logger
.
debug
(
"PermissionAdapter preHandle"
);
_logger
.
trace
(
"PermissionAdapter preHandle"
);
//判断用户是否登录
if
(
WebContext
.
getAuthentication
()==
null
||
WebContext
.
getAuthentication
().
getAuthorities
()==
null
){
//判断用户和角色,判断用户是否登录用户
_logger
.
trace
(
"No Authentication ... forward to /login"
);
RequestDispatcher
dispatcher
=
request
.
getRequestDispatcher
(
"/login"
);
dispatcher
.
forward
(
request
,
response
);
return
false
;
...
...
maxkey-web-manage/src/main/resources/application.properties
浏览文件 @
8110d994
...
...
@@ -5,6 +5,9 @@ server.port=9521
#web app context path
server.servlet.context-path
=
/maxkey-mgt
application.name
=
MaxKey-Mgt
application.formatted-version
=
v1.1 GA
#for freemarker
spring.freemarker.template-loader-path
=
classpath:/templates/views
spring.freemarker.cache
=
false
...
...
maxkey-web-manage/src/main/resources/banner.txt
0 → 100644
浏览文件 @
8110d994
__ ___ __ __
/ |/ /__ ___ __ / //_/__ __ __
/ /|_/ / _ `/\ \ // ,< / -_) // /
/_/ /_/\_,_//_\_\/_/|_|\__/\_, /
/___/
${application.formatted-version}
:: Spring Boot :: ${spring-boot.formatted-version}
\ No newline at end of file
maxkey-web-manage/src/main/resources/log4j2.xml
浏览文件 @
8110d994
<?xml version="1.0" encoding="UTF-8"?>
<configuration
status=
"INFO"
monitorInterval=
"300"
>
<!--DOCTYPE log4j:configuration SYSTEM "log4j.dtd" -->
<log4j:configuration
xmlns:log4j=
"http://jakarta.apache.org/log4j/"
status=
"INFO"
monitorInterval=
"300"
>
<appenders>
<Console
name=
"consolePrint"
target=
"SYSTEM_OUT"
>
...
...
@@ -31,4 +34,4 @@
<appender-ref
ref=
"RollingFile"
/>
</root>
</loggers>
</configuration>
\ No newline at end of file
</log4j:configuration>
\ No newline at end of file
maxkey-web-manage/src/main/resources/spring/maxkey-mgt-security.xml
浏览文件 @
8110d994
...
...
@@ -58,25 +58,18 @@
<mvc:interceptors>
<!-- web Controller InterceptorAdapter for platform permission -->
<mvc:interceptor>
<!-- for index -->
<mvc:mapping
path=
"/index/*"
/>
<!-- for System -->
<mvc:mapping
path=
"/menus/*"
/>
<mvc:mapping
path=
"/roles/*"
/>
<mvc:mapping
path=
"/logs/*"
/>
<mvc:mapping
path=
"/userinfo/*"
/>
<mvc:mapping
path=
"/relyingparty/*"
/>
<mvc:mapping
path=
"/sysconfig/*"
/>
<mvc:mapping
path=
"/roles/*"
/>
<mvc:mapping
path=
"/applications/*"
/>
<mvc:mapping
path=
"/approles/*"
/>
<mvc:mapping
path=
"/main*/**"
/>
<mvc:mapping
path=
"/main*/**"
/>
<mvc:mapping
path=
"/orgs*/**"
/>
<mvc:mapping
path=
"/userinfo*/**"
/>
<mvc:mapping
path=
"/apps*/**"
/>
<mvc:mapping
path=
"/app*/**"
/>
<mvc:mapping
path=
"/groups*/**"
/>
<mvc:mapping
path=
"/groupMember*/**"
/>
<mvc:mapping
path=
"/groupPrivileges*/**"
/>
<mvc:mapping
path=
"/config*/**"
/>
<mvc:mapping
path=
"/logs*/**"
/>
<mvc:mapping
path=
"/users/*"
/>
<mvc:mapping
path=
"/enterprises/*"
/>
<mvc:mapping
path=
"/employees/*"
/>
<mvc:mapping
path=
"/authInfo/*"
/>
<mvc:mapping
path=
"/usercenter/*"
/>
<bean
class=
"org.maxkey.web.interceptor.PermissionAdapter"
/>
</mvc:interceptor>
<!-- web Controller InterceptorAdapter for platform log -->
...
...
maxkey-web-manage/src/main/resources/templates/views/layout/left.ftl
已删除
100644 → 0
浏览文件 @
b6b81c30
maxkey-web-manage/src/main/resources/templates/views/layout/nav_primary.ftl
已删除
100644 → 0
浏览文件 @
b6b81c30
<div id="nav_primary" >
<div id="nav_primary" class="menuprimary">
<ul >
<li id="nav_primay_11" class="nav_primay_level primaryleft" xpath="">
<a href="<@base/>/appList">我的应用</a>
</li>
<li id="nav_primay_12" class="nav_primay_level primaryleft" xpath="">
<a href="<@base/>/socialsignon/list">认证关联</a>
</li>
<li id="nav_primay_13" class="nav_primay_level primaryleft" xpath="">
<a href="<@base/>/safe/forward/setting">安全设置</a>
<div id="nav_child_1301" class="nav_second_child">
<ul>
<li id="nav_second_1301" class="nav_second_level">
<a href="<@base/>/safe/forward/setting">安全设置</a>
</li>
</ul>
<ul>
<li id="nav_second_1302" class="nav_second_level">
<a href="<@base/>/safe/forward/changePasswod">密码修改</a>
</li>
</ul>
<ul>
<li id="nav_second_1303" class="nav_second_level">
<a href="<@base/>/safe/forward/changeAppLoginPasswod">应用登录密码</a>
</li>
</ul>
<ul>
<li id="nav_second_1304" class="nav_second_level">
<a href="<@base/>/appConfigList">应用配置</a>
</li>
</ul>
<ul>
<li id="nav_second_1305" class="nav_second_level">
<a href="<@base/>/safe/otp/timebased">时间令牌</a>
</li>
</ul>
</div>
</li>
<li id="nav_primay_14" class="nav_primay_level primaryleft" xpath="">
<a href="<@base/>/profile/myProfile">我的资料</a>
</li>
<li id="nav_primay_15" class="nav_primay_level primaryleft" xpath="">
<a href="<@base/>/logs/loginHistoryList">日志审计</a>
<div id="nav_child_1501" class="nav_second_child">
<ul>
<li id="nav_second_1501" class="nav_second_level">
<a href="<@base/>/logs/loginHistoryList">登录日志</a>
</li>
</ul>
<ul>
<li id="nav_second_1502" class="nav_second_level">
<a href="<@base/>/logs/loginAppHistoryList">访问日志</a>
</li>
</ul>
<ul>
<li id="nav_second_1503" class="nav_second_level">
<a href="<@base/>/logs/list">操作日志</a>
</li>
</ul>
</div>
</li>
</ul>
</div>
</div>
<div id="nav_second" style="clear: left"><div class='menusecond'></div><br style='clear: left' /></div>
<script>
$(function(){
function displaySecondNavs(menuId){
if($("#"+menuId+" .nav_second_child").html()){
$("#nav_second").html("<div class='menusecond'>"+$("#"+menuId+" .nav_second_child").html()+"</div><br style='clear: left' />");
}else{
$("#nav_second").html("");
}
}
displaySecondNavs('${Request["mnid"]!"nav_primay_15"}');
$(".menuprimary ul li").mouseover(function(){
displaySecondNavs(this.id);
});
});
</script>
\ No newline at end of file
maxkey-web-manage/src/main/resources/templates/views/layout/nav_second.ftl
已删除
100644 → 0
浏览文件 @
b6b81c30
<div class='menusecond'></div><br style='clear: left' />
maxkey-web-manage/src/main/resources/templates/views/layout/nav_third.ftl
已删除
100644 → 0
浏览文件 @
b6b81c30
maxkey-web-maxkey/src/main/java/org/maxkey/MaxKeyConfig.java
浏览文件 @
8110d994
...
...
@@ -2,11 +2,15 @@ package org.maxkey;
import
org.maxkey.authz.oauth2.provider.endpoint.TokenEndpointAuthenticationFilter
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.boot.web.server.ConfigurableWebServerFactory
;
import
org.springframework.boot.web.server.ErrorPage
;
import
org.springframework.boot.web.server.WebServerFactoryCustomizer
;
import
org.springframework.boot.web.servlet.FilterRegistrationBean
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.ImportResource
;
import
org.springframework.context.annotation.PropertySource
;
import
org.springframework.http.HttpStatus
;
@Configuration
@ImportResource
(
locations
={
"classpath:spring/maxkey.xml"
})
...
...
@@ -32,4 +36,24 @@ public class MaxKeyConfig {
registration
.
setOrder
(
1
);
return
registration
;
}
/**
* 配置默认错误页面(仅用于内嵌tomcat启动时)
* 使用这种方式,在打包为war后不起作用
*
* @return
*/
@Bean
public
WebServerFactoryCustomizer
<
ConfigurableWebServerFactory
>
webServerFactoryCustomizer
()
{
return
new
WebServerFactoryCustomizer
<
ConfigurableWebServerFactory
>()
{
@Override
public
void
customize
(
ConfigurableWebServerFactory
factory
)
{
ErrorPage
errorPage400
=
new
ErrorPage
(
HttpStatus
.
BAD_REQUEST
,
"/error-400"
);
ErrorPage
errorPage404
=
new
ErrorPage
(
HttpStatus
.
NOT_FOUND
,
"/error-404"
);
ErrorPage
errorPage500
=
new
ErrorPage
(
HttpStatus
.
INTERNAL_SERVER_ERROR
,
"/error-500"
);
factory
.
addErrorPages
(
errorPage400
,
errorPage404
,
errorPage500
);
}
};
}
}
maxkey-web-maxkey/src/main/java/org/maxkey/web/contorller/OneTimePasswordController.java
浏览文件 @
8110d994
...
...
@@ -12,7 +12,7 @@ import org.maxkey.dao.service.UserInfoService;
import
org.maxkey.domain.UserInfo
;
import
org.maxkey.util.RQCodeUtils
;
import
org.maxkey.web.WebContext
;
import
org.maxkey.web.
endpoint.
ImageEndpoint
;
import
org.maxkey.web.ImageEndpoint
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
...
@@ -36,34 +36,25 @@ public class OneTimePasswordController {
private
UserInfoService
userInfoService
;
@Autowired
@Qualifier
(
"timeBasedKeyUriFormat"
)
KeyUriFormat
timeBasedKeyUriFormat
;
@Autowired
@Qualifier
(
"counterBasedKeyUriFormat"
)
KeyUriFormat
counterBasedKeyUriFormat
;
@Autowired
@Qualifier
(
"hotpKeyUriFormat"
)
KeyUriFormat
hotpKeyUriFormat
;
@Qualifier
(
"keyUriFormat"
)
KeyUriFormat
keyUriFormat
;
@Autowired
@Qualifier
(
"passwordReciprocal"
)
PasswordReciprocal
passwordReciprocal
;
@RequestMapping
(
value
={
"/timebased"
})
public
ModelAndView
timebased
(){
ModelAndView
modelAndView
=
new
ModelAndView
(
"safe/timeBased"
);
UserInfo
userInfo
=
WebContext
.
getUserInfo
();
String
sharedSecret
=
passwordReciprocal
.
decoder
(
userInfo
.
getSharedSecret
());
timeBasedK
eyUriFormat
.
setSecret
(
sharedSecret
);
String
otpauth
=
timeBasedK
eyUriFormat
.
format
(
userInfo
.
getUsername
());
k
eyUriFormat
.
setSecret
(
sharedSecret
);
String
otpauth
=
k
eyUriFormat
.
format
(
userInfo
.
getUsername
());
byte
[]
byteSharedSecret
=
Base32Utils
.
decode
(
sharedSecret
);
String
hexSharedSecret
=
Hex
.
encodeHexString
(
byteSharedSecret
);
modelAndView
.
addObject
(
"id"
,
genRQCode
(
otpauth
));
modelAndView
.
addObject
(
"userInfo"
,
userInfo
);
modelAndView
.
addObject
(
"format"
,
timeBasedK
eyUriFormat
);
modelAndView
.
addObject
(
"format"
,
k
eyUriFormat
);
modelAndView
.
addObject
(
"sharedSecret"
,
sharedSecret
);
modelAndView
.
addObject
(
"hexSharedSecret"
,
hexSharedSecret
);
return
modelAndView
;
...
...
@@ -72,7 +63,7 @@ public class OneTimePasswordController {
@RequestMapping
(
value
={
"gen/timebased"
})
public
ModelAndView
gentimebased
(){
UserInfo
userInfo
=
WebContext
.
getUserInfo
();
byte
[]
byteSharedSecret
=
OTPSecret
.
generate
(
timeBasedK
eyUriFormat
.
getCrypto
());
byte
[]
byteSharedSecret
=
OTPSecret
.
generate
(
k
eyUriFormat
.
getCrypto
());
String
sharedSecret
=
Base32Utils
.
encode
(
byteSharedSecret
);
sharedSecret
=
passwordReciprocal
.
encode
(
sharedSecret
);
userInfo
.
setSharedSecret
(
sharedSecret
);
...
...
@@ -87,15 +78,15 @@ public class OneTimePasswordController {
ModelAndView
modelAndView
=
new
ModelAndView
(
"safe/counterBased"
);
UserInfo
userInfo
=
WebContext
.
getUserInfo
();
String
sharedSecret
=
passwordReciprocal
.
decoder
(
userInfo
.
getSharedSecret
());
counterBasedK
eyUriFormat
.
setSecret
(
sharedSecret
);
counterBasedK
eyUriFormat
.
setCounter
(
Long
.
parseLong
(
userInfo
.
getSharedCounter
()));
String
otpauth
=
counterBasedK
eyUriFormat
.
format
(
userInfo
.
getUsername
());
k
eyUriFormat
.
setSecret
(
sharedSecret
);
k
eyUriFormat
.
setCounter
(
Long
.
parseLong
(
userInfo
.
getSharedCounter
()));
String
otpauth
=
k
eyUriFormat
.
format
(
userInfo
.
getUsername
());
byte
[]
byteSharedSecret
=
Base32Utils
.
decode
(
sharedSecret
);
String
hexSharedSecret
=
Hex
.
encodeHexString
(
byteSharedSecret
);
modelAndView
.
addObject
(
"id"
,
genRQCode
(
otpauth
));
modelAndView
.
addObject
(
"userInfo"
,
userInfo
);
modelAndView
.
addObject
(
"format"
,
counterBasedK
eyUriFormat
);
modelAndView
.
addObject
(
"format"
,
k
eyUriFormat
);
modelAndView
.
addObject
(
"sharedSecret"
,
sharedSecret
);
modelAndView
.
addObject
(
"hexSharedSecret"
,
hexSharedSecret
);
return
modelAndView
;
...
...
@@ -105,7 +96,7 @@ public class OneTimePasswordController {
@RequestMapping
(
value
={
"gen/counterbased"
})
public
ModelAndView
gencounterbased
(){
UserInfo
userInfo
=
WebContext
.
getUserInfo
();
byte
[]
byteSharedSecret
=
OTPSecret
.
generate
(
counterBasedK
eyUriFormat
.
getCrypto
());
byte
[]
byteSharedSecret
=
OTPSecret
.
generate
(
k
eyUriFormat
.
getCrypto
());
String
sharedSecret
=
Base32Utils
.
encode
(
byteSharedSecret
);
sharedSecret
=
passwordReciprocal
.
encode
(
sharedSecret
);
userInfo
.
setSharedSecret
(
sharedSecret
);
...
...
@@ -120,14 +111,14 @@ public class OneTimePasswordController {
ModelAndView
modelAndView
=
new
ModelAndView
(
"safe/hotp"
);
UserInfo
userInfo
=
WebContext
.
getUserInfo
();
String
sharedSecret
=
passwordReciprocal
.
decoder
(
userInfo
.
getSharedSecret
());
hotpK
eyUriFormat
.
setSecret
(
sharedSecret
);
hotpK
eyUriFormat
.
setCounter
(
Long
.
parseLong
(
userInfo
.
getSharedCounter
()));
String
otpauth
=
hotpK
eyUriFormat
.
format
(
userInfo
.
getUsername
());
k
eyUriFormat
.
setSecret
(
sharedSecret
);
k
eyUriFormat
.
setCounter
(
Long
.
parseLong
(
userInfo
.
getSharedCounter
()));
String
otpauth
=
k
eyUriFormat
.
format
(
userInfo
.
getUsername
());
byte
[]
byteSharedSecret
=
Base32Utils
.
decode
(
sharedSecret
);
String
hexSharedSecret
=
Hex
.
encodeHexString
(
byteSharedSecret
);
modelAndView
.
addObject
(
"id"
,
genRQCode
(
otpauth
));
modelAndView
.
addObject
(
"userInfo"
,
userInfo
);
modelAndView
.
addObject
(
"format"
,
hotpK
eyUriFormat
);
modelAndView
.
addObject
(
"format"
,
k
eyUriFormat
);
modelAndView
.
addObject
(
"sharedSecret"
,
sharedSecret
);
modelAndView
.
addObject
(
"hexSharedSecret"
,
hexSharedSecret
);
return
modelAndView
;
...
...
@@ -137,7 +128,7 @@ public class OneTimePasswordController {
@RequestMapping
(
value
={
"gen/hotp"
})
public
ModelAndView
genhotp
(){
UserInfo
userInfo
=
WebContext
.
getUserInfo
();
byte
[]
byteSharedSecret
=
OTPSecret
.
generate
(
hotpK
eyUriFormat
.
getCrypto
());
byte
[]
byteSharedSecret
=
OTPSecret
.
generate
(
k
eyUriFormat
.
getCrypto
());
String
sharedSecret
=
Base32Utils
.
encode
(
byteSharedSecret
);
sharedSecret
=
passwordReciprocal
.
encode
(
sharedSecret
);
userInfo
.
setSharedSecret
(
sharedSecret
);
...
...
maxkey-web-maxkey/src/main/java/org/maxkey/web/endpoint/ImageEndpoint.java
已删除
100644 → 0
浏览文件 @
b6b81c30
package
org.maxkey.web.endpoint
;
import
java.awt.image.BufferedImage
;
import
java.io.ByteArrayInputStream
;
import
java.io.ByteArrayOutputStream
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
javax.imageio.ImageIO
;
import
javax.servlet.ServletOutputStream
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
org.maxkey.web.WebConstants
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Controller
;
import
org.springframework.web.bind.annotation.PathVariable
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
com.google.code.kaptcha.Producer
;
/**
* @author Crystal.Sea
*
*/
@Controller
public
class
ImageEndpoint
{
private
static
final
Logger
_logger
=
LoggerFactory
.
getLogger
(
ImageEndpoint
.
class
);
@Autowired
private
Producer
captchaProducer
;
/**
* captcha image Producer
* @param request
* @param response
*/
@RequestMapping
(
value
=
"/captcha"
)
public
void
captchaHandleRequest
(
HttpServletRequest
request
,
HttpServletResponse
response
){
try
{
// Set to expire far in the past.
response
.
setDateHeader
(
"Expires"
,
0
);
// Set standard HTTP/1.1 no-cache headers.
response
.
setHeader
(
"Cache-Control"
,
"no-store, no-cache, must-revalidate"
);
// Set IE extended HTTP/1.1 no-cache headers (use addHeader).
response
.
addHeader
(
"Cache-Control"
,
"post-check=0, pre-check=0"
);
// Set standard HTTP/1.0 no-cache header.
response
.
setHeader
(
"Pragma"
,
"no-cache"
);
// return a jpeg
response
.
setContentType
(
"image/jpeg"
);
// create the text for the image
String
capText
=
captchaProducer
.
createText
();
_logger
.
debug
(
"Sesssion id "
+
request
.
getSession
().
getId
()
+
" , Captcha Text is "
+
capText
);
// store the text in the session
request
.
getSession
().
setAttribute
(
WebConstants
.
KAPTCHA_SESSION_KEY
,
capText
);
// create the image with the text
BufferedImage
bi
=
captchaProducer
.
createImage
(
capText
);
ServletOutputStream
out
=
response
.
getOutputStream
();
// write the data out
ImageIO
.
write
(
bi
,
"jpg"
,
out
);
out
.
flush
();
out
.
close
();
}
catch
(
Exception
e
)
{
_logger
.
error
(
"captcha Producer Error "
+
e
.
getMessage
());
}
}
/**
* image Producer
* @param request
* @param response
* @return
* @throws Exception
*/
@RequestMapping
(
"/image/{id}"
)
public
void
imageHandleRequest
(
HttpServletRequest
request
,
HttpServletResponse
response
,
@PathVariable
(
"id"
)
String
id
)
throws
Exception
{
// Set to expire far in the past.
response
.
setDateHeader
(
"Expires"
,
0
);
// Set standard HTTP/1.1 no-cache headers.
response
.
setHeader
(
"Cache-Control"
,
"no-store, no-cache, must-revalidate"
);
// Set IE extended HTTP/1.1 no-cache headers (use addHeader).
response
.
addHeader
(
"Cache-Control"
,
"post-check=0, pre-check=0"
);
// Set standard HTTP/1.0 no-cache header.
response
.
setHeader
(
"Pragma"
,
"no-cache"
);
// return a jpeg/gif
response
.
setContentType
(
"image/gif"
);
// create the text for the image
byte
[]
image
=(
byte
[])
request
.
getSession
().
getAttribute
(
id
);
//request.getSession().removeAttribute(id);
// create the image with the text
if
(
image
!=
null
){
ServletOutputStream
out
=
response
.
getOutputStream
();
// write the data out
ImageIO
.
write
(
byte2BufferedImage
(
image
),
"gif"
,
out
);
try
{
out
.
flush
();
}
finally
{
out
.
close
();
}
}
}
public
static
BufferedImage
byte2BufferedImage
(
byte
[]
imageByte
){
try
{
InputStream
in
=
new
ByteArrayInputStream
(
imageByte
);
BufferedImage
bufferedImage
=
ImageIO
.
read
(
in
);
return
bufferedImage
;
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
return
null
;
}
public
static
byte
[]
bufferedImage2Byte
(
BufferedImage
bufferedImage
){
try
{
ByteArrayOutputStream
byteArrayOutputStream
=
new
ByteArrayOutputStream
();
ImageIO
.
write
(
bufferedImage
,
"gif"
,
byteArrayOutputStream
);
return
byteArrayOutputStream
.
toByteArray
();
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
return
null
;
}
public
Producer
getCaptchaProducer
()
{
return
captchaProducer
;
}
public
void
setCaptchaProducer
(
Producer
captchaProducer
)
{
this
.
captchaProducer
=
captchaProducer
;
}
}
maxkey-web-maxkey/src/main/java/org/maxkey/web/interceptor/PermissionAdapter.java
浏览文件 @
8110d994
...
...
@@ -36,9 +36,10 @@ public class PermissionAdapter extends HandlerInterceptorAdapter {
*/
@Override
public
boolean
preHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
)
throws
Exception
{
_logger
.
debug
(
"PermissionAdapter preHandle"
);
_logger
.
trace
(
"PermissionAdapter preHandle"
);
//判断用户是否登录
if
(
WebContext
.
getAuthentication
()==
null
||
WebContext
.
getAuthentication
().
getAuthorities
()==
null
){
//判断用户和角色,判断用户是否登录用户
_logger
.
trace
(
"No Authentication ... forward to /login"
);
RequestDispatcher
dispatcher
=
request
.
getRequestDispatcher
(
"/login"
);
dispatcher
.
forward
(
request
,
response
);
return
false
;
...
...
maxkey-web-maxkey/src/main/resources/application.properties
浏览文件 @
8110d994
...
...
@@ -5,6 +5,9 @@ server.port=80
#web app context path
server.servlet.context-path
=
/maxkey
application.name
=
MaxKey
application.formatted-version
=
v1.1 GA
#for freemarker
spring.freemarker.template-loader-path
=
classpath:/templates/views
spring.freemarker.cache
=
false
...
...
maxkey-web-maxkey/src/main/resources/banner.txt
0 → 100644
浏览文件 @
8110d994
__ ___ __ __
/ |/ /__ ___ __ / //_/__ __ __
/ /|_/ / _ `/\ \ // ,< / -_) // /
/_/ /_/\_,_//_\_\/_/|_|\__/\_, /
/___/
${application.formatted-version}
:: Spring Boot :: ${spring-boot.formatted-version}
\ No newline at end of file
maxkey-web-maxkey/src/main/resources/log4j2.xml
浏览文件 @
8110d994
<?xml version="1.0" encoding="UTF-8"?>
<configuration
status=
"INFO"
monitorInterval=
"300"
>
<!--DOCTYPE log4j:configuration SYSTEM "log4j.dtd" -->
<log4j:configuration
xmlns:log4j=
"http://jakarta.apache.org/log4j/"
status=
"INFO"
monitorInterval=
"300"
>
<appenders>
<Console
name=
"consolePrint"
target=
"SYSTEM_OUT"
>
...
...
@@ -31,4 +34,4 @@
<appender-ref
ref=
"RollingFile"
/>
</root>
</loggers>
</configuration>
\ No newline at end of file
</log4j:configuration>
\ No newline at end of file
maxkey-web-maxkey/src/main/resources/spring/maxkey-security.xml
浏览文件 @
8110d994
...
...
@@ -25,15 +25,14 @@
<mvc:interceptors>
<!-- web Controller InterceptorAdapter for platform permission -->
<mvc:interceptor>
<!-- for index -->
<mvc:mapping
path=
"/index/*"
/>
<!-- for System -->
<mvc:mapping
path=
"/logs/*"
/>
<mvc:mapping
path=
"/userinfo/*"
/>
<mvc:mapping
path=
"/relyingparty/*"
/>
<mvc:mapping
path=
"/sysconfig/*"
/>
<mvc:mapping
path=
"/users/*"
/>
<mvc:mapping
path=
"/employees/*"
/>
<!-- for permission -->
<mvc:mapping
path=
"/index*/**"
/>
<mvc:mapping
path=
"/logs*/**"
/>
<mvc:mapping
path=
"/userinfo*/**"
/>
<mvc:mapping
path=
"/profile*/**"
/>
<mvc:mapping
path=
"/safe*/**"
/>
<mvc:mapping
path=
"/historys*/**"
/>
<mvc:mapping
path=
"/appList*/**"
/>
<bean
class=
"org.maxkey.web.interceptor.PermissionAdapter"
/>
</mvc:interceptor>
<!-- web Controller InterceptorAdapter for platform log -->
...
...
@@ -77,32 +76,15 @@
<property
name=
"validity"
value=
"${config.login.remeberme.validity}"
/>
</bean>
<bean
id=
"
timeBasedK
eyUriFormat"
class=
"org.maxkey.crypto.password.opt.algorithm.KeyUriFormat"
>
<bean
id=
"
k
eyUriFormat"
class=
"org.maxkey.crypto.password.opt.algorithm.KeyUriFormat"
>
<property
name=
"type"
value=
"totp"
/>
<property
name=
"digits"
value=
"6"
/>
<property
name=
"issuer"
value=
"
ConnSec
"
/>
<property
name=
"domain"
value=
"
connsec.com
"
/>
<property
name=
"issuer"
value=
"
MaxKey
"
/>
<property
name=
"domain"
value=
"
MaxKey.org
"
/>
<property
name=
"period"
value=
"30"
/>
</bean>
<bean
id=
"counterBasedKeyUriFormat"
class=
"org.maxkey.crypto.password.opt.algorithm.KeyUriFormat"
>
<property
name=
"type"
value=
"hotp"
/>
<property
name=
"digits"
value=
"6"
/>
<property
name=
"issuer"
value=
"maxkey"
/>
<property
name=
"domain"
value=
"maxkey.org"
/>
<property
name=
"counter"
value=
"0"
/>
</bean>
<bean
id=
"hotpKeyUriFormat"
class=
"org.maxkey.crypto.password.opt.algorithm.KeyUriFormat"
>
<property
name=
"type"
value=
"hotp"
/>
<property
name=
"digits"
value=
"6"
/>
<property
name=
"issuer"
value=
"maxkey"
/>
<property
name=
"domain"
value=
"maxkey.org"
/>
<property
name=
"counter"
value=
"0"
/>
</bean>
<bean
id=
"tfaOTPAuthn"
class=
"org.maxkey.crypto.password.opt.impl.TimeBasedOTPAuthn"
>
<constructor-arg
ref=
"jdbcTemplate"
/>
</bean>
...
...
@@ -150,40 +132,8 @@
</property>
</bean>
<!-- Follow is config for Spring security -->
<!--<csrf disabled="true"/>-->
<!-- Login
<http use-expressions="false" disable-url-rewriting="false" xmlns="http://www.springframework.org/schema/security" >
<headers>
<frame-options policy="SAMEORIGIN" />
</headers>
<access-denied-handler error-page="/login"/>
<intercept-url pattern="/index" access="ROLE_USER" />
<intercept-url pattern="/forwardindex" access="ROLE_USER" />
<intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY,ROLE_USER" />
<form-login authentication-failure-url="/login"
default-target-url="/forwardindex"
login-page="/login"
login-processing-url="/logon.do"
username-parameter="j_username"
password-parameter="j_password"
authentication-success-handler-ref="savedRequestSuccessHandler"/>
<logout logout-url="/logout.do" logout-success-url="/logout" invalidate-session="true" delete-cookies="JSESSIONID" />
<session-management invalid-session-url="/login" />
<anonymous />
</http>
-->
<bean
id=
"savedRequestSuccessHandler"
class=
"org.maxkey.authn.SavedRequestAwareAuthenticationSuccessHandler"
>
</bean>
<!-- spring authentication provider
<authentication-manager alias="authenticationProvider" xmlns="http://www.springframework.org/schema/security"/>
-->
<!-- LDAP Realm
<bean id="authenticationRealm" class="org.maxkey.web.authentication.realm.ldap.LdapAuthenticationRealm">
<constructor-arg ref="jdbcTemplate"/>
...
...
@@ -246,11 +196,7 @@
<!-- Authentication providers -->
<bean
id=
"authenticationProvider"
class=
"org.maxkey.authn.RealmAuthenticationProvider"
>
</bean>
<!--
<authentication-manager alias="authenticationManager" xmlns="http://www.springframework.org/schema/security">
<authentication-provider ref= "realmAuthenticationProvider"/>
</authentication-manager>
-->
<mvc:annotation-driven
/>
<mvc:default-servlet-handler
/>
...
...
maxkey-web-maxkey/src/main/resources/templates/views/layout/left.ftl
已删除
100644 → 0
浏览文件 @
b6b81c30
maxkey-web-maxkey/src/main/resources/templates/views/layout/nav_third.ftl
已删除
100644 → 0
浏览文件 @
b6b81c30
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录