mirror of
https://gitee.com/dromara/MaxKey.git
synced 2025-12-08 01:48:33 +08:00
gradle build
gradle build
This commit is contained in:
parent
c07aea5788
commit
ba66c919f0
17
build.gradle
17
build.gradle
@ -124,6 +124,7 @@ subprojects {
|
|||||||
mavenCentral()
|
mavenCentral()
|
||||||
jcenter()
|
jcenter()
|
||||||
maven { url "https://maven.eveoh.nl/content/repositories/releases" }
|
maven { url "https://maven.eveoh.nl/content/repositories/releases" }
|
||||||
|
maven { url "http://mvn.gt.igexin.com/nexus/content/repositories/releases"}
|
||||||
maven { url "https://plugins.gradle.org/m2/" }
|
maven { url "https://plugins.gradle.org/m2/" }
|
||||||
maven { url "http://repo.spring.io/plugins-release" }
|
maven { url "http://repo.spring.io/plugins-release" }
|
||||||
maven { url "https://repo.spring.io/milestone" }
|
maven { url "https://repo.spring.io/milestone" }
|
||||||
@ -319,7 +320,8 @@ subprojects {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* task checkenv<<{
|
task checkenv{
|
||||||
|
println 'check env for project '
|
||||||
//项目名
|
//项目名
|
||||||
println project.name
|
println project.name
|
||||||
//项目相对路径
|
//项目相对路径
|
||||||
@ -329,16 +331,18 @@ subprojects {
|
|||||||
//项目的绝对路径
|
//项目的绝对路径
|
||||||
println project.projectDir
|
println project.projectDir
|
||||||
//项目的build文件绝对路径
|
//项目的build文件绝对路径
|
||||||
println project.buildDir
|
println "buildDir " +project.buildDir
|
||||||
//项目所在的group
|
//项目所在的group
|
||||||
println project.group
|
println project.group
|
||||||
//项目的版本号
|
//项目的版本号
|
||||||
println project.version
|
println project.version
|
||||||
//项目的ant对象
|
//项目的ant对象
|
||||||
println project.ant
|
println project.ant
|
||||||
}*/
|
|
||||||
|
}
|
||||||
|
|
||||||
task copyjar2Release(type: Copy) {
|
task copyjar2Release(type: Copy) {
|
||||||
|
println "$buildDir/libs/ to $rootDir/build/jars/"
|
||||||
into "$rootDir/build/jars/"
|
into "$rootDir/build/jars/"
|
||||||
from "$buildDir/libs/"
|
from "$buildDir/libs/"
|
||||||
include '*.jar'
|
include '*.jar'
|
||||||
@ -361,10 +365,9 @@ subprojects {
|
|||||||
from "$buildDir/libs/"
|
from "$buildDir/libs/"
|
||||||
}
|
}
|
||||||
|
|
||||||
//task buildRelease(dependsOn:['build','war','copyjar2Release','copyWar2Release','copyotherWar2Release','copydemoWar2Release']) << {
|
task buildRelease(dependsOn:['build','jar','copyjar2Release']) {
|
||||||
//task buildRelease(dependsOn:['copyjar2Release','copyWar2Release','copyotherWar2Release','copydemoWar2Release']) << {
|
println 'Build MaxKey '+project.name +' complete .'
|
||||||
// println 'Build MaxKey '+project.name +' complete .'
|
}
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -14,7 +14,6 @@ call %GRADLE_HOME%/bin/gradle war
|
|||||||
|
|
||||||
call %GRADLE_HOME%/bin/gradle buildRelease
|
call %GRADLE_HOME%/bin/gradle buildRelease
|
||||||
|
|
||||||
call %GRADLE_HOME%/bin/gradle buildReleaseGear
|
|
||||||
|
|
||||||
cd build
|
cd build
|
||||||
rd /q /s libs
|
rd /q /s libs
|
||||||
|
|||||||
1
maxkey-client-sdk/.gitignore
vendored
Normal file
1
maxkey-client-sdk/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/build/
|
||||||
1
maxkey-core/.gitignore
vendored
Normal file
1
maxkey-core/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/build/
|
||||||
@ -6,8 +6,8 @@ import org.maxkey.util.PathUtils;
|
|||||||
public class PathUtilsTest {
|
public class PathUtilsTest {
|
||||||
@Test
|
@Test
|
||||||
public void test() {
|
public void test() {
|
||||||
System.out.println(PathUtils.getInstance().getAppPath());
|
//System.out.println(PathUtils.getInstance().getAppPath());
|
||||||
System.out.println(PathUtils.getInstance().getWebInf());
|
//System.out.println(PathUtils.getInstance().getWebInf());
|
||||||
System.out.println(PathUtils.getInstance().getClassPath());
|
//System.out.println(PathUtils.getInstance().getClassPath());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
1
maxkey-dao/.gitignore
vendored
Normal file
1
maxkey-dao/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/build/
|
||||||
@ -25,7 +25,7 @@ public class FormBasedDetailsServiceTest {
|
|||||||
public static AppsFormBasedDetailsService service;
|
public static AppsFormBasedDetailsService service;
|
||||||
|
|
||||||
public AppsFormBasedDetailsService getservice() {
|
public AppsFormBasedDetailsService getservice() {
|
||||||
service=(AppsFormBasedDetailsService)WebContext.getBean("formBasedDetailsService");
|
service=(AppsFormBasedDetailsService)WebContext.getBean("appsFormBasedDetailsService");
|
||||||
return service;
|
return service;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
1
maxkey-jose-jwt/.gitignore
vendored
Normal file
1
maxkey-jose-jwt/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/build/
|
||||||
1
maxkey-protocols/maxkey-protocol-authorize/.gitignore
vendored
Normal file
1
maxkey-protocols/maxkey-protocol-authorize/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/build/
|
||||||
@ -10,7 +10,7 @@ dependencies {
|
|||||||
compile project(":maxkey-dao")
|
compile project(":maxkey-dao")
|
||||||
compile project(":maxkey-jose-jwt")
|
compile project(":maxkey-jose-jwt")
|
||||||
compile project(":maxkey-client-sdk")
|
compile project(":maxkey-client-sdk")
|
||||||
compile project(":maxkey-protocols:maxkey-protocol-oauth-2.0")
|
//compileOnly project(":maxkey-protocols:maxkey-protocol-oauth-2.0")
|
||||||
compile project(":maxkey-protocols:maxkey-protocol-saml-2.0")
|
//compileOnly project(":maxkey-protocols:maxkey-protocol-saml-2.0")
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -5,16 +5,13 @@ package org.maxkey.authz.endpoint;
|
|||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
import org.maxkey.authz.oauth2.provider.ClientDetailsService;
|
|
||||||
import org.maxkey.client.utils.HttpEncoder;
|
|
||||||
import org.maxkey.constants.PROTOCOLS;
|
import org.maxkey.constants.PROTOCOLS;
|
||||||
import org.maxkey.dao.service.AppsCasDetailsService;
|
import org.maxkey.dao.service.AppsCasDetailsService;
|
||||||
import org.maxkey.domain.apps.Apps;
|
import org.maxkey.domain.apps.Apps;
|
||||||
import org.maxkey.domain.apps.oauth2.provider.ClientDetails;
|
|
||||||
import org.maxkey.web.WebConstants;
|
import org.maxkey.web.WebConstants;
|
||||||
import org.maxkey.web.WebContext;
|
import org.maxkey.web.WebContext;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Qualifier;
|
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
@ -26,12 +23,6 @@ import org.springframework.web.servlet.ModelAndView;
|
|||||||
*/
|
*/
|
||||||
@Controller
|
@Controller
|
||||||
public class AuthorizeEndpoint extends AuthorizeBaseEndpoint{
|
public class AuthorizeEndpoint extends AuthorizeBaseEndpoint{
|
||||||
private static final String OAUTH_V20_AUTHORIZATION_URL = "%s/oauth/v20/authorize?client_id=%s&response_type=code&redirect_uri=%s&approval_prompt=auto";
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
@Qualifier("oauth20JdbcClientDetailsService")
|
|
||||||
private ClientDetailsService clientDetailsService;
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
AppsCasDetailsService casDetailsService;
|
AppsCasDetailsService casDetailsService;
|
||||||
|
|
||||||
@ -51,23 +42,13 @@ public class AuthorizeEndpoint extends AuthorizeBaseEndpoint{
|
|||||||
}else if (application.getProtocol().equalsIgnoreCase(PROTOCOLS.FORMBASED)){
|
}else if (application.getProtocol().equalsIgnoreCase(PROTOCOLS.FORMBASED)){
|
||||||
modelAndView=WebContext.forward("/authz/formbased/"+id);
|
modelAndView=WebContext.forward("/authz/formbased/"+id);
|
||||||
}else if (application.getProtocol().equalsIgnoreCase(PROTOCOLS.OAUTH20)){
|
}else if (application.getProtocol().equalsIgnoreCase(PROTOCOLS.OAUTH20)){
|
||||||
ClientDetails clientDetails =clientDetailsService.loadClientByClientId(application.getId());
|
modelAndView=WebContext.forward("/authz/oauthv20/"+application.getId());
|
||||||
_logger.debug(""+clientDetails);
|
|
||||||
String authorizationUrl = String.format(OAUTH_V20_AUTHORIZATION_URL,
|
|
||||||
applicationConfig.getServerPrefix(),
|
|
||||||
clientDetails.getClientId(),
|
|
||||||
HttpEncoder.encode(clientDetails.getRegisteredRedirectUri().toArray()[0].toString())
|
|
||||||
);
|
|
||||||
|
|
||||||
_logger.debug("authorizationUrl "+authorizationUrl);
|
|
||||||
|
|
||||||
modelAndView=WebContext.redirect(authorizationUrl);
|
|
||||||
}else if (application.getProtocol().equalsIgnoreCase(PROTOCOLS.OPEN_ID_CONNECT)){
|
}else if (application.getProtocol().equalsIgnoreCase(PROTOCOLS.OPEN_ID_CONNECT)){
|
||||||
// modelAndView=new ModelAndView("openid connect");
|
// modelAndView=new ModelAndView("openid connect");
|
||||||
}else if (application.getProtocol().equalsIgnoreCase(PROTOCOLS.SAML20)){
|
}else if (application.getProtocol().equalsIgnoreCase(PROTOCOLS.SAML20)){
|
||||||
modelAndView=WebContext.forward("/authz/saml20/idpinit/"+application.getId());
|
modelAndView=WebContext.forward("/authz/saml20/idpinit/"+application.getId());
|
||||||
}else if (application.getProtocol().equalsIgnoreCase(PROTOCOLS.TOKENBASED)){
|
}else if (application.getProtocol().equalsIgnoreCase(PROTOCOLS.TOKENBASED)){
|
||||||
modelAndView=WebContext.forward("/authorize/tokenbased/"+id);
|
modelAndView=WebContext.forward("/authz/tokenbased/"+id);
|
||||||
}else if (application.getProtocol().equalsIgnoreCase(PROTOCOLS.CAS)){
|
}else if (application.getProtocol().equalsIgnoreCase(PROTOCOLS.CAS)){
|
||||||
modelAndView=WebContext.forward("/authz/cas/"+id);
|
modelAndView=WebContext.forward("/authz/cas/"+id);
|
||||||
}else if (application.getProtocol().equalsIgnoreCase(PROTOCOLS.DESKTOP)){
|
}else if (application.getProtocol().equalsIgnoreCase(PROTOCOLS.DESKTOP)){
|
||||||
|
|||||||
@ -1 +0,0 @@
|
|||||||
/com/
|
|
||||||
Binary file not shown.
@ -0,0 +1,179 @@
|
|||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
font-family: sans-serif;
|
||||||
|
font-size: 12pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
body, a, a:visited {
|
||||||
|
color: #303030;
|
||||||
|
}
|
||||||
|
|
||||||
|
#content {
|
||||||
|
padding-left: 50px;
|
||||||
|
padding-right: 50px;
|
||||||
|
padding-top: 30px;
|
||||||
|
padding-bottom: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#content h1 {
|
||||||
|
font-size: 160%;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#footer {
|
||||||
|
margin-top: 100px;
|
||||||
|
font-size: 80%;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
#footer, #footer a {
|
||||||
|
color: #a0a0a0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#line-wrapping-toggle {
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
#label-for-line-wrapping-toggle {
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2, h3 {
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 120%;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.tabLinks {
|
||||||
|
padding-left: 0;
|
||||||
|
padding-top: 10px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
overflow: auto;
|
||||||
|
min-width: 800px;
|
||||||
|
width: auto !important;
|
||||||
|
width: 800px;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.tabLinks li {
|
||||||
|
float: left;
|
||||||
|
height: 100%;
|
||||||
|
list-style: none;
|
||||||
|
padding-left: 10px;
|
||||||
|
padding-right: 10px;
|
||||||
|
padding-top: 5px;
|
||||||
|
padding-bottom: 5px;
|
||||||
|
margin-bottom: 0;
|
||||||
|
-moz-border-radius: 7px;
|
||||||
|
border-radius: 7px;
|
||||||
|
margin-right: 25px;
|
||||||
|
border: solid 1px #d4d4d4;
|
||||||
|
background-color: #f0f0f0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.tabLinks li:hover {
|
||||||
|
background-color: #fafafa;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.tabLinks li.selected {
|
||||||
|
background-color: #c5f0f5;
|
||||||
|
border-color: #c5f0f5;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.tabLinks a {
|
||||||
|
font-size: 120%;
|
||||||
|
display: block;
|
||||||
|
outline: none;
|
||||||
|
text-decoration: none;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.tabLinks li h2 {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.tab {
|
||||||
|
}
|
||||||
|
|
||||||
|
div.selected {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.deselected {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.tab table {
|
||||||
|
min-width: 350px;
|
||||||
|
width: auto !important;
|
||||||
|
width: 350px;
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.tab th, div.tab table {
|
||||||
|
border-bottom: solid #d0d0d0 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.tab th {
|
||||||
|
text-align: left;
|
||||||
|
white-space: nowrap;
|
||||||
|
padding-left: 6em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.tab th:first-child {
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.tab td {
|
||||||
|
white-space: nowrap;
|
||||||
|
padding-left: 6em;
|
||||||
|
padding-top: 5px;
|
||||||
|
padding-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.tab td:first-child {
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.tab td.numeric, div.tab th.numeric {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.code {
|
||||||
|
display: inline-block;
|
||||||
|
margin-top: 0em;
|
||||||
|
margin-bottom: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.code pre {
|
||||||
|
font-size: 11pt;
|
||||||
|
padding-top: 10px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
padding-left: 10px;
|
||||||
|
padding-right: 10px;
|
||||||
|
margin: 0;
|
||||||
|
background-color: #f7f7f7;
|
||||||
|
border: solid 1px #d0d0d0;
|
||||||
|
min-width: 700px;
|
||||||
|
width: auto !important;
|
||||||
|
width: 700px;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.wrapped pre {
|
||||||
|
word-wrap: break-word;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
word-break: break-all;
|
||||||
|
}
|
||||||
|
|
||||||
|
label.hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
@ -0,0 +1,84 @@
|
|||||||
|
|
||||||
|
#summary {
|
||||||
|
margin-top: 30px;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#summary table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
#summary td {
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
.breadcrumbs, .breadcrumbs a {
|
||||||
|
color: #606060;
|
||||||
|
}
|
||||||
|
|
||||||
|
.infoBox {
|
||||||
|
width: 110px;
|
||||||
|
padding-top: 15px;
|
||||||
|
padding-bottom: 15px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.infoBox p {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.counter, .percent {
|
||||||
|
font-size: 120%;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#duration {
|
||||||
|
width: 125px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#successRate, .summaryGroup {
|
||||||
|
border: solid 2px #d0d0d0;
|
||||||
|
-moz-border-radius: 10px;
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#successRate {
|
||||||
|
width: 140px;
|
||||||
|
margin-left: 35px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#successRate .percent {
|
||||||
|
font-size: 180%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.success, .success a {
|
||||||
|
color: #008000;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.success, #successRate.success {
|
||||||
|
background-color: #bbd9bb;
|
||||||
|
border-color: #008000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.failures, .failures a {
|
||||||
|
color: #b60808;
|
||||||
|
}
|
||||||
|
|
||||||
|
.skipped, .skipped a {
|
||||||
|
color: #c09853;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.failures, #successRate.failures {
|
||||||
|
background-color: #ecdada;
|
||||||
|
border-color: #b60808;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.linkList {
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.linkList li {
|
||||||
|
list-style: none;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
@ -0,0 +1,92 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||||||
|
<meta http-equiv="x-ua-compatible" content="IE=edge"/>
|
||||||
|
<title>Test results - Test Summary</title>
|
||||||
|
<link href="css/base-style.css" rel="stylesheet" type="text/css"/>
|
||||||
|
<link href="css/style.css" rel="stylesheet" type="text/css"/>
|
||||||
|
<script src="js/report.js" type="text/javascript"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="content">
|
||||||
|
<h1>Test Summary</h1>
|
||||||
|
<div id="summary">
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div class="summaryGroup">
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div class="infoBox" id="tests">
|
||||||
|
<div class="counter">0</div>
|
||||||
|
<p>tests</p>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<div class="infoBox" id="failures">
|
||||||
|
<div class="counter">0</div>
|
||||||
|
<p>failures</p>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<div class="infoBox" id="ignored">
|
||||||
|
<div class="counter">0</div>
|
||||||
|
<p>ignored</p>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<div class="infoBox" id="duration">
|
||||||
|
<div class="counter">-</div>
|
||||||
|
<p>duration</p>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<div class="infoBox success" id="successRate">
|
||||||
|
<div class="percent">-</div>
|
||||||
|
<p>successful</p>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div id="tabs">
|
||||||
|
<ul class="tabLinks">
|
||||||
|
<li>
|
||||||
|
<a href="#tab0">Classes</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div id="tab0" class="tab">
|
||||||
|
<h2>Classes</h2>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Class</th>
|
||||||
|
<th>Tests</th>
|
||||||
|
<th>Failures</th>
|
||||||
|
<th>Ignored</th>
|
||||||
|
<th>Duration</th>
|
||||||
|
<th>Success rate</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody/>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="footer">
|
||||||
|
<p>
|
||||||
|
<div>
|
||||||
|
<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
|
||||||
|
<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
|
||||||
|
</label>
|
||||||
|
</div>Generated by
|
||||||
|
<a href="http://www.gradle.org">Gradle 5.4.1</a> at 2019-11-10 12:36:07</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@ -0,0 +1,194 @@
|
|||||||
|
(function (window, document) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var tabs = {};
|
||||||
|
|
||||||
|
function changeElementClass(element, classValue) {
|
||||||
|
if (element.getAttribute("className")) {
|
||||||
|
element.setAttribute("className", classValue);
|
||||||
|
} else {
|
||||||
|
element.setAttribute("class", classValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getClassAttribute(element) {
|
||||||
|
if (element.getAttribute("className")) {
|
||||||
|
return element.getAttribute("className");
|
||||||
|
} else {
|
||||||
|
return element.getAttribute("class");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function addClass(element, classValue) {
|
||||||
|
changeElementClass(element, getClassAttribute(element) + " " + classValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeClass(element, classValue) {
|
||||||
|
changeElementClass(element, getClassAttribute(element).replace(classValue, ""));
|
||||||
|
}
|
||||||
|
|
||||||
|
function initTabs() {
|
||||||
|
var container = document.getElementById("tabs");
|
||||||
|
|
||||||
|
tabs.tabs = findTabs(container);
|
||||||
|
tabs.titles = findTitles(tabs.tabs);
|
||||||
|
tabs.headers = findHeaders(container);
|
||||||
|
tabs.select = select;
|
||||||
|
tabs.deselectAll = deselectAll;
|
||||||
|
tabs.select(0);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCheckBox() {
|
||||||
|
return document.getElementById("line-wrapping-toggle");
|
||||||
|
}
|
||||||
|
|
||||||
|
function getLabelForCheckBox() {
|
||||||
|
return document.getElementById("label-for-line-wrapping-toggle");
|
||||||
|
}
|
||||||
|
|
||||||
|
function findCodeBlocks() {
|
||||||
|
var spans = document.getElementById("tabs").getElementsByTagName("span");
|
||||||
|
var codeBlocks = [];
|
||||||
|
for (var i = 0; i < spans.length; ++i) {
|
||||||
|
if (spans[i].className.indexOf("code") >= 0) {
|
||||||
|
codeBlocks.push(spans[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return codeBlocks;
|
||||||
|
}
|
||||||
|
|
||||||
|
function forAllCodeBlocks(operation) {
|
||||||
|
var codeBlocks = findCodeBlocks();
|
||||||
|
|
||||||
|
for (var i = 0; i < codeBlocks.length; ++i) {
|
||||||
|
operation(codeBlocks[i], "wrapped");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function toggleLineWrapping() {
|
||||||
|
var checkBox = getCheckBox();
|
||||||
|
|
||||||
|
if (checkBox.checked) {
|
||||||
|
forAllCodeBlocks(addClass);
|
||||||
|
} else {
|
||||||
|
forAllCodeBlocks(removeClass);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function initControls() {
|
||||||
|
if (findCodeBlocks().length > 0) {
|
||||||
|
var checkBox = getCheckBox();
|
||||||
|
var label = getLabelForCheckBox();
|
||||||
|
|
||||||
|
checkBox.onclick = toggleLineWrapping;
|
||||||
|
checkBox.checked = false;
|
||||||
|
|
||||||
|
removeClass(label, "hidden");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function switchTab() {
|
||||||
|
var id = this.id.substr(1);
|
||||||
|
|
||||||
|
for (var i = 0; i < tabs.tabs.length; i++) {
|
||||||
|
if (tabs.tabs[i].id === id) {
|
||||||
|
tabs.select(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function select(i) {
|
||||||
|
this.deselectAll();
|
||||||
|
|
||||||
|
changeElementClass(this.tabs[i], "tab selected");
|
||||||
|
changeElementClass(this.headers[i], "selected");
|
||||||
|
|
||||||
|
while (this.headers[i].firstChild) {
|
||||||
|
this.headers[i].removeChild(this.headers[i].firstChild);
|
||||||
|
}
|
||||||
|
|
||||||
|
var h2 = document.createElement("H2");
|
||||||
|
|
||||||
|
h2.appendChild(document.createTextNode(this.titles[i]));
|
||||||
|
this.headers[i].appendChild(h2);
|
||||||
|
}
|
||||||
|
|
||||||
|
function deselectAll() {
|
||||||
|
for (var i = 0; i < this.tabs.length; i++) {
|
||||||
|
changeElementClass(this.tabs[i], "tab deselected");
|
||||||
|
changeElementClass(this.headers[i], "deselected");
|
||||||
|
|
||||||
|
while (this.headers[i].firstChild) {
|
||||||
|
this.headers[i].removeChild(this.headers[i].firstChild);
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = document.createElement("A");
|
||||||
|
|
||||||
|
a.setAttribute("id", "ltab" + i);
|
||||||
|
a.setAttribute("href", "#tab" + i);
|
||||||
|
a.onclick = switchTab;
|
||||||
|
a.appendChild(document.createTextNode(this.titles[i]));
|
||||||
|
|
||||||
|
this.headers[i].appendChild(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function findTabs(container) {
|
||||||
|
return findChildElements(container, "DIV", "tab");
|
||||||
|
}
|
||||||
|
|
||||||
|
function findHeaders(container) {
|
||||||
|
var owner = findChildElements(container, "UL", "tabLinks");
|
||||||
|
return findChildElements(owner[0], "LI", null);
|
||||||
|
}
|
||||||
|
|
||||||
|
function findTitles(tabs) {
|
||||||
|
var titles = [];
|
||||||
|
|
||||||
|
for (var i = 0; i < tabs.length; i++) {
|
||||||
|
var tab = tabs[i];
|
||||||
|
var header = findChildElements(tab, "H2", null)[0];
|
||||||
|
|
||||||
|
header.parentNode.removeChild(header);
|
||||||
|
|
||||||
|
if (header.innerText) {
|
||||||
|
titles.push(header.innerText);
|
||||||
|
} else {
|
||||||
|
titles.push(header.textContent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return titles;
|
||||||
|
}
|
||||||
|
|
||||||
|
function findChildElements(container, name, targetClass) {
|
||||||
|
var elements = [];
|
||||||
|
var children = container.childNodes;
|
||||||
|
|
||||||
|
for (var i = 0; i < children.length; i++) {
|
||||||
|
var child = children.item(i);
|
||||||
|
|
||||||
|
if (child.nodeType === 1 && child.nodeName === name) {
|
||||||
|
if (targetClass && child.className.indexOf(targetClass) < 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
elements.push(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return elements;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Entry point.
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
initTabs();
|
||||||
|
initControls();
|
||||||
|
};
|
||||||
|
} (window, window.document));
|
||||||
Binary file not shown.
@ -0,0 +1,7 @@
|
|||||||
|
Manifest-Version: 1.0
|
||||||
|
Implementation-Title: maxkey-protocol-cas
|
||||||
|
Implementation-Version: 1.0.0.RELEASE
|
||||||
|
Implementation-Date: 2019-11-10T12:35:40.160+08:00[Asia/Shanghai]
|
||||||
|
Created-By: org.maxkey
|
||||||
|
Implementation-Vendor: https://github.com/shimingxy/MaxKey
|
||||||
|
|
||||||
Binary file not shown.
@ -0,0 +1,7 @@
|
|||||||
|
Manifest-Version: 1.0
|
||||||
|
Implementation-Title: maxkey-protocol-desktop
|
||||||
|
Implementation-Version: 1.0.0.RELEASE
|
||||||
|
Implementation-Date: 2019-11-10T12:35:40.172+08:00[Asia/Shanghai]
|
||||||
|
Created-By: org.maxkey
|
||||||
|
Implementation-Vendor: https://github.com/shimingxy/MaxKey
|
||||||
|
|
||||||
Binary file not shown.
@ -0,0 +1,7 @@
|
|||||||
|
Manifest-Version: 1.0
|
||||||
|
Implementation-Title: maxkey-protocol-extendapi
|
||||||
|
Implementation-Version: 1.0.0.RELEASE
|
||||||
|
Implementation-Date: 2019-11-10T12:35:40.185+08:00[Asia/Shanghai]
|
||||||
|
Created-By: org.maxkey
|
||||||
|
Implementation-Vendor: https://github.com/shimingxy/MaxKey
|
||||||
|
|
||||||
Binary file not shown.
@ -0,0 +1,7 @@
|
|||||||
|
Manifest-Version: 1.0
|
||||||
|
Implementation-Title: maxkey-protocol-formbased
|
||||||
|
Implementation-Version: 1.0.0.RELEASE
|
||||||
|
Implementation-Date: 2019-11-10T12:35:40.194+08:00[Asia/Shanghai]
|
||||||
|
Created-By: org.maxkey
|
||||||
|
Implementation-Vendor: https://github.com/shimingxy/MaxKey
|
||||||
|
|
||||||
@ -7,6 +7,7 @@ dependencies {
|
|||||||
compile project(":maxkey-core")
|
compile project(":maxkey-core")
|
||||||
compile project(":maxkey-dao")
|
compile project(":maxkey-dao")
|
||||||
compile project(":maxkey-jose-jwt")
|
compile project(":maxkey-jose-jwt")
|
||||||
|
compile project(":maxkey-client-sdk")
|
||||||
compile project(":maxkey-protocols:maxkey-protocol-authorize")
|
compile project(":maxkey-protocols:maxkey-protocol-authorize")
|
||||||
|
|
||||||
}
|
}
|
||||||
Binary file not shown.
@ -0,0 +1,3 @@
|
|||||||
|
Manifest-Version: 1.0
|
||||||
|
Class-Path:
|
||||||
|
|
||||||
@ -0,0 +1,2 @@
|
|||||||
|
http\://www.springframework.org/schema/security/oauth2=org.springframework.security.oauth2.config.xml.OAuth2SecurityNamespaceHandler
|
||||||
|
http\://www.springframework.org/schema/security/oauth=org.springframework.security.oauth.config.OAuthSecurityNamespaceHandler
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
http\://www.springframework.org/schema/security/spring-security-oauth2-1.0.xsd=org/springframework/security/oauth2/spring-security-oauth2-1.0.xsd
|
||||||
|
http\://www.springframework.org/schema/security/spring-security-oauth2-2.0.xsd=org/springframework/security/oauth2/spring-security-oauth2-2.0.xsd
|
||||||
|
http\://www.springframework.org/schema/security/spring-security-oauth2.xsd=org/springframework/security/oauth2/spring-security-oauth2-2.0.xsd
|
||||||
|
http\://www.springframework.org/schema/security/spring-security-oauth-1.0.xsd=org/springframework/security/oauth/spring-security-oauth-1.0.xsd
|
||||||
|
http\://www.springframework.org/schema/security/spring-security-oauth.xsd=org/springframework/security/oauth/spring-security-oauth-1.0.xsd
|
||||||
@ -0,0 +1,728 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<xs:schema xmlns="http://www.springframework.org/schema/security/oauth2" xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns:beans="http://www.springframework.org/schema/beans" targetNamespace="http://www.springframework.org/schema/security/oauth2"
|
||||||
|
elementFormDefault="qualified" attributeFormDefault="unqualified">
|
||||||
|
|
||||||
|
<xs:import namespace="http://www.springframework.org/schema/beans" schemaLocation="http://www.springframework.org/schema/beans/spring-beans-3.1.xsd" />
|
||||||
|
|
||||||
|
<xs:element name="rest-template">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
Creates an OAuth2RestTemplate with all the pieces needed to connect to a remote resource from
|
||||||
|
a web
|
||||||
|
application. Injects request and session-scoped beans into the template, so can only be
|
||||||
|
used in the context of a web
|
||||||
|
request.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:complexContent>
|
||||||
|
<xs:extension base="beans:identifiedType">
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:element ref="beans:description" minOccurs="0" />
|
||||||
|
<xs:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xs:element ref="beans:property" />
|
||||||
|
</xs:choice>
|
||||||
|
</xs:sequence>
|
||||||
|
<xs:attribute name="resource">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The OAuth2ProtectedResourceDetails governing the configuration of this client. Mandatory.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="access-token-provider" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The reference to the bean that manages access token acquisition. Optional (defaults to a chain
|
||||||
|
including common grant types from the spec).
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
</xs:extension>
|
||||||
|
</xs:complexContent>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
<xs:element name="authorization-server">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
Specifies that the oauth 2 authorization and token
|
||||||
|
endpoints should be created in the application
|
||||||
|
context. These are
|
||||||
|
implemented as regular Spring @Controller beans, so as long as the
|
||||||
|
default Spring MVC set up in
|
||||||
|
present in the application
|
||||||
|
the endpoints should work (at /oauth/authorization and /oauth/token by
|
||||||
|
default).
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
<xs:complexType>
|
||||||
|
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:element name="authorization-code" minOccurs="0" maxOccurs="1">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The configuration of the authorization code
|
||||||
|
mechanism. This
|
||||||
|
mechanism enables a way for clients to
|
||||||
|
obtain an
|
||||||
|
access token by obtaining an authorization code.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="disabled" type="xs:boolean">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
Whether to disable the authorization code
|
||||||
|
mechanism.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="authorization-code-services-ref" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The reference to the bean that defines the
|
||||||
|
authorization code
|
||||||
|
services. Default value is an
|
||||||
|
instance of
|
||||||
|
"org.springframework.security.oauth2.provider.authorization_code.InMemoryAuthorizationCodeServices".
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
<xs:element name="implicit" minOccurs="0" maxOccurs="1">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The configuration of the client credentials
|
||||||
|
grant type.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="disabled" type="xs:boolean">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
Whether to disable the implicit grant type
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
<xs:element name="refresh-token" minOccurs="0" maxOccurs="1">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The configuration of the refresh token grant
|
||||||
|
type.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="disabled" type="xs:boolean">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
Whether to disable the refresh token grant
|
||||||
|
type
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
<xs:element name="client-credentials" minOccurs="0" maxOccurs="1">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The configuration of the client credentials
|
||||||
|
grant type.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="disabled" type="xs:boolean">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
Whether to disable the refresh token grant
|
||||||
|
type
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
<xs:element name="password" minOccurs="0" maxOccurs="1">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The configuration of the resource owner password
|
||||||
|
grant type.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="disabled" type="xs:boolean">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
Whether to disable the refresh token grant
|
||||||
|
type
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="authentication-manager-ref" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
A reference to an authentication manager that
|
||||||
|
can be used to
|
||||||
|
authenticate the resource owner
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
<xs:element name="custom-grant" minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The configuration of your custom grant type.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="disabled" type="xs:boolean">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
Whether to disable this grant
|
||||||
|
type
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="token-granter-ref" type="xs:string" use="required">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
A reference to your token granter
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:sequence>
|
||||||
|
<xs:attribute name="client-details-service-ref" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The reference to the bean that defines the client
|
||||||
|
details service.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="token-endpoint-url" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The URL at which a request for an access token
|
||||||
|
will be serviced.
|
||||||
|
Default value: "/oauth/token"
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="authorization-endpoint-url" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The URL at which a user is redirected for
|
||||||
|
authorization. Default
|
||||||
|
value: "/oauth/authorize"
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
|
||||||
|
<!--the following attributes are less used -->
|
||||||
|
<xs:attribute name="token-granter-ref" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The reference to the bean that defines the
|
||||||
|
granter of different oauth
|
||||||
|
token types.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
|
||||||
|
<xs:attribute name="implicit-grant-service-ref" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The reference to the bean that defines the
|
||||||
|
implicit grant service.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
|
||||||
|
<xs:attribute name="token-services-ref" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The reference to the bean that defines the token
|
||||||
|
services. Default
|
||||||
|
value is an instance of
|
||||||
|
"org.springframework.security.oauth2.provider.token.DefaultTokenServices".
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
|
||||||
|
<xs:attribute name="authorization-request-manager-ref" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The reference to the bean that defines the manager for
|
||||||
|
authorization requests from the input
|
||||||
|
parameters (e.g. request parameters).
|
||||||
|
Default
|
||||||
|
value is an
|
||||||
|
instance of
|
||||||
|
"org.springframework.security.oauth2.provider.token.DefaultAuthorizationRequestManager".
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
|
||||||
|
<xs:attribute name="user-approval-handler-ref" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
Reference to a bean that handles user approval decisions. Using this strategy servers can
|
||||||
|
selectively skip the approval process depending on decisions in the past or on the type of client.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
|
||||||
|
<xs:attribute name="user-approval-page" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The URL of the page that handles the user
|
||||||
|
approval form (if needed, depending on the grant type).
|
||||||
|
The default is "forward:/oauth/confirm_access" which is not handled
|
||||||
|
by the authorization endpoint, so normally you
|
||||||
|
will have to supply a handler
|
||||||
|
for this path.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
|
||||||
|
<xs:attribute name="error-page" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The URL of the page that handles errors (default forward:/oauth/error).
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
|
||||||
|
<xs:attribute name="approval-parameter-name" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The name of the form parameter that is used to
|
||||||
|
indicate user
|
||||||
|
approval of the client
|
||||||
|
authentication
|
||||||
|
request.
|
||||||
|
Default value: "user_oauth_approval".
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
|
||||||
|
<xs:attribute name="redirect-resolver-ref" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The reference to the bean that defines the
|
||||||
|
redirect resolver, used
|
||||||
|
during the user
|
||||||
|
authorization.
|
||||||
|
Default
|
||||||
|
value is an instance of
|
||||||
|
"org.springframework.security.oauth2.provider.authorization_code.DefaultRedirectResolver".
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
<xs:element name="resource-server">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
Specifies that there are oauth 2 protected resources in
|
||||||
|
the application context. This element
|
||||||
|
has an
|
||||||
|
id which is the bean id of the filter created. The filter
|
||||||
|
should be added to the Spring Security filter chain at
|
||||||
|
position before="PRE_AUTH_FILTER"
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:complexContent>
|
||||||
|
<xs:extension base="beans:identifiedType">
|
||||||
|
|
||||||
|
<xs:attribute name="resource-id" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The resource id that is protected by this filter
|
||||||
|
if any. If empty or
|
||||||
|
absent then all resource ids
|
||||||
|
are allowed,
|
||||||
|
otherwise
|
||||||
|
only tokens which are granted to a client that contains
|
||||||
|
this reosurce
|
||||||
|
id will be legal.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
|
||||||
|
<xs:attribute name="token-services-ref" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The reference to the bean that defines the token
|
||||||
|
services. Default
|
||||||
|
value is an instance of
|
||||||
|
"org.springframework.security.oauth2.provider.token.DefaultTokenServices".
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
|
||||||
|
<xs:attribute name="entry-point-ref" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The reference to the bean that defines the entry point for failed authentications. Defaults to
|
||||||
|
a vanilla
|
||||||
|
org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
|
||||||
|
<xs:attribute name="auth-details-source-ref" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The reference to the bean that defines the AuthenticationDetailsSource.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
</xs:extension>
|
||||||
|
</xs:complexContent>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
<xs:element name="client-details-service">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
Default element that contains the definition of the
|
||||||
|
OAuth clients that are
|
||||||
|
allowed to access this
|
||||||
|
service.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:complexContent>
|
||||||
|
<xs:extension base="beans:identifiedType">
|
||||||
|
<xs:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xs:element name="client">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
Definition of a client that can act on behalf
|
||||||
|
of a user.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="client-id" type="xs:string" use="required">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The client id.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="secret" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The client secret. If the secret is
|
||||||
|
undefined or empty (the
|
||||||
|
default) the client does
|
||||||
|
not
|
||||||
|
require a
|
||||||
|
secret.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="redirect-uri" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The re-direct URI(s) established during
|
||||||
|
registration (optional, comma separated).
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="resource-ids" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The resource ids to which this client can be
|
||||||
|
granted access
|
||||||
|
(comma-separated). If missing or
|
||||||
|
empty all
|
||||||
|
resources are
|
||||||
|
accessible (not recommended by the spec).
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="scope" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The scopes to which the client is limited
|
||||||
|
(comma-separated). If
|
||||||
|
scope is undefined or empty
|
||||||
|
(the
|
||||||
|
default) the client
|
||||||
|
is not limited by scope, but in that case
|
||||||
|
the authorization
|
||||||
|
service must explicitly
|
||||||
|
accept unlimited
|
||||||
|
access by not
|
||||||
|
specifying any scopes itself.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="authorized-grant-types" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
Grant types that are authorized for the
|
||||||
|
client to use
|
||||||
|
(comma-separated). Currently defined
|
||||||
|
grant types
|
||||||
|
include
|
||||||
|
"authorization_code", "password", "assertion", and
|
||||||
|
"refresh_token". Default value is
|
||||||
|
"authorization_code,refresh_token".
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="authorities" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
Authorities that are granted to the client
|
||||||
|
(comma-separated). Distinct
|
||||||
|
from the authorities
|
||||||
|
granted to
|
||||||
|
the user on behalf
|
||||||
|
of whom the client is acting.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="access-token-validity" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The access token validity period in seconds (optional). If unspecified a global default will
|
||||||
|
be applied by the token services.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="refresh-token-validity" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The refresh token validity period in seconds (optional). If unspecified a global default
|
||||||
|
will
|
||||||
|
be applied by the token services.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:choice>
|
||||||
|
</xs:extension>
|
||||||
|
</xs:complexContent>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
<xs:element name="expression-handler">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
Element for declaring and configuring an expression
|
||||||
|
handler for oauth
|
||||||
|
security expressions. See
|
||||||
|
http://static.springsource.org/spring-security/site/docs/3.0.x/reference/el-access.html
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:complexContent>
|
||||||
|
<xs:extension base="beans:identifiedType" />
|
||||||
|
</xs:complexContent>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
<xs:element name="web-expression-handler">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
Element for declaring and configuring an expression
|
||||||
|
handler for oauth
|
||||||
|
security expressions in http
|
||||||
|
intercept urls. See
|
||||||
|
http://static.springsource.org/spring-security/site/docs/3.0.x/reference/el-access.html
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:complexContent>
|
||||||
|
<xs:extension base="beans:identifiedType" />
|
||||||
|
</xs:complexContent>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
<xs:element name="client">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
Creates the oauth 2 client filter be be added to the
|
||||||
|
application security policy.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:complexContent>
|
||||||
|
<xs:extension base="beans:identifiedType">
|
||||||
|
<xs:attribute name="redirect-strategy-ref" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The reference to the bean that defines the
|
||||||
|
redirect strategy, used when redirecting the user for
|
||||||
|
access authorization. Default value is an instance of
|
||||||
|
"org.springframework.security.web.DefaultRedirectStrategy".
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
</xs:extension>
|
||||||
|
</xs:complexContent>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
<xs:element name="resource">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
Definition of a remote resource that is protected via
|
||||||
|
OAuth2 to which this client application wants
|
||||||
|
access.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:complexContent>
|
||||||
|
<xs:extension base="beans:identifiedType">
|
||||||
|
<xs:attribute name="type" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The grant type. Currently defined grant types
|
||||||
|
include
|
||||||
|
"authorization_code", "password", and
|
||||||
|
"assertion".
|
||||||
|
Default value
|
||||||
|
is "authorization_code".
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="client-id" type="xs:string" use="required">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The client id. This is the id by which the
|
||||||
|
resource server will
|
||||||
|
identify this application.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="access-token-uri" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The uri to where the access token may be
|
||||||
|
obtained.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="scope" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
Comma-separted list of string specifying the
|
||||||
|
scope of the access to the
|
||||||
|
resource. By default,
|
||||||
|
no
|
||||||
|
scope will be
|
||||||
|
specified.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="client-secret" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The secret asssociated with the resource. By
|
||||||
|
default, no secret
|
||||||
|
will be supplied for access to
|
||||||
|
the resource.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="client-authentication-scheme" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The scheme that is used to pass the client
|
||||||
|
secret. Suggested
|
||||||
|
values: "header" and "form".
|
||||||
|
Default:
|
||||||
|
"header".
|
||||||
|
See section 2.1 of the OAuth 2 spec.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="user-authorization-uri" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The uri to which the user will be redirected if
|
||||||
|
the user is ever
|
||||||
|
needed to grant an authorization
|
||||||
|
code.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="authentication-scheme" default="header" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The method for bearing the token when accessing
|
||||||
|
the resource.
|
||||||
|
Default value is "header". See
|
||||||
|
AuthenticationScheme enum for possible values.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="token-name" type="xs:string" default="access_token">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The name of the bearer token. The default is
|
||||||
|
"access_token", which
|
||||||
|
is according to the spec,
|
||||||
|
but
|
||||||
|
some providers
|
||||||
|
(e.g. Facebook) don't conform to the spec.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="pre-established-redirect-uri" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
Some resource servers may require a
|
||||||
|
pre-established URI to which
|
||||||
|
they will redirect users after
|
||||||
|
users
|
||||||
|
authorize an access token.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="use-current-uri" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
Boolean flag indicating that the current URI should be used as a redirect (if available) rather
|
||||||
|
than the
|
||||||
|
registered redirect URI. Default is true.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="username" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The username for authentication, required only when type is "password".
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="password" type="xs:string">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
The password for authentication, required only when type is "password".
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
</xs:extension>
|
||||||
|
</xs:complexContent>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
</xs:schema>
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
Manifest-Version: 1.0
|
||||||
|
Implementation-Title: maxkey-protocol-oauth-2.0
|
||||||
|
Implementation-Version: 1.0.0.RELEASE
|
||||||
|
Implementation-Date: 2019-11-10T12:35:40.204+08:00[Asia/Shanghai]
|
||||||
|
Created-By: org.maxkey
|
||||||
|
Implementation-Vendor: https://github.com/shimingxy/MaxKey
|
||||||
|
|
||||||
@ -21,6 +21,10 @@ import java.util.LinkedHashMap;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.maxkey.authz.endpoint.AuthorizeBaseEndpoint;
|
||||||
import org.maxkey.authz.oauth2.common.OAuth2AccessToken;
|
import org.maxkey.authz.oauth2.common.OAuth2AccessToken;
|
||||||
import org.maxkey.authz.oauth2.common.exceptions.InvalidClientException;
|
import org.maxkey.authz.oauth2.common.exceptions.InvalidClientException;
|
||||||
import org.maxkey.authz.oauth2.common.exceptions.InvalidRequestException;
|
import org.maxkey.authz.oauth2.common.exceptions.InvalidRequestException;
|
||||||
@ -41,13 +45,20 @@ import org.maxkey.authz.oauth2.provider.code.AuthorizationCodeServices;
|
|||||||
import org.maxkey.authz.oauth2.provider.code.InMemoryAuthorizationCodeServices;
|
import org.maxkey.authz.oauth2.provider.code.InMemoryAuthorizationCodeServices;
|
||||||
import org.maxkey.authz.oauth2.provider.implicit.ImplicitTokenRequest;
|
import org.maxkey.authz.oauth2.provider.implicit.ImplicitTokenRequest;
|
||||||
import org.maxkey.authz.oauth2.provider.request.DefaultOAuth2RequestValidator;
|
import org.maxkey.authz.oauth2.provider.request.DefaultOAuth2RequestValidator;
|
||||||
|
import org.maxkey.client.utils.HttpEncoder;
|
||||||
|
import org.maxkey.config.ApplicationConfig;
|
||||||
import org.maxkey.domain.apps.oauth2.provider.ClientDetails;
|
import org.maxkey.domain.apps.oauth2.provider.ClientDetails;
|
||||||
import org.maxkey.web.WebContext;
|
import org.maxkey.web.WebContext;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
import org.springframework.security.authentication.InsufficientAuthenticationException;
|
import org.springframework.security.authentication.InsufficientAuthenticationException;
|
||||||
import org.springframework.security.core.Authentication;
|
import org.springframework.security.core.Authentication;
|
||||||
import org.springframework.security.core.AuthenticationException;
|
import org.springframework.security.core.AuthenticationException;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMethod;
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
@ -61,6 +72,7 @@ import org.springframework.web.servlet.view.RedirectView;
|
|||||||
import org.springframework.web.util.UriComponents;
|
import org.springframework.web.util.UriComponents;
|
||||||
import org.springframework.web.util.UriComponentsBuilder;
|
import org.springframework.web.util.UriComponentsBuilder;
|
||||||
import org.springframework.web.util.UriTemplate;
|
import org.springframework.web.util.UriTemplate;
|
||||||
|
import org.maxkey.authz.oauth2.provider.ClientDetailsService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
@ -82,9 +94,18 @@ import org.springframework.web.util.UriTemplate;
|
|||||||
@Controller
|
@Controller
|
||||||
@SessionAttributes("authorizationRequest")
|
@SessionAttributes("authorizationRequest")
|
||||||
public class AuthorizationEndpoint extends AbstractEndpoint {
|
public class AuthorizationEndpoint extends AbstractEndpoint {
|
||||||
|
final static Logger _logger = LoggerFactory.getLogger(AuthorizationEndpoint.class);
|
||||||
|
|
||||||
|
private static final String OAUTH_V20_AUTHORIZATION_URL = "%s/oauth/v20/authorize?client_id=%s&response_type=code&redirect_uri=%s&approval_prompt=auto";
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
@Qualifier("oauth20JdbcClientDetailsService")
|
||||||
|
private ClientDetailsService clientDetailsService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
@Qualifier("applicationConfig")
|
||||||
|
protected ApplicationConfig applicationConfig;
|
||||||
|
|
||||||
|
|
||||||
private RedirectResolver redirectResolver = new DefaultRedirectResolver();
|
private RedirectResolver redirectResolver = new DefaultRedirectResolver();
|
||||||
|
|
||||||
private UserApprovalHandler userApprovalHandler = new DefaultUserApprovalHandler();
|
private UserApprovalHandler userApprovalHandler = new DefaultUserApprovalHandler();
|
||||||
@ -488,5 +509,21 @@ public class AuthorizationEndpoint extends AbstractEndpoint {
|
|||||||
this.oauth2RequestValidator = oauth2RequestValidator;
|
this.oauth2RequestValidator = oauth2RequestValidator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RequestMapping("/authz/oauthv20/{id}")
|
||||||
|
public ModelAndView authorize(
|
||||||
|
HttpServletRequest request,
|
||||||
|
HttpServletResponse response,
|
||||||
|
@PathVariable("id") String id){
|
||||||
|
ClientDetails clientDetails =clientDetailsService.loadClientByClientId(id);
|
||||||
|
_logger.debug(""+clientDetails);
|
||||||
|
String authorizationUrl = String.format(OAUTH_V20_AUTHORIZATION_URL,
|
||||||
|
applicationConfig.getServerPrefix(),
|
||||||
|
clientDetails.getClientId(),
|
||||||
|
HttpEncoder.encode(clientDetails.getRegisteredRedirectUri().toArray()[0].toString())
|
||||||
|
);
|
||||||
|
|
||||||
|
_logger.debug("authorizationUrl "+authorizationUrl);
|
||||||
|
|
||||||
|
return WebContext.redirect(authorizationUrl);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1 +0,0 @@
|
|||||||
/org/
|
|
||||||
Binary file not shown.
@ -0,0 +1,7 @@
|
|||||||
|
Manifest-Version: 1.0
|
||||||
|
Implementation-Title: maxkey-protocol-saml-2.0
|
||||||
|
Implementation-Version: 1.0.0.RELEASE
|
||||||
|
Implementation-Date: 2019-11-10T12:35:40.214+08:00[Asia/Shanghai]
|
||||||
|
Created-By: org.maxkey
|
||||||
|
Implementation-Vendor: https://github.com/shimingxy/MaxKey
|
||||||
|
|
||||||
Binary file not shown.
@ -0,0 +1,7 @@
|
|||||||
|
Manifest-Version: 1.0
|
||||||
|
Implementation-Title: maxkey-protocol-tokenbased
|
||||||
|
Implementation-Version: 1.0.0.RELEASE
|
||||||
|
Implementation-Date: 2019-11-10T12:35:40.220+08:00[Asia/Shanghai]
|
||||||
|
Created-By: org.maxkey
|
||||||
|
Implementation-Vendor: https://github.com/shimingxy/MaxKey
|
||||||
|
|
||||||
@ -41,7 +41,7 @@ public class TokenBasedAuthorizeEndpoint extends AuthorizeBaseEndpoint{
|
|||||||
@Autowired
|
@Autowired
|
||||||
ApplicationConfig applicationConfig;
|
ApplicationConfig applicationConfig;
|
||||||
|
|
||||||
@RequestMapping("/authorize/tokenbased/{id}")
|
@RequestMapping("/authz/tokenbased/{id}")
|
||||||
public ModelAndView authorize(
|
public ModelAndView authorize(
|
||||||
HttpServletRequest request,
|
HttpServletRequest request,
|
||||||
HttpServletResponse response,
|
HttpServletResponse response,
|
||||||
|
|||||||
@ -13,10 +13,9 @@
|
|||||||
</attributes>
|
</attributes>
|
||||||
</classpathentry>
|
</classpathentry>
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8/"/>
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8/"/>
|
||||||
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer">
|
<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer">
|
||||||
<attributes>
|
<attributes>
|
||||||
<attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
|
<attribute name="org.eclipse.jst.component.nondependency" value=""/>
|
||||||
</attributes>
|
</attributes>
|
||||||
</classpathentry>
|
</classpathentry>
|
||||||
<classpathentry kind="output" path="bin/default"/>
|
<classpathentry kind="output" path="bin/default"/>
|
||||||
|
|||||||
@ -2,25 +2,24 @@
|
|||||||
<project-modules id="moduleCoreId" project-version="1.5.0">
|
<project-modules id="moduleCoreId" project-version="1.5.0">
|
||||||
<wb-module deploy-name="maxkey-web-manage">
|
<wb-module deploy-name="maxkey-web-manage">
|
||||||
<property name="context-root" value="maxkey-mgt"/>
|
<property name="context-root" value="maxkey-mgt"/>
|
||||||
<wb-resource deploy-path="/WEB-INF/classes" source-path="src/main/resources"/>
|
<wb-resource deploy-path="/" source-path="src/main/resources"/>
|
||||||
<wb-resource deploy-path="/WEB-INF/classes" source-path="src/main/java"/>
|
<wb-resource deploy-path="/" source-path="src/main/java"/>
|
||||||
<wb-resource deploy-path="/" source-path="src/main/webapp"/>
|
<dependent-module deploy-path="../" handle="module:/resource/maxkey-core/maxkey-core">
|
||||||
<dependent-module deploy-path="/WEB-INF/lib" handle="module:/resource/maxkey-core/maxkey-core">
|
|
||||||
<dependency-type>uses</dependency-type>
|
<dependency-type>uses</dependency-type>
|
||||||
</dependent-module>
|
</dependent-module>
|
||||||
<dependent-module deploy-path="/WEB-INF/lib" handle="module:/resource/maxkey-jose-jwt/maxkey-jose-jwt">
|
<dependent-module deploy-path="../" handle="module:/resource/maxkey-jose-jwt/maxkey-jose-jwt">
|
||||||
<dependency-type>uses</dependency-type>
|
<dependency-type>uses</dependency-type>
|
||||||
</dependent-module>
|
</dependent-module>
|
||||||
<dependent-module deploy-path="/WEB-INF/lib" handle="module:/resource/maxkey-dao/maxkey-dao">
|
<dependent-module deploy-path="../" handle="module:/resource/maxkey-dao/maxkey-dao">
|
||||||
<dependency-type>uses</dependency-type>
|
<dependency-type>uses</dependency-type>
|
||||||
</dependent-module>
|
</dependent-module>
|
||||||
<dependent-module deploy-path="/WEB-INF/lib" handle="module:/resource/maxkey-client-sdk/maxkey-client-sdk">
|
<dependent-module deploy-path="../" handle="module:/resource/maxkey-client-sdk/maxkey-client-sdk">
|
||||||
<dependency-type>uses</dependency-type>
|
<dependency-type>uses</dependency-type>
|
||||||
</dependent-module>
|
</dependent-module>
|
||||||
<dependent-module deploy-path="/WEB-INF/lib" handle="module:/resource/maxkey-protocol-oauth-2.0/maxkey-protocol-oauth-2.0">
|
<dependent-module deploy-path="../" handle="module:/resource/maxkey-protocol-oauth-2.0/maxkey-protocol-oauth-2.0">
|
||||||
<dependency-type>uses</dependency-type>
|
<dependency-type>uses</dependency-type>
|
||||||
</dependent-module>
|
</dependent-module>
|
||||||
<dependent-module deploy-path="/WEB-INF/lib" handle="module:/resource/maxkey-protocol-saml-2.0/maxkey-protocol-saml-2.0">
|
<dependent-module deploy-path="../" handle="module:/resource/maxkey-protocol-saml-2.0/maxkey-protocol-saml-2.0">
|
||||||
<dependency-type>uses</dependency-type>
|
<dependency-type>uses</dependency-type>
|
||||||
</dependent-module>
|
</dependent-module>
|
||||||
</wb-module>
|
</wb-module>
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<faceted-project>
|
<faceted-project>
|
||||||
<fixed facet="jst.java"/>
|
<fixed facet="jst.java"/>
|
||||||
<fixed facet="jst.web"/>
|
<installed facet="jst.utility" version="1.0"/>
|
||||||
<installed facet="jst.web" version="2.4"/>
|
|
||||||
<installed facet="jst.java" version="1.8"/>
|
<installed facet="jst.java" version="1.8"/>
|
||||||
</faceted-project>
|
</faceted-project>
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
description = "maxkey-web-manage"
|
description = "maxkey-web-manage"
|
||||||
|
|
||||||
apply plugin: 'war'
|
//apply plugin: 'war'
|
||||||
apply plugin: 'eclipse-wtp'
|
apply plugin: 'eclipse-wtp'
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|||||||
@ -3,7 +3,7 @@ description = "maxkey-web-maxkey"
|
|||||||
|
|
||||||
// Apply the java plugin to add support for Java
|
// Apply the java plugin to add support for Java
|
||||||
apply plugin: 'java'
|
apply plugin: 'java'
|
||||||
apply plugin: 'war'
|
//apply plugin: 'war'
|
||||||
apply plugin: 'eclipse-wtp'
|
apply plugin: 'eclipse-wtp'
|
||||||
apply plugin: 'com.bmuschko.tomcat-base'
|
apply plugin: 'com.bmuschko.tomcat-base'
|
||||||
apply plugin: 'com.bmuschko.tomcat'
|
apply plugin: 'com.bmuschko.tomcat'
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
echo off
|
echo off
|
||||||
echo set env
|
echo set env
|
||||||
set JAVA_HOME=D:\javaIDE\jdk1.8.0_31
|
set JAVA_HOME=D:\JavaIDE\jdk1.8.0_91
|
||||||
set GRADLE_HOME=D:\javaIDE\gradle-4.8
|
set GRADLE_HOME=D:\JavaIDE\gradle-5.4.1
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user