move to maxkey.github.io

This commit is contained in:
MaxKey
2020-07-09 23:05:46 +08:00
parent 045baf92dd
commit 552e6128eb
127 changed files with 0 additions and 5223 deletions

View File

@@ -1 +0,0 @@
maxkey.top

View File

@@ -1,2 +0,0 @@
publishDate: 2020-06-01
publishVesion: v2.0.0 RC1

View File

@@ -1,30 +0,0 @@
<script>
var contactForm = document.querySelector('form'),
inputEmail = contactForm.querySelector('[name="email"]'),
textAreaMessage = contactForm.querySelector('[name="content"]'),
sendButton = contactForm.querySelector('button');
sendButton.addEventListener('click', function(event){
event.preventDefault();
sendButton.innerHTML = '{{ site.text.contact.ajax.sending }}';
var xhr = new XMLHttpRequest();
xhr.open('POST', '//formspree.io/{{ site.email }}', true);
xhr.setRequestHeader("Accept", "application/json")
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
xhr.send(
"email=" + inputEmail.value +
"&message=" + textAreaMessage.value);
xhr.onloadend = function (res) {
if (res.target.status === 200){
sendButton.innerHTML = '{{ site.text.contact.ajax.sent }}';
}
else {
sendButton.innerHTML = '{{ site.text.contact.ajax.error }}';
}
}
});
</script>

View File

@@ -1,9 +0,0 @@
<footer>
<div class="container-fluid">
<div class="row-fluid">
<p align="center">Copyright &copy; 2019-2020 <a class="external" href="https://maxkey.top/">https://maxkey.top/ </a>. All Rights Reserved.<br>
Licensed under the Apache License, Version 2.0 | <a href="https://tongji.baidu.com/web/welcome/ico?s=3190a3a1904a09c48625744a4380bbb5" target="_blank"><img src="https://tongji.baidu.com/sc-web/image/icon/11.gif?__v=1589195045273"/></a>
</p>
</div>
</div>
</footer>

View File

@@ -1,43 +0,0 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="generator" content="MaxKey v2.0.0" />
<title id="maxkey_title">MaxKey is leading-edge Identity and Access Management System-Single Sign On(SSO)</title>
<link rel="shortcut icon" type="image/x-icon" href="{{ "/images/favicon.ico" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" title="MaxKey">
<!-- syntax highlighting CSS -->
<link rel="stylesheet" href="{{ "/css/syntax.css" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}">
<!-- Custom CSS -->
<link rel="stylesheet" href="{{ "/css/apache-maven-fluido-1.8.min.css" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}">
<link rel="stylesheet" href="{{ "/css/site.css" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}">
<link rel="stylesheet" href="{{ "/css/print.css" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" media="print" >
<script type="text/javascript" src="{{ "/js/apache-maven-fluido-1.8.min.js" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}"></script>
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/styles/default.min.css">
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?3190a3a1904a09c48625744a4380bbb5";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
currentLang = navigator.language; //判断除IE外其他浏览器使用语言
if(!currentLang){//判断IE浏览器使用语言
currentLang = navigator.browserLanguage;
}
if(currentLang.substr(0,2).toLowerCase()=="zh"){
document.getElementById("maxkey_title").innerHTML="MaxKey-业界领先的企业级IAM身份管理和身份认证产品";
}
</script>
</head>

View File

@@ -1,24 +0,0 @@
<header>
<div id="banner">
<div class="pull-left"><a href="https://shimingxy.github.io/MaxKey/" id="bannerLeft">
<h1>MaxKey</h1>
</div>
<div class="pull-right">
<a href="#" id="bannerRight"><img src="{{ "/images/logo.jpg" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" width="114pxx" alt=""/></a>
</div>
<div class="clear"><hr/></div>
</div>
<div id="breadcrumbs">
<ul class="breadcrumb">
<li id="publishDate">Last Published: {{ site.publishDate }}<span class="divider">|</span></li>
<li id="projectVersion">Version: {{ site.publishVesion }}</li>
<li class="pull-right"><span class="divider">|</span>
<a href="https://gitee.com/shimingxy/MaxKey" class="externalLink" title="码云">码云</a>
</li>
<li class="pull-right"><span class="divider">|</span>
<a href="https://github.com/shimingxy/MaxKey" class="externalLink" title="GitHub">GitHub</a>
</li>
</ul>
</div>
</header>

View File

@@ -1,69 +0,0 @@
<header id="leftColumn" class="span2">
<nav class="well sidebar-nav">
<ul class="nav nav-list">
<li class="nav-header"><img class="imageLink" src="{{ "/images/home.png" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt="MaxKey" border="0"/> MaxKey</li>
<li class=""><a href="{{site.baseurl}}/welcome.html"><span class="none"></span>About关于</a></li>
<li class=""><a href="{{site.baseurl}}/tutorial.html"><span class="none"></span>快速使用</a></li>
<li class="nav-header"><img class="imageLink" src="{{ "/images/cog.png" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt="配置" border="0">配置</li>
<li class=""><a href="{{site.baseurl}}/configuration.html"><span class="none"></span>基本配置</a></li>
<li class="">
<a href="#"><span class="icon-chevron-down"></span>UI用户界面</a>
<ul class="nav nav-list">
<li class=""><a href="{{site.baseurl}}/ui.html"><span class="none"></span>MaxKey界面</a></li>
<li class=""><a href="{{site.baseurl}}/ui_mgt.html"><span class="none"></span>管理界面</a></li>
</ul>
</li>
<li class="">
<a href="#"><span class="icon-chevron-down"></span>登录集成</a>
<ul class="nav nav-list">
<li class=""><a href="{{site.baseurl}}/authn/captcha.html"><span class="none"></span>登录验证码</a></li>
<li class=""><a href="{{site.baseurl}}/authn/mfa.html"><span class="none"></span>双因素认证MFA</a></li>
<li class=""><a href="{{site.baseurl}}/authn/social.html"><span class="none"></span>社交集成</a></li>
<li class=""><a href="{{site.baseurl}}/authn/google.html"><span class="none"></span>TOTP/Google Authenticator</a></li>
<li class=""><a href="{{site.baseurl}}/authn/kerberos.html"><span class="none"></span>Kerberos/SPNEGO/AD</a></li>
<li class=""><a href="{{site.baseurl}}/authn/ldap.html"><span class="none"></span>LDAP</a></li>
<li class=""><a href="{{site.baseurl}}/authn/fgpwd.html"><span class="none"></span>忘记密码(Forget Password)</a></li>
</ul>
</li>
<li class="">
<a href="#"><span class="icon-chevron-down"></span>应用集成</a>
<ul class="nav nav-list">
<li class=""><a href="{{site.baseurl}}/sso/oauth2.html"><span class="none"></span>OAuth2</a></li>
<li class=""><a href="{{site.baseurl}}/sso/jwt.html"><span class="none"></span>JWT</a></li>
<li class=""><a href="{{site.baseurl}}/sso/oidc.html"><span class="none"></span>OIDC</a></li>
<li class=""><a href="{{site.baseurl}}/sso/cas.html"><span class="none"></span>CAS</a></li>
<li class=""><a href="{{site.baseurl}}/sso/tokenbased.html"><span class="none"></span>TokenBased</a></li>
<li class=""><a href="{{site.baseurl}}/sso/formbased.html"><span class="none"></span>FormBased</a></li>
<li class=""><a href="{{site.baseurl}}/sso/saml_aly.html"><span class="none"></span>阿里云(SAML)</a></li>
<li class=""><a href="{{site.baseurl}}/sso/saml_txy.html"><span class="none"></span>腾讯云(SAML)</a></li>
<li class=""><a href="{{site.baseurl}}/sso/saml_salesforce.html"><span class="none"></span>Salesforce(SAML)</a></li>
</ul>
</li>
<li class=""><a href="{{site.baseurl}}/im.html"><span class="none"></span>身份管理</a></li>
<li class=""><a href="{{site.baseurl}}/ha.html"><span class="none"></span>高可用性HA</a></li>
<li class=""><a href="{{site.baseurl}}/development.html"><span class="none"></span>开发指南</a></li>
<li class="">
<a href="#"><span class="icon-chevron-down"></span>认证协议</a>
<ul class="nav nav-list">
<li class=""><a href="{{site.baseurl}}/protocols/oauth2.html"><span class="none"></span>OAuth2介绍</a></li>
<li class=""><a href="{{site.baseurl}}/protocols/jwtintros.html"><span class="none"></span>JWT介绍</a></li>
<li class=""><a href="{{site.baseurl}}/protocols/saml.html"><span class="none"></span>SAML介绍</a></li>
<li class=""><a href="{{site.baseurl}}/protocols/openid.html"><span class="none"></span>OIDC介绍</a></li>
<li class=""><a href="{{site.baseurl}}/protocols/cas.html"><span class="none"></span>CAS介绍</a></li>
<li class=""><a href="{{site.baseurl}}/protocols/tokenbased.html"><span class="none"></span>TokenBased介绍</a></li>
<li class=""><a href="{{site.baseurl}}/protocols/formbased.html"><span class="none"></span>FormBased介绍</a></li>
</ul>
</li>
<li><a href="{{site.baseurl}}/slo.html" title="Single Logout"><span class="none"></span>单点注销(SLO)</a></li>
<li><a href="{{site.baseurl}}/glossary.html" title="Glossary"><span class="none"></span>Glossary术语</a></li>
<li><a href="{{site.baseurl}}/download.html" title="Download"><span class="none"></span>Download下载</a></li>
<li class="nav-header"><img class="imageLink" src="{{ "/images/info.png" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt="项目信息" border="0">项目信息</li>
<li class=""><a href="{{site.baseurl}}/team.html"><span class="none"></span>项目团队</a></li>
<li class=""><a href="{{site.baseurl}}/licenses.html"><span class="none"></span>项目许可证</a></li>
<li class=""><a href="{{site.baseurl}}/dependency.html"><span class="none"></span>项目依赖</a></li>
</ul>
</nav>
</header>

