Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
MaxKey单点登录官方(MaxKeyTop)
MaxKey
提交
9b67ce81
MaxKey
项目概览
MaxKey单点登录官方(MaxKeyTop)
/
MaxKey
12 个月 前同步成功
通知
76
Star
3
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
MaxKey
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
9b67ce81
编写于
10月 22, 2021
作者:
MaxKey单点登录官方
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
RandomColor captcha
上级
44cf9ae7
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
437 addition
and
0 deletion
+437
-0
maxkey-authentications/maxkey-authentication-captcha/src/main/java/com/google/code/kaptcha/impl/LightNoise.java
...rc/main/java/com/google/code/kaptcha/impl/LightNoise.java
+94
-0
maxkey-authentications/maxkey-authentication-captcha/src/main/java/com/google/code/kaptcha/impl/Ripple.java
...ha/src/main/java/com/google/code/kaptcha/impl/Ripple.java
+50
-0
maxkey-authentications/maxkey-authentication-captcha/src/main/java/com/google/code/kaptcha/text/impl/RandomColorWordRenderer.java
...oogle/code/kaptcha/text/impl/RandomColorWordRenderer.java
+128
-0
maxkey-authentications/maxkey-authentication-captcha/src/main/resources/kaptcha_c.properties
...ntication-captcha/src/main/resources/kaptcha_c.properties
+13
-0
maxkey-gataway/src/main/java/org/gateway/filter/AuthAndLogFilter.java
...ay/src/main/java/org/gateway/filter/AuthAndLogFilter.java
+27
-0
maxkey-gataway/src/main/java/org/gateway/route/NacosDynamicRouteService.java
...main/java/org/gateway/route/NacosDynamicRouteService.java
+125
-0
未找到文件。
maxkey-authentications/maxkey-authentication-captcha/src/main/java/com/google/code/kaptcha/impl/LightNoise.java
0 → 100644
浏览文件 @
9b67ce81
package
com.google.code.kaptcha.impl
;
import
java.awt.BasicStroke
;
import
java.awt.Color
;
import
java.awt.Graphics2D
;
import
java.awt.RenderingHints
;
import
java.awt.geom.CubicCurve2D
;
import
java.awt.geom.PathIterator
;
import
java.awt.geom.Point2D
;
import
java.awt.image.BufferedImage
;
import
java.security.SecureRandom
;
import
java.util.Random
;
import
com.google.code.kaptcha.NoiseProducer
;
import
com.google.code.kaptcha.util.Configurable
;
/**
* The default implementation of {@link NoiseProducer}, adds a noise on an
* image.
*/
public
class
LightNoise
extends
Configurable
implements
NoiseProducer
{
/**
* Draws a noise on the image. The noise curve depends on the factor values.
* Noise won't be visible if all factors have the value > 1.0f
*
* @param image
* the image to add the noise to
* @param factorOne
* @param factorTwo
* @param factorThree
* @param factorFour
*/
public
void
makeNoise
(
BufferedImage
image
,
float
factorOne
,
float
factorTwo
,
float
factorThree
,
float
factorFour
)
{
Color
color
=
getConfig
().
getNoiseColor
();
// image size
int
width
=
image
.
getWidth
();
int
height
=
image
.
getHeight
();
// the points where the line changes the stroke and direction
Point2D
[]
pts
=
null
;
Random
rand
=
new
SecureRandom
();
// the curve from where the points are taken
CubicCurve2D
cc
=
new
CubicCurve2D
.
Float
(
width
*
factorOne
,
height
*
rand
.
nextFloat
(),
width
*
factorTwo
,
height
*
rand
.
nextFloat
(),
width
*
factorThree
,
height
*
rand
.
nextFloat
(),
width
*
factorFour
,
height
*
rand
.
nextFloat
());
// creates an iterator to define the boundary of the flattened curve
PathIterator
pi
=
cc
.
getPathIterator
(
null
,
2
);
Point2D
tmp
[]
=
new
Point2D
[
200
];
int
i
=
0
;
// while pi is iterating the curve, adds points to tmp array
while
(!
pi
.
isDone
())
{
float
[]
coords
=
new
float
[
6
];
switch
(
pi
.
currentSegment
(
coords
))
{
case
PathIterator
.
SEG_MOVETO
:
case
PathIterator
.
SEG_LINETO
:
tmp
[
i
]
=
new
Point2D
.
Float
(
coords
[
0
],
coords
[
1
]);
}
i
++;
pi
.
next
();
}
pts
=
new
Point2D
[
i
];
System
.
arraycopy
(
tmp
,
0
,
pts
,
0
,
i
);
Graphics2D
graph
=
(
Graphics2D
)
image
.
getGraphics
();
graph
.
setRenderingHints
(
new
RenderingHints
(
RenderingHints
.
KEY_ANTIALIASING
,
RenderingHints
.
VALUE_ANTIALIAS_ON
));
graph
.
setColor
(
color
);
// for the maximum 3 point change the stroke and direction
for
(
i
=
0
;
i
<
pts
.
length
-
1
;
i
++)
{
if
(
i
<
3
)
graph
.
setStroke
(
new
BasicStroke
(
0.7f
*
(
2
-
i
)));
graph
.
drawLine
((
int
)
pts
[
i
].
getX
(),
(
int
)
pts
[
i
].
getY
(),
(
int
)
pts
[
i
+
1
].
getX
(),
(
int
)
pts
[
i
+
1
].
getY
());
}
graph
.
dispose
();
}
}
\ No newline at end of file
maxkey-authentications/maxkey-authentication-captcha/src/main/java/com/google/code/kaptcha/impl/Ripple.java
0 → 100644
浏览文件 @
9b67ce81
package
com.google.code.kaptcha.impl
;
import
java.awt.Graphics2D
;
import
java.awt.image.BufferedImage
;
import
com.google.code.kaptcha.GimpyEngine
;
import
com.google.code.kaptcha.NoiseProducer
;
import
com.google.code.kaptcha.util.Configurable
;
import
com.jhlabs.image.RippleFilter
;
import
com.jhlabs.image.TransformFilter
;
import
com.jhlabs.image.WaterFilter
;
/**
* {@link WaterRipple} adds water ripple effect to an image.
*/
public
class
Ripple
extends
Configurable
implements
GimpyEngine
{
/**
* Applies distortion by adding water ripple effect.
*
* @param baseImage the base image
* @return the distorted image
*/
public
BufferedImage
getDistortedImage
(
BufferedImage
baseImage
)
{
NoiseProducer
noiseProducer
=
getConfig
().
getNoiseImpl
();
BufferedImage
distortedImage
=
new
BufferedImage
(
baseImage
.
getWidth
(),
baseImage
.
getHeight
(),
BufferedImage
.
TYPE_INT_ARGB
);
Graphics2D
graphics
=
(
Graphics2D
)
distortedImage
.
getGraphics
();
RippleFilter
rippleFilter
=
new
RippleFilter
();
rippleFilter
.
setWaveType
(
RippleFilter
.
SINE
);
rippleFilter
.
setXAmplitude
(
2.6f
);
rippleFilter
.
setYAmplitude
(
1.7f
);
rippleFilter
.
setXWavelength
(
15
);
rippleFilter
.
setYWavelength
(
5
);
rippleFilter
.
setEdgeAction
(
TransformFilter
.
NEAREST_NEIGHBOUR
);
BufferedImage
effectImage
=
rippleFilter
.
filter
(
baseImage
,
null
);
graphics
.
drawImage
(
effectImage
,
0
,
0
,
null
,
null
);
graphics
.
dispose
();
noiseProducer
.
makeNoise
(
distortedImage
,
.
1
f
,
.
1
f
,
.
25
f
,
.
25
f
);
noiseProducer
.
makeNoise
(
distortedImage
,
.
1
f
,
.
25
f
,
.
5
f
,
.
9
f
);
return
distortedImage
;
}
}
maxkey-authentications/maxkey-authentication-captcha/src/main/java/com/google/code/kaptcha/text/impl/RandomColorWordRenderer.java
0 → 100644
浏览文件 @
9b67ce81
package
com.google.code.kaptcha.text.impl
;
import
java.awt.Color
;
import
java.awt.Font
;
import
java.awt.Graphics2D
;
import
java.awt.RenderingHints
;
import
java.awt.font.FontRenderContext
;
import
java.awt.font.GlyphVector
;
import
java.awt.image.BufferedImage
;
import
java.security.SecureRandom
;
import
java.util.HashMap
;
import
java.util.Random
;
import
com.google.code.kaptcha.text.WordRenderer
;
import
com.google.code.kaptcha.util.ConfigHelper
;
import
com.google.code.kaptcha.util.Configurable
;
/**
* The default implementation of {@link WordRenderer}, creates an image with a
* word rendered on it.
*/
public
class
RandomColorWordRenderer
extends
Configurable
implements
WordRenderer
{
ConfigHelper
configHelper
=
new
ConfigHelper
();
/**
* Renders a word to an image.
*
* @param word
* The word to be rendered.
* @param width
* The width of the image to be created.
* @param height
* The height of the image to be created.
* @return The BufferedImage created from the word.
*/
public
BufferedImage
renderWord
(
String
word
,
int
width
,
int
height
)
{
int
fontSize
=
getConfig
().
getTextProducerFontSize
();
Font
[]
fonts
=
getConfig
().
getTextProducerFonts
(
fontSize
);
Color
color
=
getConfig
().
getTextProducerFontColor
();
int
charSpace
=
getConfig
().
getTextProducerCharSpace
();
BufferedImage
image
=
new
BufferedImage
(
width
,
height
,
BufferedImage
.
TYPE_INT_ARGB
);
Graphics2D
g2D
=
image
.
createGraphics
();
g2D
.
setColor
(
color
);
RenderingHints
hints
=
new
RenderingHints
(
RenderingHints
.
KEY_ANTIALIASING
,
RenderingHints
.
VALUE_ANTIALIAS_ON
);
hints
.
add
(
new
RenderingHints
(
RenderingHints
.
KEY_RENDERING
,
RenderingHints
.
VALUE_RENDER_QUALITY
));
g2D
.
setRenderingHints
(
hints
);
FontRenderContext
frc
=
g2D
.
getFontRenderContext
();
Random
random
=
new
SecureRandom
();
int
startPosY
=
(
height
-
fontSize
)
/
5
+
fontSize
;
char
[]
wordChars
=
word
.
toCharArray
();
Font
[]
chosenFonts
=
new
Font
[
wordChars
.
length
];
int
[]
charWidths
=
new
int
[
wordChars
.
length
];
int
widthNeeded
=
0
;
for
(
int
i
=
0
;
i
<
wordChars
.
length
;
i
++)
{
//chosenFonts[i] = new Font("Arial", Font.BOLD, fontSize);
//random
chosenFonts
[
i
]
=
fonts
[
random
.
nextInt
(
fonts
.
length
)];
char
[]
charToDraw
=
new
char
[]{
wordChars
[
i
]
};
GlyphVector
gv
=
chosenFonts
[
i
].
createGlyphVector
(
frc
,
charToDraw
);
charWidths
[
i
]
=
(
int
)
gv
.
getVisualBounds
().
getWidth
();
if
(
i
>
0
)
{
widthNeeded
=
widthNeeded
+
2
;
}
widthNeeded
=
widthNeeded
+
charWidths
[
i
];
}
HashMap
<
String
,
String
>
selectedColor
=
new
HashMap
<
String
,
String
>();
int
startPosX
=
(
width
-
widthNeeded
)
/
2
;
for
(
int
i
=
0
;
i
<
wordChars
.
length
;
i
++)
{
String
randomcolor
=
""
;
do
{
randomcolor
=
COLOR_LIST
[
random
.
nextInt
(
COLOR_LIST
.
length
)].
replaceAll
(
" "
,
""
);
}
while
(
selectedColor
.
containsKey
(
randomcolor
));
selectedColor
.
put
(
randomcolor
,
randomcolor
);
color
=
configHelper
.
getColor
(
randomcolor
,
randomcolor
,
Color
.
LIGHT_GRAY
);
g2D
.
setColor
(
color
);
g2D
.
setFont
(
chosenFonts
[
i
]);
char
[]
charToDraw
=
new
char
[]
{
wordChars
[
i
]
};
//System.out.println(charToDraw[0] +" - "+chosenFonts[i]);
g2D
.
drawChars
(
charToDraw
,
0
,
charToDraw
.
length
,
startPosX
,
startPosY
);
startPosX
=
startPosX
+
(
int
)
charWidths
[
i
]
+
charSpace
;
}
return
image
;
}
static
String
[]
COLOR_LIST
=
{
//"255, 255, 255",//white
//"192, 192, 192",//silver
//"128, 128, 128",//gray
"0, 0, 0"
,
//black
"255, 0, 0"
,
//red
"128, 0, 0"
,
//maroon
"255, 255, 0"
,
//yellow
"128, 128, 0"
,
//olive
"0, 255, 0"
,
//lime
"0, 128, 0"
,
//green
"0, 255, 255"
,
//aqua
"0, 128, 128"
,
//teal
"0, 0, 255"
,
//blue
"0, 0, 128"
,
//navy
"255, 0, 255"
,
//fuchsia
"128, 0, 128"
//purple
};
}
maxkey-authentications/maxkey-authentication-captcha/src/main/resources/kaptcha_c.properties
0 → 100644
浏览文件 @
9b67ce81
kaptcha.image.width
=
80
kaptcha.image.height
=
25
kaptcha.border
=
no
#kaptcha.obscurificator.impl=com.google.code.kaptcha.impl.ShadowGimpy
kaptcha.obscurificator.impl
=
com.google.code.kaptcha.impl.Ripple
kaptcha.textproducer.font.size
=
23
kaptcha.textproducer.char.string
=
0123456789
kaptcha.textproducer.char.length
=
4
kaptcha.textproducer.char.space
=
3
#kaptcha.noise.impl=com.google.code.kaptcha.impl.DefaultNoise
kaptcha.noise.impl
=
com.google.code.kaptcha.impl.LightNoise
#kaptcha.noise.color=white
kaptcha.word.impl
=
com.google.code.kaptcha.text.impl.RandomColorWordRenderer
\ No newline at end of file
maxkey-gataway/src/main/java/org/gateway/filter/AuthAndLogFilter.java
0 → 100644
浏览文件 @
9b67ce81
package
org.gateway.filter
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.cloud.gateway.filter.GatewayFilterChain
;
import
org.springframework.cloud.gateway.filter.GlobalFilter
;
import
org.springframework.core.Ordered
;
import
org.springframework.stereotype.Component
;
import
org.springframework.web.server.ServerWebExchange
;
import
reactor.core.publisher.Mono
;
@Component
public
class
AuthAndLogFilter
implements
GlobalFilter
,
Ordered
{
private
final
Logger
logger
=
LoggerFactory
.
getLogger
(
getClass
());
@Override
public
Mono
<
Void
>
filter
(
ServerWebExchange
exchange
,
GatewayFilterChain
chain
)
{
return
chain
.
filter
(
exchange
.
mutate
().
build
());
}
@Override
public
int
getOrder
()
{
logger
.
trace
(
" -20"
);
return
-
20
;
}
}
maxkey-gataway/src/main/java/org/gateway/route/NacosDynamicRouteService.java
0 → 100644
浏览文件 @
9b67ce81
/*
package org.gateway.route;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.Executor;
@Component
public class NacosDynamicRouteService implements ApplicationEventPublisherAware {
private final Logger logger = LoggerFactory.getLogger(getClass());
private String dataId = "alibaba-gateway-router";
private String group = "DEFAULT_GROUP";
@Value("${spring.cloud.nacos.config.server-addr}")
private String serverAddr;
@Value("${spring.cloud.nacos.config.namespace}")
private String namespace;
@Autowired
private RouteDefinitionWriter routeDefinitionWriter;
private ApplicationEventPublisher applicationEventPublisher;
private static final List<String> ROUTE_LIST = new ArrayList<>();
@PostConstruct
public void dynamicRouteByNacosListener() {
try {
logger.info("serverAddr:{}",serverAddr);
logger.info("namespace:{}",namespace);
logger.info("dataId:{}",dataId);
logger.info("group:{}",group);
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
properties.put(PropertyKeyConst.NAMESPACE, namespace);
ConfigService configService = NacosFactory.createConfigService(properties);
configService.getConfig(dataId, group, 5000);
// 程序首次启动, 并加载初始化路由配置
String initConfigInfo = configService.getConfig(dataId, group, 5000);
addAndPublishBatchRoute(initConfigInfo);
publish();
configService.addListener(dataId, group, new Listener() {
@Override
public void receiveConfigInfo(String configInfo) {
clearRoute();
try {
List<RouteDefinition> gatewayRouteDefinitions = JSONObject.parseArray(configInfo, RouteDefinition.class);
for (RouteDefinition routeDefinition : gatewayRouteDefinitions) {
logger.info("routeDefinition:{}",routeDefinition);
addRoute(routeDefinition);
}
publish();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public Executor getExecutor() {
return null;
}
});
} catch (NacosException e) {
logger.error("error:{}",e);
}
}
private void clearRoute() {
for(String id : ROUTE_LIST) {
this.routeDefinitionWriter.delete(Mono.just(id)).subscribe();
}
ROUTE_LIST.clear();
}
private void addAndPublishBatchRoute(String initConfigInfo){
List<RouteDefinition> gatewayRouteDefinitions = JSONObject.parseArray(initConfigInfo, RouteDefinition.class);
for (RouteDefinition routeDefinition : gatewayRouteDefinitions) {
logger.info("init routeDefinition:{}",routeDefinition);
addRoute(routeDefinition);
}
}
private void addRoute(RouteDefinition definition) {
try {
routeDefinitionWriter.save(Mono.just(definition)).subscribe();
ROUTE_LIST.add(definition.getId());
} catch (Exception e) {
e.printStackTrace();
}
}
private void publish() {
this.applicationEventPublisher.publishEvent(new RefreshRoutesEvent(this.routeDefinitionWriter));
}
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
}
}
*/
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录