View File

@@ -1,23 +0,0 @@
{% if paginator.total_pages != 1 %}
<div class="pagination clearfix mb1 mt4">
<div class="left">
{% if paginator.previous_page %}
{% if paginator.page == 2 %}
<a class="pagination-item" href="{{ site.baseurl }}/">{{ site.text.pagination.newer }}</a>
{% else %}
<a class="pagination-item" href="{{ paginator.previous_page_path }}">{{ site.text.pagination.newer }}</a>
{% endif %}
{% else %}
<span class="pagination-item disabled">{{ site.text.pagination.newer }}</span>
{% endif %}
</div>
<div class="right">
{% if paginator.next_page %}
<a class="pagination-item" href="{{ paginator.next_page_path }}">{{ site.text.pagination.older }}</a>
{% else %}
<span class="pagination-item disabled">{{ site.text.pagination.older }}</span>
{% endif %}
</div>
<div class="pagination-meta">Page {{ paginator.page }} of {{ paginator.total_pages }}</div>
</div>
{% endif %}

View File

@@ -1,7 +0,0 @@
<div class="py2 post-footer">
<!-- <img src="{{ site.baseurl }}/images/me.jpeg" alt="John Otander" class="avatar" /> -->
<p>
Follow on <a href="https://twitter.com/{{ site.twitter_username }}">Twitter</a>.
</p>
</div>

View File

@@ -1,41 +0,0 @@
<div class="share-page">
{{ site.text.share_buttons.text }}
<div class="share-links">
{% if site.share_facebook %}
<a class="fa fa-facebook" href="https://facebook.com/sharer.php?u={{ site.url | cgi_escape }}{{ page.url | cgi_escape }}" rel="nofollow" target="_blank" title="{{ site.text.share_buttons.facebook }}"></a>
{% endif %}
{% if site.share_twitter %}
<a class="fa fa-twitter" href="https://twitter.com/intent/tweet?text={{ page.title | cgi_escape }}&amp;url={{ site.url | cgi_escape }}{{ page.url | cgi_escape }}" rel="nofollow" target="_blank" title="{{ site.text.share_buttons.twitter }}"></a>
{% endif %}
{% if site.share_googleplus %}
<a class="fa fa-google-plus" href="https://plus.google.com/share?url={{ site.url | cgi_escape }}{{ page.url | cgi_escape }}" rel="nofollow" target="_blank" title="{{ site.text.share_buttons.googleplus }}"></a>
{% endif %}
{% if site.share_linkedin %}
<a class="fa fa-linkedin" href="http://www.linkedin.com/shareArticle?url={{ site.url | cgi_escape }}{{ page.url | cgi_escape }}&amp;title={{ page.title | cgi_escape }}" rel="nofollow" target="_blank" title="{{ site.text.share_buttons.linkedin }}"></a>
{% endif %}
{% if site.share_digg %}
<a class="fa fa-digg" href="http://digg.com/submit?url={{ site.url | cgi_escape }}{{ page.url | cgi_escape }}&amp;title={{ page.title | cgi_escape }}" rel="nofollow" target="_blank" title="{{ site.text.share_buttons.digg }}"></a>
{% endif %}
{% if site.share_tumblr %}
<a class="fa fa-tumblr" href="http://www.tumblr.com/share/link?url={{ site.url | cgi_escape }}{{ page.url | cgi_escape }}&amp;name={{ page.title | cgi_escape }}" rel="nofollow" target="_blank" title="{{ site.text.share_buttons.tumblr }}"></a>
{% endif %}
{% if site.share_reddit %}
<a class="fa fa-reddit" href="http://reddit.com/submit?url={{ site.url | cgi_escape }}{{ page.url | cgi_escape }}&amp;title={{ page.title | cgi_escape }}" rel="nofollow" target="_blank" title="{{ site.text.share_buttons.reddit }}"></a>
{% endif %}
{% if site.share_stumbleupon %}
<a class="fa fa-stumbleupon" href="http://www.stumbleupon.com/submit?url={{ site.url | cgi_escape }}{{ page.url | cgi_escape }}&amp;title={{ page.title | cgi_escape }}" rel="nofollow" target="_blank" title="{{ site.text.share_buttons.stumbleupon }}"></a>
{% endif %}
{% if site.share_hackernews %}
<a class="fa fa-hacker-news" onclick="parent.postMessage('submit','*')" href="https://news.ycombinator.com/submitlink?u={{ site.url | cgi_escape }}{{ page.url | cgi_escape }}&amp;t={{ page.title | cgi_escape }}" rel="nofollow" target="_blank" title="{{ site.text.share_buttons.hackernews }}"></a>
{% endif %}
</div>
</div>

View File

@@ -1,59 +0,0 @@
<div class="social-icons">
<div class="social-icons-right">
{% if site.github_username %}
<a class="fa fa-github" href="https://github.com/{{ site.github_username }}"></a>
{% endif %}
{% if site.reddit_username %}
<a class="fa fa-reddit" href="https://reddit.com/user/{{ site.reddit_username }}"></a>
{% endif %}
{% if site.bitbucket_username %}
<a class="fa fa-bitbucket" href="https://bitbucket.org/{{ site.bitbucket_username }}"></a>
{% endif %}
{% if site.stackoverflow_id %}
<a class="fa fa-stack-overflow" href="https://stackoverflow.com/users/{{ site.stackoverflow_id }}"></a>
{% endif %}
<a class="fa fa-rss" href="{{ "/feed.xml" | prepend: site.baseurl }}"></a>
{% if site.twitter_username %}
<a class="fa fa-twitter" href="https://twitter.com/{{ site.twitter_username }}"></a>
{% endif %}
{% if site.skype_username %}
<a class="fa fa-skype" href="skype:{{ site.skype_username }}?userinfo"></a>
{% endif %}
{% if site.steam_nickname %}
<a class="fa fa-steam-square" href="http://steamcommunity.com/id/{{ site.steam_nickname }}"></a>
{% endif %}
{% if site.google_plus_id %}
<a class="fa fa-google-plus" href="https://plus.google.com/{{ site.google_plus_id }}/posts"></a>
{% endif %}
{% if site.email %}
<a class="fa fa-envelope" href="mailto:{{ site.email }}"></a>
{% endif %}
{% if site.linkedin_username %}
<a class="fa fa-linkedin" href="https://www.linkedin.com/in/{{ site.linkedin_username }}"></a>
{% endif %}
{% if site.angellist_username %}
<a class="fa fa-angellist" href="https://angel.co/{{ site.angellist_username }}"></a>
{% endif %}
{% if site.medium_id %}
<a class="fa fa-medium" href="https://medium.com/@{{ site.medium_id }}"></a>
{% endif %}
{% if site.telegram_username %}
<a class="fa fa-telegram" href="https://t.me/{{ site.telegram_username }}"></a>
{% endif %}
{% if site.vk_id %}
<a class="fa fa-vk" href="https://vk.com/{{ site.vk_id }}"></a>
{% endif %}
</div>
<div class="right">
{% if site.bitcoin_url %}
<a class="fa fa-bitcoin" href="{{ site.bitcoin_url }}"></a>
{% endif %}
{% if site.paypal_url %}
<a class="fa fa-paypal" href="{{ site.paypal_url }}"></a>
{% endif %}
{% if site.flattr_button %}
{{ site.flattr_button }}
{% endif %}
</div>
</div>
<div class="clearfix"></div>

View File

@@ -1,26 +0,0 @@
<!DOCTYPE html>
<html>
{% include head.html %}
<body class="site{% if site.animated %} animated fade-in-down{% endif %}">
{% if site.google_tag_manager %}
<noscript><iframe src="//www.googletagmanager.com/ns.html?id={{ site.google_tag_manager }}"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','{{ site.google_tag_manager }}');</script>
{% endif %}
<div class="site-wrap center">
{% include header.html %}
<div class="post p2 p-responsive wrap" role="main">
<div class="measure">
{{ content }}
</div>
</div>
</div>
{% include footer.html %}
</body>
</html>

View File

@@ -1,18 +0,0 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
{% include head.html %}
<body class="topBarDisabled">
<div class="container-fluid">
{% include header.html %}
<div class="row-fluid">
{% include navigation.html %}
<main id="bodyColumn" class="span10" >
{{ content }}
</main>
</div>
</div>
<hr/>
{% include footer.html %}
</body>
</html>

View File

@@ -1,11 +0,0 @@
---
layout: default
---
<div class="post">
<header class="post-header">
<h1 class="h2">{{ page.title }}</h1>
</header>
<article class="post-content">
{{ content }}
</article>
</div>

View File

@@ -1,71 +0,0 @@
---
layout: default
---
{% assign minutes = content | strip_html | number_of_words | divided_by: 180 %}
{% if minutes == 0 %}
{% assign minutes = 1 %}
{% endif %}
<div class="post-header mb2">
<h1>{{ page.title }}</h1>
<span class="post-meta">{{ page.date | date: site.date_format }}</span><br>
{% if page.update_date %}
<span class="post-meta">{{ site.text.post.updated }}: {{ page.update_date | date: site.date_format }}</span><br>
{% endif %}
<span class="post-meta small">
{% if page.minutes %}
{{ page.minutes }} {{ site.text.post.minute_read }}
{% else %}
{{ minutes }} {{ site.text.post.minute_read }}
{% endif %}
</span>
</div>
<article class="post-content">
{{ content }}
</article>
{% if site.show_sharing_icons %}
{% include share_buttons.html %}
{% endif %}
{% if site.show_post_footers %}
{% include post_footer.html %}
{% endif %}
{% if txtpen.txtpen_sitename %}
<script src="https://txtpen.com/embed.js?site={{txtpen.txtpen_sitename}}" />
{% endif %}
{% if site.disqus_shortname %}
<div id="disqus_thread"></div>
<script type="text/javascript">
var disqus_shortname = '{{ site.disqus_shortname }}';
var disqus_identifier = '{{ page.id }}';
var disqus_title = {{ page.title | jsonify }};
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
{% endif %}
{% if site.facebook_comments %}
<div class="fb-comments" data-href="{{ site.url }}{{ page.url }}" data-width="100%" data-numposts="{{ site.facebook_comments_number }}"></div>
{% endif %}
{% if site.show_related_posts %}
<h3 class="related-post-title">{{ site.text.post.related_posts }}</h3>
{% for post in site.related_posts %}
<div class="post ml2">
<a href="{{ post.url | prepend: site.baseurl }}" class="post-link">
<h4 class="post-title">{{ post.title }}</h4>
<p class="post-summary">{{ post.summary }}</p>
</a>
</div>
{% endfor %}
{% endif %}

View File

View File

@@ -1,183 +0,0 @@
<h3>验证码</h3>
<b>验证码CAPTCHA</b>是“Completely Automated Public Turing test to tell Computers and Humans Apart”全自动区分计算机和人类的图灵测试的缩写是一种区分用户是计算机还是人的公共全自动程序。可以防止用户用特定程序暴力破解方式进行不断的登陆尝试。
<b>文本验证码</b>
<img src="{{ "/images/authn/captcha_text.png" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt=""/>
<b>算术验证码</b>
<img src="{{ "/images/authn/captcha_arithmetic.png" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt=""/>
<h3>验证码配置</h3>
文件
maxkey/maxkey.properties
<pre><code class="ini hljs">
#是否支持验证码
config.login.captcha=true
#text 文本, arithmetic 算术验证码
config.login.captcha.type=text
</code></pre>
<h3>验证码配置文件</h3>
MaxKey使用kaptcha作为验证码的插件详细可参考Kaptchar详细配置表
文件
maxkey/kaptcha.properties
默认配置如下
<pre><code class="ini hljs">
#宽度
kaptcha.image.width=80
#长度
kaptcha.image.height=25
kaptcha.border=no
kaptcha.obscurificator.impl=com.google.code.kaptcha.impl.ShadowGimpy
kaptcha.textproducer.font.size=23
#生成字符,默认值为数字
kaptcha.textproducer.char.string=0123456789
#位数
kaptcha.textproducer.char.length=4
kaptcha.noise.impl=com.google.code.kaptcha.impl.NoNoise
</code></pre>
当配置算术验证码时即 config.login.captcha.type=arithmetic
kaptcha的配置中必须为数字
<pre><code class="ini hljs">
kaptcha.textproducer.char.string=0123456789
</code></pre>
<h3>Kaptchar详细配置表</h3>
<table border="0" class="table table-striped table-bordered ">
<tbody>
<tr>
<td><strong>Constant</strong></td>
<td><strong>描述</strong></td>
<td><strong>默认值</strong></td>
</tr>
<tr>
<td>kaptcha.border</td>
<td>图片边框合法值yes , no</td>
<td>yes</td>
</tr>
<tr>
<td>kaptcha.border.color</td>
<td>边框颜色,合法值: r,g,b (and optional alpha) 或者 white,black,blue.</td>
<td>black</td>
</tr>
<tr>
<td>kaptcha.border.thickness</td>
<td>边框厚度,合法值:&gt;0</td>
<td>1</td>
</tr>
<tr>
<td>kaptcha.image.width</td>
<td>图片宽</td>
<td>200</td>
</tr>
<tr>
<td>kaptcha.image.height</td>
<td>图片高</td>
<td>50</td>
</tr>
<tr>
<td>kaptcha.producer.impl</td>
<td>图片实现类</td>
<td>com.google.code.kaptcha.impl.DefaultKaptcha</td>
</tr>
<tr>
<td>kaptcha.textproducer.impl</td>
<td>文本实现类</td>
<td>com.google.code.kaptcha.text.impl.DefaultTextCreator</td>
</tr>
<tr>
<td>kaptcha.textproducer.char.string</td>
<td>文本集合,验证码值从此集合中获取</td>
<td>abcde2345678gfynmnpwx</td>
</tr>
<tr>
<td>kaptcha.textproducer.char.length</td>
<td>验证码长度</td>
<td>5</td>
</tr>
<tr>
<td>kaptcha.textproducer.font.names</td>
<td>字体</td>
<td>Arial, Courier</td>
</tr>
<tr>
<td>kaptcha.textproducer.font.size</td>
<td>字体大小</td>
<td>40px.</td>
</tr>
<tr>
<td>kaptcha.textproducer.font.color</td>
<td>字体颜色,合法值: r,g,b &nbsp;或者 white,black,blue.</td>
<td>black</td>
</tr>
<tr>
<td>kaptcha.textproducer.char.space</td>
<td>文字间隔</td>
<td>2</td>
</tr>
<tr>
<td>kaptcha.noise.impl</td>
<td>干扰实现类</td>
<td>com.google.code.kaptcha.impl.DefaultNoise</td>
</tr>
<tr>
<td>kaptcha.noise.color</td>
<td>干扰&nbsp;颜色,合法值: r,g,b 或者 white,black,blue.</td>
<td>black</td>
</tr>
<tr>
<td>kaptcha.obscurificator.impl</td>
<td>图片样式:&nbsp;<br>
水纹com.google.code.kaptcha.impl.WaterRipple&nbsp;<br>
鱼眼com.google.code.kaptcha.impl.FishEyeGimpy<br>
阴影com.google.code.kaptcha.impl.ShadowGimpy
</td>
<td>com.google.code.kaptcha.impl.WaterRipple</td>
</tr>
<tr>
<td>kaptcha.background.impl</td>
<td>背景实现类</td>
<td>com.google.code.kaptcha.impl.DefaultBackground</td>
</tr>
<tr>
<td>kaptcha.background.clear.from</td>
<td>背景颜色渐变,开始颜色</td>
<td>light grey</td>
</tr>
<tr>
<td>kaptcha.background.clear.to</td>
<td>背景颜色渐变,&nbsp;结束颜色</td>
<td>white</td>
</tr>
<tr>
<td>kaptcha.word.impl</td>
<td>文字渲染器</td>
<td>com.google.code.kaptcha.text.impl.DefaultWordRenderer</td>
</tr>
<tr>
<td>kaptcha.session.key</td>
<td>session key</td>
<td>KAPTCHA_SESSION_KEY</td>
</tr>
<tr>
<td>kaptcha.session.date</td>
<td>session date</td>
<td>KAPTCHA_SESSION_DATE</td>
</tr>
</tbody>
</table>

View File

@@ -1,119 +0,0 @@
<h2>忘记密码</h2>
忘记密码一般都是通过2种方式找回一种是通过预留电话号码发送验证码找回另一个是通过设定邮箱找回。
主要步骤如下:
1、在登录界面点击“忘记密码”
<img src="{{ "/images/authn/fgpwd-1.png" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt=""/>
2、输入用户对应的邮箱或者手机号码如果找到用户则发送邮件或者手机验证码
<img src="{{ "/images/authn/fgpwd-2.png" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt=""/>
3、重置密码需要输入新的密码及验证码
<img src="{{ "/images/authn/fgpwd-3.png" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt=""/>
4、重置成功提示返回登录界面重新登录
<img src="{{ "/images/authn/fgpwd-4.png" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt=""/>
<h2>验证码</h2>
1、短信验证码 腾讯云短信/阿里云短信/网易云信/定制
2、电子邮件
<h2>短信认证</h2>
配置maxkey中maxkey.properties
<pre><code class="ini hljs">
#SmsOtpAuthnYunxin SmsOtpAuthnAliyun SmsOtpAuthnTencentCloud
config.otp.sms=SmsOtpAuthnYunxin
</code></pre>
<h3>腾讯云短信</h3>
配置maxkey中maxkey.properties
secretId 账号Appkey
secretKey 密钥appSecret
smsSdkAppid 短信SDKAPPID
templateId 短信模板ID
sign 签名
<pre><code class="ini hljs">
config.otp.sms.aliyun.accesskeyid=94395d754eb55693043f5d6a2b772ef4
config.otp.sms.aliyun.accesssecret=05d5485357bc
config.otp.sms.aliyun.templatecode=14860095
config.otp.sms.aliyun.signname=maxkey
</code></pre>
<h3>阿里云短信</h3>
配置maxkey中maxkey.properties
accessKeyId 账号Appkey
accessSecret 密钥appSecret
templateCode 短信模板ID
signName 签名
<pre><code class="ini hljs">
config.otp.sms.tencentcloud.secretid=94395d754eb55693043f5d6a2b772ef4
config.otp.sms.tencentcloud.secretkey=05d5485357bc
config.otp.sms.tencentcloud.smssdkappid=1486220095
config.otp.sms.tencentcloud.templateid=14860095
config.otp.sms.tencentcloud.sign=1486009522
</code></pre>
<h3>网易云信</h3>
配置maxkey中maxkey.properties
appKey 网易云信分配的账号Appkey
appSecret 网易云信分配的密钥appSecret
templateId 短信模板ID
<pre><code class="ini hljs">
config.otp.sms.yunxin.appkey=94395d754eb55693043f5d6a2b772ef4
config.otp.sms.yunxin.appsecret=05d5485357bc
config.otp.sms.yunxin.templateid=14860095
</code></pre>
<h2>电子邮件</h2>
配置邮箱地址
文件
maxkey/application.properties
<pre><code class="ini hljs">
spring.mail.default-encoding=utf-8
spring.mail.host=smtp.163.com
spring.mail.port=465
spring.mail.username=maxkey@163.com
spring.mail.password=password
spring.mail.protocol=smtp
spring.mail.properties.ssl=true
spring.mail.properties.sender=maxkey@163.com
</code></pre>
配置maxkey中application.properties
subject 邮件主题
messageTemplate 邮件内容模板,请勿修改参数{0}为用户名,{1}认证码,{2}有效间隔
<pre><code class="ini hljs">
spring.mail.properties.mailotp.message.subject=MaxKey One Time PassWord
spring.mail.properties.mailotp.message.template={0} You Token is {1} , it validity in {2} minutes.
</code></pre>

View File

@@ -1,41 +0,0 @@
<h2>多因素认证MFA</h2>
双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统。双因素认证是一种采用时间同步技术的系统,采用了基于时间、事件和密钥三变量而产生的一次性密码来代替传统的静态密码。每个动态密码卡都有一个唯一的密钥,该密钥同时存放在服务器端,每次认证时动态密码卡与服务器分别根据同样的密钥,同样的随机参数(时间、事件)和同样的算法计算了认证的动态密码,从而确保密码的一致性,从而实现了用户的认证。就像我们去银行办卡送的口令牌.
多因素认证MFA是一种计算机访问控制的方法用户要通过两种以上的认证机制之后才能得到授权使用计算机资源。MFA的目的是建立一个多层次的防御使未经授权的人访问计算机系统或网络更加困难从而提高安全性。
<h2>TOTP或者HOTP支持</h2>
1、Google Authenticator
2、Microsoft Authenticator
3、FreeOTP
4、支持TOTP或者HOTP协议
优势:**使用简单、安全性高、低成本、无需携带额外设备**
<h2>Google Authenticator支持</h2>
MaxKey支持谷歌验证器(Google Authenticator)双因素身份认证,步骤如下
1、下载Google Authenticator到手机
<img src="{{ "/images/authn/google1.jpg" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt=""/>
2、登录到Maxkey进入"安全设置"-->"时间令牌",如下图
<img src="{{ "/images/authn/google2.png" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt=""/>
3、使用Google Authenticator扫描令牌的二维码
<img src="{{ "/images/authn/google3.jpg" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt=""/>
4、退出MaxKey,进入到登录界面,"安全认证"输入用户名和密码同时需要Google Authenticator产生的验证码登录如下图
<img src="{{ "/images/authn/google4.png" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt=""/>

View File

@@ -1,15 +0,0 @@
<h2>基于Kerberos/SPNEGO/AD自动登录集成</h2>
MaxKey未提供基于Kerberos的认证但是提供JWT的接入方式可以通过Kerberos认证完成然后使用JWT的实现MaxKey的自动登录。
建议参考
1)spring-security-kerberos的实现
https://github.com/spring-projects/spring-security-kerberos
2)SPNEGO 实现
Integrated Windows Authentication and Authorization in Java
http://spnego.sourceforge.net/

View File

@@ -1,63 +0,0 @@
<h2>LDAP登录集成</h2>
MaxKey支持LDAP包括Active Directory。
<h3>注释默认数据库认证</h3>
打开文件maxkey/spring/maxkey-security.xml,首先注释默认数据库认证方式
<pre><code class="xml hljs">
&lt;!-- Default Realm--&gt;
&lt;!-- realm use jdbc --&gt;
&lt;bean id="authenticationRealm" class="org.maxkey.authn.realm.jdbc.JdbcAuthenticationRealm"&gt;
&lt;constructor-arg ref="jdbcTemplate"/&gt;
&lt;/bean&gt;
</code></pre>
<h3>LDAP支持</h3>
<pre><code class="xml hljs">
&lt;!-- LDAP Realm --&gt;
&lt;bean id="authenticationRealm" class="org.maxkey.web.authentication.realm.ldap.LdapAuthenticationRealm"&gt;
&lt;constructor-arg ref="jdbcTemplate"/&gt;
&lt;property name="ldapServers"&gt;
&lt;list&gt;
&lt;bean id="ldapServer1" class="org.maxkey.web.authentication.realm.ldap.LdapServer"&gt;
&lt;property name="ldapUtils"&gt;
&lt;bean id="ldapUtils" class="org.maxkey.ldap.LdapUtils"&gt;
&lt;property name="providerUrl" value="ldap://localhost:389"&gt;&lt;/property&gt;
&lt;property name="principal" value="cn=root"&gt;&lt;/property&gt;
&lt;property name="credentials" value="rootroot"&gt;&lt;/property&gt;
&lt;property name="baseDN" value="dc=connsec,dc=com"&gt;&lt;/property&gt;
&lt;/bean&gt;
&lt;/property&gt;
&lt;property name="filterAttribute" value="uid"&gt;&lt;/property&gt;
&lt;/bean&gt;
&lt;/list&gt;
&lt;/property&gt;
&lt;/bean&gt;
</code></pre>
<h3>Active Directory支持</h3>
<pre><code class="xml hljs">
&lt;!-- Active Directory Realm --&gt;
&lt;bean id="authenticationRealm" class="org.maxkey.web.authentication.realm.activedirectory.ActiveDirectoryAuthenticationRealm"&gt;
&lt;constructor-arg ref="jdbcTemplate"/&gt;
&lt;property name="activeDirectoryServers"&gt;
&lt;list&gt;
&lt;bean id="activeDirectory1" class="org.maxkey.web.authentication.realm.activedirectory.ActiveDirectoryServer"&gt;
&lt;property name="activeDirectoryUtils"&gt;
&lt;bean id="ldapUtils" class="org.maxkey.ldap.ActiveDirectoryUtils"&gt;
&lt;property name="providerUrl" value="ldap://localhost:389"&gt;&lt;/property&gt;
&lt;property name="principal" value="cn=root"&gt;&lt;/property&gt;
&lt;property name="credentials" value="rootroot"&gt;&lt;/property&gt;
&lt;property name="domain" value="connsec"&gt;&lt;/property&gt;
&lt;/bean&gt;
&lt;/property&gt;
&lt;/bean&gt;
&lt;/list&gt;
&lt;/property&gt;
&lt;/bean&gt;
</code></pre>

View File

@@ -1,106 +0,0 @@
<h2>双因素认证MFA</h2>
<b>双因素身份认证</b>就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统。双因素认证是一种采用时间同步技术的系统,采用了基于时间、事件和密钥三变量而产生的一次性密码来代替传统的静态密码。每个动态密码卡都有一个唯一的密钥,该密钥同时存放在服务器端,每次认证时动态密码卡与服务器分别根据同样的密钥,同样的随机参数(时间、事件)和同样的算法计算了认证的动态密码,从而确保密码的一致性,从而实现了用户的认证。就像我们去银行办卡送的口令牌.
多因素认证MFA是一种计算机访问控制的方法用户要通过两种以上的认证机制之后才能得到授权使用计算机资源。MFA的目的是建立一个多层次的防御使未经授权的人访问计算机系统或网络更加困难从而提高安全性。
<h2>双因素认证</h2>
1、短信认证 腾讯云短信/阿里云短信/网易云信/定制
2、电子邮件
<h2>短信认证</h2>
配置maxkey中maxkey.properties
<pre><code class="ini hljs">
config.login.mfa=true
#TimeBasedOtpAuthn MailOtpAuthn SmsOtpAuthnYunxin SmsOtpAuthnAliyun SmsOtpAuthnTencentCloud
config.login.mfa.type=TimeBasedOtpAuthn
</code></pre>
<h3>腾讯云短信</h3>
配置maxkey中maxkey.properties
secretId 账号Appkey
secretKey 密钥appSecret
smsSdkAppid 短信SDKAPPID
templateId 短信模板ID
sign 签名
<pre><code class="ini hljs">
config.otp.sms.aliyun.accesskeyid=94395d754eb55693043f5d6a2b772ef4
config.otp.sms.aliyun.accesssecret=05d5485357bc
config.otp.sms.aliyun.templatecode=14860095
config.otp.sms.aliyun.signname=maxkey
</code></pre>
<h3>阿里云短信</h3>
配置maxkey中maxkey.properties
accessKeyId 账号Appkey
accessSecret 密钥appSecret
templateCode 短信模板ID
signName 签名
<pre><code class="ini hljs">
config.otp.sms.tencentcloud.secretid=94395d754eb55693043f5d6a2b772ef4
config.otp.sms.tencentcloud.secretkey=05d5485357bc
config.otp.sms.tencentcloud.smssdkappid=1486220095
config.otp.sms.tencentcloud.templateid=14860095
config.otp.sms.tencentcloud.sign=1486009522
</code></pre>
<h3>网易云信</h3>
配置maxkey中maxkey.properties
appKey 网易云信分配的账号Appkey
appSecret 网易云信分配的密钥appSecret
templateId 短信模板ID
<pre><code class="ini hljs">
config.otp.sms.yunxin.appkey=94395d754eb55693043f5d6a2b772ef4
config.otp.sms.yunxin.appsecret=05d5485357bc
config.otp.sms.yunxin.templateid=14860095
</code></pre>
<h2>电子邮件</h2>
配置邮箱地址
文件
maxkey/application.properties
<pre><code class="ini hljs">
# EMAIL configuration
spring.mail.default-encoding=utf-8
spring.mail.host=smtp.163.com
spring.mail.port=465
spring.mail.username=maxkey@163.com
spring.mail.password=password
spring.mail.protocol=smtp
spring.mail.properties.ssl=true
spring.mail.properties.sender=maxkey@163.com
</code></pre>
配置maxkey中application.properties
subject 邮件主题
messageTemplate 邮件内容模板,请勿修改参数{0}为用户名,{1}认证码,{2}有效间隔
<pre><code class="ini hljs">
spring.mail.properties.mailotp.message.subject=MaxKey One Time PassWord
spring.mail.properties.mailotp.message.template={0} You Token is {1} , it validity in {2} minutes.
</code></pre>

View File

@@ -1,67 +0,0 @@
<h2>第三方账号登录</h2>
为了方便用户的登录,可以通过第三方的账号(例如新浪微博、微信、钉钉等)登录MaxKey简单配置即可实现用户登录。
本文以新浪微博为例
<img src="{{ "/images/authn/authn_s_1.png" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt=""/>
<h3>登录流程</h3>
<img src="{{ "/images/authn/authn_s.png" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt=""/>
<h3>第三方认证配置</h3>
在新浪微博开放平台https://open.weibo.com/申请接入,新浪配置如下
<img src="{{ "/images/authn/authn_s_2.png" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt=""/>
<img src="{{ "/images/authn/authn_s_3.png" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt=""/>
<h3>认证配置</h3>
文件
maxkey/maxkey.properties
<pre><code class="ini hljs">
#enable social sign on
config.login.socialsignon=true
#sina weibo
config.socialsignon.sinaweibo.provider=sinaweibo
#登录提示
config.socialsignon.sinaweibo.provider.name=新浪微博
#图片
config.socialsignon.sinaweibo.icon=images/social/sinaweibo.png
#新浪client.id
config.socialsignon.sinaweibo.client.id=3379757634
#新浪client.secret
config.socialsignon.sinaweibo.client.secret=1adfdf9800299037bcab9d1c238664ba
#
config.socialsignon.sinaweibo.account.id=id
#排序
config.socialsignon.sinaweibo.sortorder=1
</code></pre>
配置maxkey/maxkey.properties
<pre><code class="ini hljs">
#enable social sign on
config.login.socialsignon=true
#social sign on providers
config.login.socialsignon.providers=sinaweibo,google,qq,dingtalk,microsoft,facebook
</code></pre>
<h3>账号绑定</h3>
登录MaxKey并绑定新浪微博账号
<img src="{{ "/images/authn/authn_s_4.png" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt=""/>
<h3>登录测试</h3>
退出后进入登录界面点击新浪微博图标跳转到新浪微博输入用户名和密码后直接登录MaxKey,即MaxKey信任了微博账号
<h3>第三方支持</h3>
MaxKey使用JustAuth作为第三方OAuth2登录认证库认证所支持的第三方请见JustAuth官方说明
<a href="https://docs.justauth.whnb.wang/#/" target="_blank" alt="JustAuth">
<img style="width:250px;" src="{{ "/images/authn/justauth.png" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt=""/>
</a>

View File

File diff suppressed because one or more lines are too long

View File

@@ -1,21 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#banner, #footer, #leftcol, #breadcrumbs, .docs #toc, .docs .courtesylinks, #leftColumn, #navColumn {display: none !important;}
#bodyColumn, body.docs div.docs {margin: 0 !important;border: none !important}

View File

@@ -1 +0,0 @@
/* You can override this file with your own styles */

View File

@@ -1,60 +0,0 @@
.highlight { background: #ffffff; }
.highlight .c { color: #999988; font-style: italic } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { font-weight: bold } /* Keyword */
.highlight .o { font-weight: bold } /* Operator */
.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */
.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #999999 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #aaaaaa } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { font-weight: bold } /* Keyword.Constant */
.highlight .kd { font-weight: bold } /* Keyword.Declaration */
.highlight .kp { font-weight: bold } /* Keyword.Pseudo */
.highlight .kr { font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #009999 } /* Literal.Number */
.highlight .s { color: #d14 } /* Literal.String */
.highlight .na { color: #008080 } /* Name.Attribute */
.highlight .nb { color: #0086B3 } /* Name.Builtin */
.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
.highlight .no { color: #008080 } /* Name.Constant */
.highlight .ni { color: #800080 } /* Name.Entity */
.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */
.highlight .nn { color: #555555 } /* Name.Namespace */
.highlight .nt { color: #000080 } /* Name.Tag */
.highlight .nv { color: #008080 } /* Name.Variable */
.highlight .ow { font-weight: bold } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mf { color: #009999 } /* Literal.Number.Float */
.highlight .mh { color: #009999 } /* Literal.Number.Hex */
.highlight .mi { color: #009999 } /* Literal.Number.Integer */
.highlight .mo { color: #009999 } /* Literal.Number.Oct */
.highlight .sb { color: #d14 } /* Literal.String.Backtick */
.highlight .sc { color: #d14 } /* Literal.String.Char */
.highlight .sd { color: #d14 } /* Literal.String.Doc */
.highlight .s2 { color: #d14 } /* Literal.String.Double */
.highlight .se { color: #d14 } /* Literal.String.Escape */
.highlight .sh { color: #d14 } /* Literal.String.Heredoc */
.highlight .si { color: #d14 } /* Literal.String.Interpol */
.highlight .sx { color: #d14 } /* Literal.String.Other */
.highlight .sr { color: #009926 } /* Literal.String.Regex */
.highlight .s1 { color: #d14 } /* Literal.String.Single */
.highlight .ss { color: #990073 } /* Literal.String.Symbol */
.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
.highlight .vc { color: #008080 } /* Name.Variable.Class */
.highlight .vg { color: #008080 } /* Name.Variable.Global */
.highlight .vi { color: #008080 } /* Name.Variable.Instance */
.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */

File diff suppressed because it is too large Load Diff

View File

@@ -1,348 +0,0 @@
<h2>开发指南</h2>
<h3>开发工具及相关软件</h3>
JDK 1.8 +
Gradle 6.0 +
eclipse-jee-2019-12 +
Tomcat 9 +
MySQL Server 5.5 +
kafka 2.5.0 +
Redis 6 +
OpenLDAP 2.2 +
<h3>程序目录</h3>
<table border="0" class="table table-striped table-bordered ">
<thead>
<th >MaxKey</th><th>一级目录</th><th>二级目录</th><th>三级目录</th><th>说明</th>
</thead>
<tbody>
<tr>
<td></td>
<td>README.md</td>
<td></td>
<td></td>
<td>关于MaxKey项目</td>
</tr>
<tr>
<td></td>
<td>LICENSE</td>
<td></td>
<td></td>
<td>许可证</td>
</tr>
<tr>
<td></td>
<td>database-sql</td>
<td></td>
<td></td>
<td>版本对应MYSQL</td>
</tr>
<tr>
<td></td>
<td>docs</td>
<td></td>
<td></td>
<td>项目网站</td>
</tr>
<tr>
<td></td>
<td>gradle</td>
<td></td>
<td></td>
<td>gradle的配置</td>
</tr>
<tr>
<td></td>
<td>maxkey-authentications</td>
<td></td>
<td></td>
<td>登录认证</td>
</tr>
<tr>
<td></td>
<td>maxkey-client-sdk</td>
<td></td>
<td></td>
<td>JAVA集成使用SDK</td>
</tr>
<tr>
<td></td>
<td>maxkey-connectors</td>
<td></td>
<td></td>
<td>身份供应连接器</td>
</tr>
<tr>
<td></td>
<td></td>
<td>maxkey-connector-activedirectory</td>
<td></td>
<td>ActiveDirectory连接器</td>
</tr>
<tr>
<td></td>
<td></td>
<td>maxkey-connector-base</td>
<td></td>
<td>身份供应连接器接口</td>
</tr>
<tr>
<td></td>
<td></td>
<td>maxkey-connector-ldap</td>
<td></td>
<td>LDAP连接器</td>
</tr>
<tr>
<td></td>
<td></td>
<td>maxkey-connector-dingtalk</td>
<td></td>
<td>钉钉连接器</td>
</tr>
<tr>
<td></td>
<td></td>
<td>maxkey-connector-workweixin</td>
<td></td>
<td>企业微信连接器</td>
</tr>
<tr>
<td></td>
<td>maxkey-core</td>
<td></td>
<td></td>
<td>基础包</td>
</tr>
<tr>
<td></td>
<td>maxkey-dao</td>
<td></td>
<td></td>
<td>数据库访问</td>
</tr>
<tr>
<td></td>
<td>maxkey-identitys</td>
<td></td>
<td></td>
<td>身份管理</td>
</tr>
<tr>
<td></td>
<td></td>
<td>maxkey-identity-kafka</td>
<td></td>
<td>kafka身份同步</td>
</tr>
<tr>
<td></td>
<td></td>
<td>maxkey-identity-scim</td>
<td></td>
<td>SCIM2.0身份管理</td>
</tr>
<tr>
<td></td>
<td>maxkey-lib</td>
<td></td>
<td></td>
<td>使用jar包</td>
</tr>
<tr>
<td></td>
<td>maxkey-protocols</td>
<td></td>
<td></td>
<td>认证协议实现</td>
</tr>
<tr>
<td></td>
<td></td>
<td>maxkey-protocol-authorize</td>
<td></td>
<td>认证协议实现</td>
</tr>
<tr>
<td></td>
<td></td>
<td>maxkey-protocol-cas</td>
<td></td>
<td>CAS认证协议实现</td>
</tr>
<tr>
<td></td>
<td></td>
<td>maxkey-protocol-desktop</td>
<td></td>
<td>桌面认证实现模拟键盘输入登录</td>
</tr>
<tr>
<td></td>
<td></td>
<td>maxkey-protocol-extendapi</td>
<td></td>
<td>扩展API实现</td>
</tr>
<tr>
<td></td>
<td></td>
<td>maxkey-protocol-formbased</td>
<td></td>
<td>Formbased实现</td>
</tr>
<tr>
<td></td>
<td></td>
<td>maxkey-protocol-oauth-2.0</td>
<td></td>
<td>oauth-2.0实现</td>
</tr>
<tr>
<td></td>
<td></td>
<td>maxkey-protocol-saml-2.0</td>
<td></td>
<td>saml-2.0实现</td>
</tr>
<tr>
<td></td>
<td></td>
<td>maxkey-protocol-tokenbased</td>
<td></td>
<td>tokenbased实现</td>
</tr>
<tr>
<td></td>
<td>maxkey-web-manage</td>
<td></td>
<td></td>
<td>管理系统</td>
</tr>
<tr>
<td></td>
<td>maxkey-web-maxkey</td>
<td></td>
<td></td>
<td>认证系统</td>
</tr>
<tr>
<td></td>
<td>shellscript</td>
<td></td>
<td></td>
<td>启动脚本</td>
</tr>
<tr>
<td></td>
<td>build.gradle</td>
<td></td>
<td></td>
<td>工程构建及版本控制</td>
</tr>
<tr>
<td></td>
<td>gradle.properties</td>
<td></td>
<td></td>
<td>版本参数配置</td>
</tr>
<tr>
<td></td>
<td>settings.gradle</td>
<td></td>
<td></td>
<td>项目引入</td>
</tr>
<tr>
<td></td>
<td>gradleSetEnv.bat</td>
<td></td>
<td></td>
<td>JDK及Gradle路径配置用于构建脚本需要开发人员自行配置</td>
</tr>
<tr>
<td></td>
<td>gradleBuildClean.bat</td>
<td></td>
<td></td>
<td>清除历史构建版本</td>
</tr>
<tr>
<td></td>
<td>gradleBuildRelease.bat</td>
<td></td>
<td></td>
<td>构建新版本</td>
</tr>
<tr>
<td></td>
<td>gradleIDEClean.bat</td>
<td></td>
<td></td>
<td>清除IDE的设置</td>
</tr>
<tr>
<td></td>
<td>gradleIDETask.bat</td>
<td></td>
<td></td>
<td>设置IDE</td>
</tr>
</tbody>
</table>
<h3>工程构建BuildRelease</h3>
1. 配置环境变量
gradleSetEnv.bat
set JAVA_HOME=D:\JavaIDE\jdk1.8.0_91
set GRADLE_HOME=D:\JavaIDE\gradle-5.4.1
2. 启动构建
gradleBuildRelease.bat
3. 构建结果
构建包路径
MaxKey/build/maxkey-jars
依赖包路径
MaxKey/build/maxkey-depjars
<h3>问题及解决</h3>
问题1
“A cycle was detected in the build path of project: XXX”
解决方法:
Eclipse Menu -> Window -> Preferences... -> Java -> Compiler -> Building -> Building path problems -> Circular dependencies -> 将Error改成Warning
问题2
Access restriction
解决方案:
Eclipse Menu -> Window -> Preferences... -> Java -> Compiler -> Errors/Warnings界面的Deprecated and restricted API下。把Forbidden reference (access rules): 的规则由默认的Error改为Warning即可。

View File

@@ -1,49 +0,0 @@
<h1>下载</h1>
百度网盘下载
<table border="0" class="table table-striped table-bordered ">
<tbody>
<tr class="a">
<th>版本</th>
<th>日期</th>
<th>下载地址</th>
<th>提取码</th>
</tr>
<tr class="a">
<td>v 2.0.0 RC1 </td>
<td>2020/06/01</td>
<td> <a href="https://pan.baidu.com/s/1iXdknvvBUvaqSF6Ro2RDiw" target="_blank">链接下载</a> </td>
<td><b>jr9m</b> </td>
</tr>
<tr class="b">
<td>v 1.4.0 GA </td>
<td>2020/05/01</td>
<td> <a href="https://pan.baidu.com/s/1i53-oR-xnwZddqEl9dP4ag" target="_blank">链接下载</a> </td>
<td><b>f3fs</b> </td>
</tr>
<tr class="a">
<td>v 1.3.0 GA </td>
<td>2020/04/04</td>
<td> <a href="https://pan.baidu.com/s/1o7vfBeq21Az_0s0tJvObOw" target="_blank">链接下载</a> </td>
<td><b>20bj</b> </td>
</tr>
<tr class="b">
<td>v 1.2.1 GA </td>
<td>2020/02/29</td>
<td> <a href="https://pan.baidu.com/s/1FDkJ4DOMQq8tPAXrIfDeKA" target="_blank">链接下载</a> </td>
<td><b>yutq</b> </td>
</tr>
<tr class="a">
<td>v 1.2 GA </td>
<td>2020/01/18</td>
<td> <a href="https://pan.baidu.com/s/1NDeB_g_-6Qbn_bHkTGnFGA" target="_blank">链接下载</a> </td>
<td><b>6bda</b> </td>
</tr>
<tr class="b">
<td>v 1.0 GA </td>
<td>2019/12/06</td>
<td> <a href="https://pan.baidu.com/s/15j7RSUQybCVlHx8uyFk2rQ" target="_blank">链接下载</a> </td>
<td><b>g17z</b> </td>
</tr>
</tbody>
</table>

View File

@@ -1,388 +0,0 @@
<h2>专业术语词汇表Glossary</h2>
解释本文档所用到的专业术语。
<table border="0" class="table table-striped table-bordered ">
<thead>
<th >序号</th><th>简称(ShortName)</th><th>en(英文)</th><th>zh(中文名称)</th>
</thead>
<tbody>
<tr>
<td>1</td>
<td>SSO</td>
<td>Single sign-on</td>
<td>单点登录</td>
</tr>
<tr>
<td>2</td>
<td>IAM</td>
<td>Identity and Access Management</td>
<td>身份识别与访问管理</td>
</tr>
<tr>
<td>3</td>
<td>IdM</td>
<td>Identity management</td>
<td>身份管理</td>
</tr>
<tr>
<td>4</td>
<td>AM</td>
<td>Access Management</td>
<td>访问管理</td>
</tr>
<tr>
<td>5</td>
<td>AC</td>
<td>Access control</td>
<td>访问控制</td>
</tr>
<tr>
<td>6</td>
<td>FId</td>
<td>Identity Federation</td>
<td>联邦身份</td>
</tr>
<tr>
<td>7</td>
<td>FIdM</td>
<td>Federated Identity Management</td>
<td>联邦身份管理</td>
</tr>
<tr>
<td>8</td>
<td>Authz</td>
<td>Authorization </td>
<td>授权</td>
</tr>
<tr>
<td>9</td>
<td>Authn</td>
<td>Authentication</td>
<td>认证</td>
</tr>
<tr>
<td>10</td>
<td>IDaas</td>
<td>Identity Management as a Service</td>
<td>身份管理即服务</td>
</tr>
<tr>
<td>11</td>
<td>SAML</td>
<td>Security Assertion Markup Language</td>
<td>安全断言标记语言</td>
</tr>
<tr>
<td>12</td>
<td>OAuth</td>
<td>OAuth</td>
<td>为用户资源的授权提供了一个安全的、开放而又简易的标准</td>
</tr>
<tr>
<td>13</td>
<td>OAuth 2.0</td>
<td>OAuth 2.0</td>
<td>OAuth1a的升级</td>
</tr>
<tr>
<td>14</td>
<td>OpenID Connect(OIDC)</td>
<td>OpenID Connect</td>
<td>OpenID 的升级基于OAuth 2.0</td>
</tr>
<tr>
<td>15</td>
<td>OpenID</td>
<td>OpenID </td>
<td>以用户为中心的数字身份识别框架,它具有开放、分散、自由等特性</td>
</tr>
<tr>
<td>16</td>
<td>CAS</td>
<td>Central Authentication Service </td>
<td>中央认证服务,Yale 大学发起的一个开源项目</td>
</tr>
<tr>
<td>17</td>
<td>SCIM</td>
<td>System for Cross-Domain Identity Management</td>
<td>跨域系统身份管理</td>
</tr>
<tr>
<td>18</td>
<td>SPML</td>
<td>Service Provisioning Markup Language</td>
<td>服务供应标记语言</td>
</tr>
<tr>
<td>19</td>
<td>STS</td>
<td>Security Token Service</td>
<td>安全令牌服务</td>
</tr>
<tr>
<td>20</td>
<td>WS-Security</td>
<td>Web Services Security</td>
<td>Web服务安全</td>
</tr>
<tr>
<td>21</td>
<td>WS-Federation</td>
<td>Web Services Federation</td>
<td>基于Web服务的联邦身份验证规范</td>
</tr>
<tr>
<td>22</td>
<td>Token</td>
<td>Token</td>
<td>令牌</td>
</tr>
<tr>
<td>23</td>
<td>Kerberos</td>
<td>Kerberos</td>
<td>一种网络认证协议</td>
</tr>
<tr>
<td>24</td>
<td>CAPTCHA</td>
<td>CAPTCHA</td>
<td>验证字/验证码</td>
</tr>
<tr>
<td>25</td>
<td>X.509</td>
<td>X.509</td>
<td>数字证书的格式</td>
</tr>
<tr>
<td>26</td>
<td>PKI</td>
<td>Public Key Infrastructure</td>
<td>公钥基础设施</td>
</tr>
<tr>
<td>27</td>
<td>PMI</td>
<td>Privilege Management Infrastructure</td>
<td>授权管理基础设施</td>
</tr>
<tr>
<td>28</td>
<td>RBAC</td>
<td>Role-Based Access Control</td>
<td>基于角色的访问控制</td>
</tr>
<tr>
<td>29</td>
<td>ABAC</td>
<td>Attribute-Based Access Control</td>
<td>基于属性的访问控制</td>
</tr>
<tr>
<td>30</td>
<td>PBAC</td>
<td>Policy-Based Access Control</td>
<td>基于策略的访问控制</td>
</tr>
<tr>
<td>31</td>
<td>XACML</td>
<td>Xtensible Access Control Markup Language</td>
<td>可扩展的访问控制标记语言</td>
</tr>
<tr>
<td>32</td>
<td>IdP</td>
<td>Identity Provider</td>
<td>身份提供者</td>
</tr>
<tr>
<td>33</td>
<td>SP</td>
<td>Service Provider</td>
<td>服务提供者</td>
</tr>
<tr>
<td>34</td>
<td>CP</td>
<td>Claims Provider</td>
<td>声明提供者/IdP</td>
</tr>
<tr>
<td>35</td>
<td>RP</td>
<td>Relying Party</td>
<td>依赖提供者/SP</td>
</tr>
<tr>
<td>36</td>
<td>Account Provisioning</td>
<td>Account Provisioning</td>
<td>账号供应</td>
</tr>
<tr>
<td>37</td>
<td>OTP</td>
<td>One Time Password</td>
<td>一次性密码</td>
</tr>
<tr>
<td>38</td>
<td>TFA</td>
<td>Two-Factor Authentication</td>
<td>双因素认证</td>
</tr>
<tr>
<td>39</td>
<td>LDAP</td>
<td>Lightweight Directory Access Protocol</td>
<td>轻量级目录访问协议</td>
</tr>
<tr>
<td>40</td>
<td>Directory Service</td>
<td>Directory Service</td>
<td>目录服务</td>
</tr>
<tr>
<td>41</td>
<td>AD</td>
<td>Active Directory</td>
<td>微软活动目录</td>
</tr>
<tr>
<td>42</td>
<td>ADFS</td>
<td>Active Directory Federation Services</td>
<td>基于微软活动目录的联邦服务</td>
</tr>
<tr>
<td>43</td>
<td>XMPP</td>
<td>Extensible Messaging and Presence Protocol</td>
<td>可扩展消息处理现场协议</td>
</tr>
<tr>
<td>44</td>
<td>XKMS</td>
<td>XML Key Management Service</td>
<td>XML密钥管理服务</td>
</tr>
<tr>
<td>45</td>
<td>XDAS</td>
<td>Distributed Audit Service</td>
<td>分布式审计服务</td>
</tr>
<tr>
<td>46</td>
<td>JDBC</td>
<td>Java Database Connectivity</td>
<td>Java数据库连接</td>
</tr>
<tr>
<td>47</td>
<td>JNDI</td>
<td>Java Naming and Directory Interface</td>
<td>Java命名和目录接口</td>
</tr>
<tr>
<td>48</td>
<td>API</td>
<td>Application Programming Interface</td>
<td>应用程序编程接口</td>
</tr>
<tr>
<td>49</td>
<td>Web Services</td>
<td>Web Services</td>
<td>Web服务</td>
</tr>
<tr>
<td>50</td>
<td>SOAP</td>
<td>Simple Object Access Protocol</td>
<td>简单对象访问协议</td>
</tr>
<tr>
<td>51</td>
<td>WSDL</td>
<td>Web Services Description Language</td>
<td>Web服务描述语言</td>
</tr>
<tr>
<td>52</td>
<td>REST</td>
<td>Representational state transfer</td>
<td>表征状态转移</td>
</tr>
<tr>
<td>53</td>
<td>RESTful</td>
<td>RESTful Web API</td>
<td>一个使用HTTP并遵循REST原则的Web服务</td>
</tr>
<tr>
<td>54</td>
<td>HTTP</td>
<td>Hypertext Transfer Protocol</td>
<td>超文本传输协议</td>
</tr>
<tr>
<td>55</td>
<td>HTTPS</td>
<td>Hypertext Transfer Protocol Secure</td>
<td>安全HTTP</td>
</tr>
<tr>
<td>56</td>
<td>SMTP</td>
<td>Simple Mail Transfer Protocol</td>
<td>简单邮件传输协议</td>
</tr>
<tr>
<td>56</td>
<td>SDK</td>
<td>Software Development Kit</td>
<td>软件开发包</td>
</tr>
<tr>
<td>57</td>
<td>IDE</td>
<td>Integrated Development Environment</td>
<td>集成开发环境</td>
</tr>
<tr>
<td>58</td>
<td>Adapter</td>
<td>Adapter</td>
<td>适配器,用于增强服务的功能,提供额外的服务</td>
</tr>
<tr>
<td>59</td>
<td>Connector</td>
<td>Connector</td>
<td>连接器,用于本地连接/同步数据到其他服务</td>
</tr>
<tr>
<td>60</td>
<td>HTTPHeader</td>
<td>HTTPHeader</td>
<td>HTTP请求头</td>
</tr>
<tr>
<td>61</td>
<td>JIT</td>
<td>Just-in-Time</td>
<td>实时/即时</td>
</tr>
</tbody>
</table>

View File

@@ -1,6 +0,0 @@
<h2>高可用性High Availability</h2>
架构Architecture
<img src="{{ "/images/maxkey_ha.png" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt=""/>

View File

@@ -1,48 +0,0 @@
<h1>MaxKey身份管理</h1>
<h3>身份管理是什么</h3>
**帐户**
计算机处理有关人的数据记录。此类记录包含为其创建和管理帐户的系统所需的技术信息。
**(数字)身份**
由一个数字主体对其自身提出的一组主张的表现。 确认是你!
您是否曾经被公司雇用进入组织或刚刚创建了新的OA帐户公司组织和云实体使用需要您的数据才能正常运行的应用程序用户名密码电子邮件名字姓氏等。
这些信息从哪里来?当需要启用更多应用程序时会发生什么?而且,如果您获得晋升并获得了已经可以访问的应用程序的更多权利该怎么办?最重要的是,当您退出或他们轻轻放开您时会发生什么?
简而言之,身份管理在整个“ 身份生命周期”中负责管理身份数据 。
<img src="{{ "/images/im/identityLifecycle.png" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt=""/>
<h3>MaxKey身份管理架构</h3>
基于**Apache Kafka**和MaxKey身份连接器(**Connector**)的管理架构
<img src="{{ "/images/im/maxkey_im.png" | prepend: site.baseurl }}?{{ site.time | date: "%Y%m%d%H%M" }}" alt=""/>
<h3>连接器Connector</h3>
ActiveDirectory Connector
LDAP Connector
JDBC Connector
SCIM 2 Connector
企业微信 Connector
钉钉 Connector
other coming soon

Binary file not shown.

Before

Width:  |  Height:  |  Size: 923 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 300 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 235 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 235 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 232 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 260 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 233 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Some files were not shown because too many files have changed in this diff Show More