mirror of
https://gitee.com/dromara/MaxKey.git
synced 2026-06-13 03:11:11 +08:00
SocialsProvider to database
This commit is contained in:
@@ -21,10 +21,10 @@
|
||||
package org.maxkey.authn.support.socialsignon;
|
||||
|
||||
import org.maxkey.authn.AbstractAuthenticationProvider;
|
||||
import org.maxkey.authn.support.socialsignon.service.SocialSignOnProvider;
|
||||
import org.maxkey.authn.support.socialsignon.service.SocialSignOnProviderService;
|
||||
import org.maxkey.authn.support.socialsignon.service.SocialsAssociateService;
|
||||
import org.maxkey.configuration.ApplicationConfig;
|
||||
import org.maxkey.entity.SocialsProvider;
|
||||
import org.maxkey.web.WebContext;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@@ -59,7 +59,7 @@ public class AbstractSocialSignOnEndpoint {
|
||||
}
|
||||
|
||||
|
||||
protected SocialSignOnProvider socialSignOnProvider;
|
||||
protected SocialsProvider socialSignOnProvider;
|
||||
|
||||
protected AuthRequest authRequest;
|
||||
|
||||
@@ -84,7 +84,7 @@ public class AbstractSocialSignOnEndpoint {
|
||||
|
||||
protected AuthRequest buildAuthRequest(String provider){
|
||||
try {
|
||||
SocialSignOnProvider socialSignOnProvider = socialSignOnProviderService.get(provider);
|
||||
SocialsProvider socialSignOnProvider = socialSignOnProviderService.get(provider);
|
||||
_logger.debug("socialSignOn Provider : "+socialSignOnProvider);
|
||||
|
||||
if(socialSignOnProvider!=null){
|
||||
@@ -100,26 +100,43 @@ public class AbstractSocialSignOnEndpoint {
|
||||
}
|
||||
|
||||
protected String authCallback() throws Exception {
|
||||
AuthCallback authCallback=new AuthCallback();
|
||||
authCallback.setCode(WebContext.getRequest().getParameter("code"));
|
||||
authCallback.setAuth_code(WebContext.getRequest().getParameter("auth_code"));
|
||||
authCallback.setOauth_token(WebContext.getRequest().getParameter("oauthToken"));
|
||||
authCallback.setAuthorization_code(WebContext.getRequest().getParameter("authorization_code"));
|
||||
authCallback.setOauth_verifier(WebContext.getRequest().getParameter("oauthVerifier"));
|
||||
authCallback.setState(WebContext.getRequest().getParameter("state"));
|
||||
_logger.debug("Callback OAuth code {}, auth_code {}, oauthToken {}, authorization_code {}, oauthVerifier {}",
|
||||
authCallback.getCode(),
|
||||
authCallback.getAuth_code(),
|
||||
authCallback.getOauth_token(),
|
||||
authCallback.getAuthorization_code(),
|
||||
authCallback.getOauth_verifier());
|
||||
_logger.debug("Callback state {} ",
|
||||
authCallback.getState()
|
||||
);
|
||||
|
||||
authRequest=(AuthRequest)WebContext.getAttribute(SOCIALSIGNON_OAUTH_SERVICE_SESSION);
|
||||
socialSignOnProvider=(SocialSignOnProvider)WebContext.getAttribute(SOCIALSIGNON_PROVIDER_SESSION);
|
||||
socialSignOnProvider=(SocialsProvider)WebContext.getAttribute(SOCIALSIGNON_PROVIDER_SESSION);
|
||||
//clear session
|
||||
WebContext.removeAttribute(SOCIALSIGNON_OAUTH_SERVICE_SESSION);
|
||||
WebContext.removeAttribute(SOCIALSIGNON_PROVIDER_SESSION);
|
||||
|
||||
AuthCallback authCallback=new AuthCallback();
|
||||
authCallback.setCode(WebContext.getRequest().getParameter("code"));
|
||||
authCallback.setAuth_code(WebContext.getRequest().getParameter("auth_code"));
|
||||
authCallback.setOauth_token(WebContext.getRequest().getParameter("oauthToken"));
|
||||
authCallback.setAuthorization_code(WebContext.getRequest().getParameter("authorization_code"));
|
||||
authCallback.setOauth_verifier(WebContext.getRequest().getParameter("oauthVerifier"));
|
||||
authCallback.setState(WebContext.getRequest().getParameter("state"));
|
||||
|
||||
if(authRequest == null) {//if authRequest is null renew one
|
||||
authRequest=socialSignOnProviderService.getAuthRequest(provider,applicationConfig);
|
||||
if(authCallback.getState() != null) {
|
||||
authRequest.authorize(authCallback.getState());
|
||||
}
|
||||
_logger.debug("session authRequest is null , renew one");
|
||||
}
|
||||
|
||||
AuthResponse<?> authResponse=authRequest.login(authCallback);
|
||||
_logger.debug("Response : "+authResponse);
|
||||
accountId=socialSignOnProviderService.getAccountId(socialSignOnProvider.getProvider(), authResponse);
|
||||
_logger.debug("Response : " + authResponse.getData());
|
||||
accountId=socialSignOnProviderService.getAccountId(provider, authResponse);
|
||||
|
||||
_logger.debug("getAccountId : "+accountId);
|
||||
_logger.debug("getAccountId : " + accountId);
|
||||
return accountId;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -23,9 +23,9 @@ package org.maxkey.authn.support.socialsignon;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.maxkey.authn.LoginCredential;
|
||||
import org.maxkey.authn.support.socialsignon.service.SocialSignOnProvider;
|
||||
import org.maxkey.authn.support.socialsignon.service.SocialsAssociate;
|
||||
import org.maxkey.constants.ConstantsLoginType;
|
||||
import org.maxkey.entity.SocialsProvider;
|
||||
import org.maxkey.web.WebContext;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@@ -38,6 +38,8 @@ import org.springframework.web.bind.annotation.RequestMethod;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
|
||||
import me.zhyd.oauth.request.AuthRequest;
|
||||
|
||||
/**
|
||||
* @author Crystal.Sea
|
||||
*
|
||||
@@ -103,12 +105,18 @@ public class SocialSignOnEndpoint extends AbstractSocialSignOnEndpoint{
|
||||
|
||||
@RequestMapping(value={"/scanqrcode/{provider}"}, method = RequestMethod.GET)
|
||||
@ResponseBody
|
||||
public SocialSignOnProvider scanQRCode(
|
||||
public SocialsProvider scanQRCode(
|
||||
HttpServletRequest request,
|
||||
@PathVariable("provider") String provider) {
|
||||
socialSignOnAuthorize(request,provider);
|
||||
SocialSignOnProvider socialSignOnProvider = socialSignOnProviderService.get(provider);
|
||||
socialSignOnProvider.setState(request.getSession().getId());
|
||||
AuthRequest authRequest =buildAuthRequest(provider);
|
||||
|
||||
if(authRequest == null ) {
|
||||
_logger.error("build authRequest fail .");
|
||||
}
|
||||
String state = request.getSession().getId();
|
||||
authRequest.authorize(state);
|
||||
SocialsProvider socialSignOnProvider = socialSignOnProviderService.get(provider);
|
||||
socialSignOnProvider.setState(state);
|
||||
socialSignOnProvider.setRedirectUri(applicationConfig.getServerPrefix()+
|
||||
"/logon/oauth20/callback/"+provider);
|
||||
return socialSignOnProvider;
|
||||
|
||||
@@ -1,202 +0,0 @@
|
||||
/*
|
||||
* Copyright [2020] [MaxKey of copyright http://www.maxkey.top]
|
||||
*
|
||||
* Licensed 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.
|
||||
*/
|
||||
|
||||
|
||||
package org.maxkey.authn.support.socialsignon.service;
|
||||
|
||||
/**
|
||||
* @author Crystal.Sea
|
||||
*
|
||||
*/
|
||||
public class SocialSignOnProvider {
|
||||
|
||||
private String provider;
|
||||
private String providerName;
|
||||
private String icon;
|
||||
private String clientId;
|
||||
private String clientSecret;
|
||||
private String redirectUri;
|
||||
private String agentId;
|
||||
private String accountId;
|
||||
private String bindTime;
|
||||
private String unBindTime;
|
||||
private String lastLoginTime;
|
||||
private String state;
|
||||
private int sortOrder;
|
||||
private boolean hidden;
|
||||
|
||||
private boolean userBind;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public SocialSignOnProvider() {
|
||||
|
||||
}
|
||||
|
||||
public String getProvider() {
|
||||
return provider;
|
||||
}
|
||||
|
||||
public void setProvider(String provider) {
|
||||
this.provider = provider;
|
||||
}
|
||||
|
||||
public String getProviderName() {
|
||||
return providerName;
|
||||
}
|
||||
|
||||
public void setProviderName(String providerName) {
|
||||
this.providerName = providerName;
|
||||
}
|
||||
|
||||
public String getIcon() {
|
||||
return icon;
|
||||
}
|
||||
|
||||
public void setIcon(String icon) {
|
||||
this.icon = icon;
|
||||
}
|
||||
|
||||
public String getClientId() {
|
||||
return clientId;
|
||||
}
|
||||
|
||||
public void setClientId(String clientId) {
|
||||
this.clientId = clientId;
|
||||
}
|
||||
|
||||
public String getClientSecret() {
|
||||
return clientSecret;
|
||||
}
|
||||
|
||||
public void setClientSecret(String clientSecret) {
|
||||
this.clientSecret = clientSecret;
|
||||
}
|
||||
|
||||
public String getAccountId() {
|
||||
return accountId;
|
||||
}
|
||||
|
||||
public void setAccountId(String accountId) {
|
||||
this.accountId = accountId;
|
||||
}
|
||||
|
||||
public int getSortOrder() {
|
||||
return sortOrder;
|
||||
}
|
||||
|
||||
public void setSortOrder(int sortOrder) {
|
||||
this.sortOrder = sortOrder;
|
||||
}
|
||||
|
||||
public boolean isUserBind() {
|
||||
return userBind;
|
||||
}
|
||||
|
||||
public void setUserBind(boolean userBind) {
|
||||
this.userBind = userBind;
|
||||
}
|
||||
|
||||
|
||||
public String getBindTime() {
|
||||
return bindTime;
|
||||
}
|
||||
|
||||
public void setBindTime(String bindTime) {
|
||||
this.bindTime = bindTime;
|
||||
}
|
||||
|
||||
public String getUnBindTime() {
|
||||
return unBindTime;
|
||||
}
|
||||
|
||||
public void setUnBindTime(String unBindTime) {
|
||||
this.unBindTime = unBindTime;
|
||||
}
|
||||
|
||||
public String getLastLoginTime() {
|
||||
return lastLoginTime;
|
||||
}
|
||||
|
||||
public void setLastLoginTime(String lastLoginTime) {
|
||||
this.lastLoginTime = lastLoginTime;
|
||||
}
|
||||
|
||||
public String getRedirectUri() {
|
||||
return redirectUri;
|
||||
}
|
||||
|
||||
public void setRedirectUri(String redirectUri) {
|
||||
this.redirectUri = redirectUri;
|
||||
}
|
||||
|
||||
public String getAgentId() {
|
||||
return agentId;
|
||||
}
|
||||
|
||||
public void setAgentId(String agentId) {
|
||||
this.agentId = agentId;
|
||||
}
|
||||
|
||||
public String getState() {
|
||||
return state;
|
||||
}
|
||||
|
||||
public void setState(String state) {
|
||||
this.state = state;
|
||||
}
|
||||
|
||||
public boolean isHidden() {
|
||||
return hidden;
|
||||
}
|
||||
|
||||
public void setHidden(boolean hidden) {
|
||||
this.hidden = hidden;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.append("SocialSignOnProvider [provider=");
|
||||
builder.append(provider);
|
||||
builder.append(", providerName=");
|
||||
builder.append(providerName);
|
||||
builder.append(", clientId=");
|
||||
builder.append(clientId);
|
||||
builder.append(", clientSecret=");
|
||||
builder.append(clientSecret);
|
||||
builder.append(", agentId=");
|
||||
builder.append(agentId);
|
||||
builder.append(", accountId=");
|
||||
builder.append(accountId);
|
||||
builder.append(", bindTime=");
|
||||
builder.append(bindTime);
|
||||
builder.append(", unBindTime=");
|
||||
builder.append(unBindTime);
|
||||
builder.append(", lastLoginTime=");
|
||||
builder.append(lastLoginTime);
|
||||
builder.append(", sortOrder=");
|
||||
builder.append(sortOrder);
|
||||
builder.append(", userBind=");
|
||||
builder.append(userBind);
|
||||
builder.append("]");
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -17,30 +17,42 @@
|
||||
|
||||
package org.maxkey.authn.support.socialsignon.service;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
import org.maxkey.configuration.ApplicationConfig;
|
||||
import org.maxkey.entity.SocialsProvider;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
import org.springframework.jdbc.core.RowMapper;
|
||||
|
||||
import me.zhyd.oauth.config.AuthConfig;
|
||||
import me.zhyd.oauth.model.AuthResponse;
|
||||
import me.zhyd.oauth.model.AuthUser;
|
||||
import me.zhyd.oauth.request.*;
|
||||
|
||||
|
||||
|
||||
public class SocialSignOnProviderService{
|
||||
private static Logger _logger = LoggerFactory.getLogger(SocialSignOnProviderService.class);
|
||||
|
||||
List<SocialSignOnProvider> socialSignOnProviders = new ArrayList<SocialSignOnProvider>();
|
||||
private static final String DEFAULT_SELECT_STATEMENT = "select * from mxk_socials_provider where status = 1 order by sortindex";
|
||||
|
||||
|
||||
List<SocialsProvider> socialSignOnProviders = new ArrayList<SocialsProvider>();
|
||||
|
||||
HashMap<String ,SocialSignOnProvider>socialSignOnProviderMaps=new HashMap<String ,SocialSignOnProvider>();
|
||||
HashMap<String ,SocialsProvider>socialSignOnProviderMaps=new HashMap<String ,SocialsProvider>();
|
||||
|
||||
private final JdbcTemplate jdbcTemplate;
|
||||
|
||||
public SocialSignOnProvider get(String provider){
|
||||
public SocialSignOnProviderService(JdbcTemplate jdbcTemplate) {
|
||||
this.jdbcTemplate=jdbcTemplate;
|
||||
}
|
||||
|
||||
|
||||
public SocialsProvider get(String provider){
|
||||
return socialSignOnProviderMaps.get(provider);
|
||||
}
|
||||
|
||||
@@ -109,44 +121,85 @@ public class SocialSignOnProviderService{
|
||||
}
|
||||
|
||||
public String getAccountId(String provider,AuthResponse<?> authResponse) throws Exception {
|
||||
if(provider.equalsIgnoreCase("WeChatOpen")) {
|
||||
return ((AuthUser)authResponse.getData()).getUuid();
|
||||
}else if(provider.equalsIgnoreCase("sinaweibo")) {
|
||||
return ((AuthUser)authResponse.getData()).getUuid();
|
||||
}else if(provider.equalsIgnoreCase("qq")) {
|
||||
return ((AuthUser)authResponse.getData()).getUuid();
|
||||
}else if(provider.equalsIgnoreCase("Alipay")) {
|
||||
return ((AuthUser)authResponse.getData()).getUuid();
|
||||
}else if(provider.equalsIgnoreCase("Twitter")) {
|
||||
return ((AuthUser)authResponse.getData()).getUuid();
|
||||
}else if(provider.equalsIgnoreCase("google")) {
|
||||
return ((AuthUser)authResponse.getData()).getUuid();
|
||||
}else if(provider.equalsIgnoreCase("microsoft")) {
|
||||
return ((AuthUser)authResponse.getData()).getUuid();
|
||||
}else if(provider.equalsIgnoreCase("Linkedin")) {
|
||||
return ((AuthUser)authResponse.getData()).getUuid();
|
||||
}else if(provider.equalsIgnoreCase("DingTalk")) {
|
||||
return ((AuthUser)authResponse.getData()).getUuid();
|
||||
}else {
|
||||
return ((AuthUser)authResponse.getData()).getUuid();
|
||||
}
|
||||
if(authResponse.getData() != null) {
|
||||
AuthUser authUser = (AuthUser)authResponse.getData();
|
||||
_logger.debug("AuthUser[{},{},{},{},{},{},{},{},{},{},{},{}]",
|
||||
authUser.getUuid(),
|
||||
authUser.getUsername(),
|
||||
authUser.getNickname(),
|
||||
authUser.getGender(),
|
||||
authUser.getEmail(),
|
||||
authUser.getCompany(),
|
||||
authUser.getBlog(),
|
||||
authUser.getLocation(),
|
||||
authUser.getRemark(),
|
||||
authUser.getSource(),
|
||||
authUser.getBlog(),
|
||||
authUser.getAvatar());
|
||||
_logger.debug("RawUserInfo {}",authUser.getRawUserInfo());
|
||||
if(provider.equalsIgnoreCase("WeChatOpen")) {
|
||||
return authUser.getUuid();
|
||||
}else if(provider.equalsIgnoreCase("sinaweibo")) {
|
||||
return authUser.getUuid();
|
||||
}else if(provider.equalsIgnoreCase("qq")) {
|
||||
return authUser.getUuid();
|
||||
}else if(provider.equalsIgnoreCase("Alipay")) {
|
||||
return authUser.getUuid();
|
||||
}else if(provider.equalsIgnoreCase("Twitter")) {
|
||||
return authUser.getUuid();
|
||||
}else if(provider.equalsIgnoreCase("google")) {
|
||||
return authUser.getUuid();
|
||||
}else if(provider.equalsIgnoreCase("microsoft")) {
|
||||
return authUser.getUuid();
|
||||
}else if(provider.equalsIgnoreCase("Linkedin")) {
|
||||
return authUser.getUuid();
|
||||
}else if(provider.equalsIgnoreCase("DingTalk")) {
|
||||
return authUser.getUuid();
|
||||
}else {
|
||||
return authUser.getUuid();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public List<SocialSignOnProvider> getSocialSignOnProviders() {
|
||||
public List<SocialsProvider> getSocialSignOnProviders() {
|
||||
return socialSignOnProviders;
|
||||
}
|
||||
|
||||
public void setSocialSignOnProviders(
|
||||
List<SocialSignOnProvider> socialSignOnProviders) {
|
||||
|
||||
for(SocialSignOnProvider socialSignOnProvider : socialSignOnProviders){
|
||||
socialSignOnProviderMaps.put(socialSignOnProvider.getProvider(), socialSignOnProvider);
|
||||
|
||||
if(!socialSignOnProvider.isHidden()) {
|
||||
this.socialSignOnProviders.add(socialSignOnProvider);
|
||||
}
|
||||
}
|
||||
|
||||
_logger.debug("social SignOn Providers {}" , this.socialSignOnProviders);
|
||||
|
||||
public void loadSocialsProviders() {
|
||||
List<SocialsProvider> listSocialsProvider=jdbcTemplate.query(
|
||||
DEFAULT_SELECT_STATEMENT,
|
||||
new SocialsProviderRowMapper());
|
||||
_logger.trace("query SocialsProvider " + listSocialsProvider);
|
||||
|
||||
for(SocialsProvider socialsProvider : listSocialsProvider){
|
||||
socialSignOnProviderMaps.put(socialsProvider.getProvider(), socialsProvider);
|
||||
_logger.debug("Social Provider " + socialsProvider.getProvider()
|
||||
+ "(" + socialsProvider.getProviderName()+")");
|
||||
if(!socialsProvider.getHidden().equals("true")) {
|
||||
this.socialSignOnProviders.add(socialsProvider);
|
||||
}
|
||||
}
|
||||
|
||||
_logger.debug("social SignOn Providers {}" , this.socialSignOnProviders);
|
||||
}
|
||||
|
||||
|
||||
private final class SocialsProviderRowMapper implements RowMapper<SocialsProvider> {
|
||||
@Override
|
||||
public SocialsProvider mapRow(ResultSet rs, int rowNum)
|
||||
throws SQLException {
|
||||
SocialsProvider socialsProvider=new SocialsProvider();
|
||||
socialsProvider.setId(rs.getString("id"));
|
||||
socialsProvider.setProvider(rs.getString("provider"));
|
||||
socialsProvider.setProviderName(rs.getString("providername"));
|
||||
socialsProvider.setIcon(rs.getString("icon"));
|
||||
socialsProvider.setClientId(rs.getString("clientid"));
|
||||
socialsProvider.setClientSecret(rs.getString("clientsecret"));
|
||||
socialsProvider.setAgentId(rs.getString("agentId"));
|
||||
socialsProvider.setHidden(rs.getString("hidden"));
|
||||
socialsProvider.setSortIndex(rs.getInt("sortindex"));
|
||||
socialsProvider.setStatus(rs.getInt("status"));
|
||||
return socialsProvider;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,11 +18,9 @@
|
||||
package org.maxkey.autoconfigure;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import org.maxkey.authn.support.socialsignon.service.JdbcSocialsAssociateService;
|
||||
import org.maxkey.authn.support.socialsignon.service.SocialSignOnProvider;
|
||||
import org.maxkey.authn.support.socialsignon.service.SocialSignOnProviderService;
|
||||
import org.maxkey.entity.SocialsProvider;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
@@ -30,7 +28,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.ComponentScan;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.env.StandardEnvironment;
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
|
||||
@Configuration
|
||||
@@ -41,45 +38,12 @@ public class SocialSignOnAutoConfiguration implements InitializingBean {
|
||||
private static final Logger _logger = LoggerFactory.getLogger(SocialSignOnAutoConfiguration.class);
|
||||
|
||||
@Bean(name = "socialSignOnProviderService")
|
||||
@ConditionalOnClass(SocialSignOnProvider.class)
|
||||
@ConditionalOnClass(SocialsProvider.class)
|
||||
public SocialSignOnProviderService socialSignOnProviderService(
|
||||
StandardEnvironment environment) throws IOException {
|
||||
SocialSignOnProviderService socialSignOnProviderService = new SocialSignOnProviderService();
|
||||
|
||||
List<SocialSignOnProvider> socialSignOnProviderList = new ArrayList<SocialSignOnProvider>();
|
||||
|
||||
String [] providerList =environment.getProperty("maxkey.login.socialsignon.providers").toString().split(",");
|
||||
|
||||
for(String provider : providerList) {
|
||||
String providerName = environment.getProperty("maxkey.socialsignon."+provider+".provider.name");
|
||||
String icon=environment.getProperty("maxkey.socialsignon."+provider+".icon");
|
||||
String clientId=environment.getProperty("maxkey.socialsignon."+provider+".client.id");
|
||||
String clientSecret=environment.getProperty("maxkey.socialsignon."+provider+".client.secret");
|
||||
String sortOrder = environment.getProperty("maxkey.socialsignon."+provider+".sortorder");
|
||||
String agentId = environment.getProperty("maxkey.socialsignon."+provider+".agent.id");
|
||||
String hidden = environment.getProperty("maxkey.socialsignon."+provider+".hidden");
|
||||
|
||||
SocialSignOnProvider socialSignOnProvider = new SocialSignOnProvider();
|
||||
socialSignOnProvider.setProvider(provider);
|
||||
socialSignOnProvider.setProviderName(providerName);
|
||||
socialSignOnProvider.setIcon(icon);
|
||||
socialSignOnProvider.setClientId(clientId);
|
||||
socialSignOnProvider.setClientSecret(clientSecret);
|
||||
socialSignOnProvider.setSortOrder(Integer.valueOf(sortOrder));
|
||||
socialSignOnProvider.setAgentId(agentId);
|
||||
|
||||
if(hidden == null || hidden.equalsIgnoreCase("false")) {
|
||||
socialSignOnProvider.setHidden(false);
|
||||
}else if(hidden.equalsIgnoreCase("true")){
|
||||
socialSignOnProvider.setHidden(true);
|
||||
}
|
||||
|
||||
_logger.debug("socialSignOnProvider " + socialSignOnProvider.getProvider()
|
||||
+ "(" + socialSignOnProvider.getProviderName()+")");
|
||||
_logger.trace("socialSignOnProvider " + socialSignOnProvider);
|
||||
socialSignOnProviderList.add(socialSignOnProvider);
|
||||
}
|
||||
socialSignOnProviderService.setSocialSignOnProviders(socialSignOnProviderList);
|
||||
JdbcTemplate jdbcTemplate) throws IOException {
|
||||
SocialSignOnProviderService socialSignOnProviderService = new SocialSignOnProviderService(jdbcTemplate);
|
||||
//load Socials Providers from database
|
||||
socialSignOnProviderService.loadSocialsProviders();
|
||||
_logger.debug("SocialSignOnProviderService inited.");
|
||||
return socialSignOnProviderService;
|
||||
}
|
||||
|
||||
313
maxkey-core/src/main/java/org/maxkey/entity/SocialsProvider.java
Normal file
313
maxkey-core/src/main/java/org/maxkey/entity/SocialsProvider.java
Normal file
@@ -0,0 +1,313 @@
|
||||
/*
|
||||
* Copyright [2021] [MaxKey of copyright http://www.maxkey.top]
|
||||
*
|
||||
* Licensed 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.
|
||||
*/
|
||||
|
||||
|
||||
package org.maxkey.entity;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.GenerationType;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.Table;
|
||||
|
||||
import org.apache.mybatis.jpa.persistence.JpaBaseEntity;
|
||||
|
||||
/**
|
||||
* @author Crystal.Sea
|
||||
*
|
||||
*/
|
||||
@Entity
|
||||
@Table(name = "MXK_SOCIALS_PROVIDER")
|
||||
public class SocialsProvider extends JpaBaseEntity implements Serializable {
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 1636727203025187769L;
|
||||
@Id
|
||||
@Column
|
||||
@GeneratedValue(strategy = GenerationType.AUTO,generator = "snowflakeid")
|
||||
private String id;
|
||||
@Column
|
||||
private String provider;
|
||||
@Column
|
||||
private String providerName;
|
||||
@Column
|
||||
private String icon;
|
||||
@Column
|
||||
private String clientId;
|
||||
@Column
|
||||
private String clientSecret;
|
||||
@Column
|
||||
private String agentId;
|
||||
@Column
|
||||
private String hidden;
|
||||
@Column
|
||||
private long sortIndex;
|
||||
@Column
|
||||
private int status;
|
||||
@Column
|
||||
String createdBy;
|
||||
@Column
|
||||
String createdDate;
|
||||
@Column
|
||||
String modifiedBy;
|
||||
@Column
|
||||
String modifiedDate;
|
||||
|
||||
private String redirectUri;
|
||||
|
||||
private String accountId;
|
||||
private String bindTime;
|
||||
private String unBindTime;
|
||||
private String lastLoginTime;
|
||||
private String state;
|
||||
|
||||
|
||||
private boolean userBind;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public SocialsProvider() {
|
||||
|
||||
}
|
||||
|
||||
public String getProvider() {
|
||||
return provider;
|
||||
}
|
||||
|
||||
public void setProvider(String provider) {
|
||||
this.provider = provider;
|
||||
}
|
||||
|
||||
public String getProviderName() {
|
||||
return providerName;
|
||||
}
|
||||
|
||||
public void setProviderName(String providerName) {
|
||||
this.providerName = providerName;
|
||||
}
|
||||
|
||||
public String getIcon() {
|
||||
return icon;
|
||||
}
|
||||
|
||||
public void setIcon(String icon) {
|
||||
this.icon = icon;
|
||||
}
|
||||
|
||||
public String getClientId() {
|
||||
return clientId;
|
||||
}
|
||||
|
||||
public void setClientId(String clientId) {
|
||||
this.clientId = clientId;
|
||||
}
|
||||
|
||||
public String getClientSecret() {
|
||||
return clientSecret;
|
||||
}
|
||||
|
||||
public void setClientSecret(String clientSecret) {
|
||||
this.clientSecret = clientSecret;
|
||||
}
|
||||
|
||||
public String getAccountId() {
|
||||
return accountId;
|
||||
}
|
||||
|
||||
public void setAccountId(String accountId) {
|
||||
this.accountId = accountId;
|
||||
}
|
||||
|
||||
public boolean isUserBind() {
|
||||
return userBind;
|
||||
}
|
||||
|
||||
public void setUserBind(boolean userBind) {
|
||||
this.userBind = userBind;
|
||||
}
|
||||
|
||||
|
||||
public String getBindTime() {
|
||||
return bindTime;
|
||||
}
|
||||
|
||||
public void setBindTime(String bindTime) {
|
||||
this.bindTime = bindTime;
|
||||
}
|
||||
|
||||
public String getUnBindTime() {
|
||||
return unBindTime;
|
||||
}
|
||||
|
||||
public void setUnBindTime(String unBindTime) {
|
||||
this.unBindTime = unBindTime;
|
||||
}
|
||||
|
||||
public String getLastLoginTime() {
|
||||
return lastLoginTime;
|
||||
}
|
||||
|
||||
public void setLastLoginTime(String lastLoginTime) {
|
||||
this.lastLoginTime = lastLoginTime;
|
||||
}
|
||||
|
||||
public String getRedirectUri() {
|
||||
return redirectUri;
|
||||
}
|
||||
|
||||
public void setRedirectUri(String redirectUri) {
|
||||
this.redirectUri = redirectUri;
|
||||
}
|
||||
|
||||
public String getAgentId() {
|
||||
return agentId;
|
||||
}
|
||||
|
||||
public void setAgentId(String agentId) {
|
||||
this.agentId = agentId;
|
||||
}
|
||||
|
||||
public String getState() {
|
||||
return state;
|
||||
}
|
||||
|
||||
public void setState(String state) {
|
||||
this.state = state;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getHidden() {
|
||||
return hidden;
|
||||
}
|
||||
|
||||
public void setHidden(String hidden) {
|
||||
this.hidden = hidden;
|
||||
}
|
||||
|
||||
public int getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(int status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public String getCreatedBy() {
|
||||
return createdBy;
|
||||
}
|
||||
|
||||
public void setCreatedBy(String createdBy) {
|
||||
this.createdBy = createdBy;
|
||||
}
|
||||
|
||||
public String getCreatedDate() {
|
||||
return createdDate;
|
||||
}
|
||||
|
||||
public void setCreatedDate(String createdDate) {
|
||||
this.createdDate = createdDate;
|
||||
}
|
||||
|
||||
public String getModifiedBy() {
|
||||
return modifiedBy;
|
||||
}
|
||||
|
||||
public void setModifiedBy(String modifiedBy) {
|
||||
this.modifiedBy = modifiedBy;
|
||||
}
|
||||
|
||||
public String getModifiedDate() {
|
||||
return modifiedDate;
|
||||
}
|
||||
|
||||
public void setModifiedDate(String modifiedDate) {
|
||||
this.modifiedDate = modifiedDate;
|
||||
}
|
||||
|
||||
public long getSortIndex() {
|
||||
return sortIndex;
|
||||
}
|
||||
|
||||
public void setSortIndex(long sortIndex) {
|
||||
this.sortIndex = sortIndex;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.append("SocialsProvider [id=");
|
||||
builder.append(id);
|
||||
builder.append(", provider=");
|
||||
builder.append(provider);
|
||||
builder.append(", providerName=");
|
||||
builder.append(providerName);
|
||||
builder.append(", icon=");
|
||||
builder.append(icon);
|
||||
builder.append(", clientId=");
|
||||
builder.append(clientId);
|
||||
builder.append(", clientSecret=");
|
||||
builder.append(clientSecret);
|
||||
builder.append(", agentId=");
|
||||
builder.append(agentId);
|
||||
builder.append(", sortOrder=");
|
||||
builder.append(sortOrder);
|
||||
builder.append(", hidden=");
|
||||
builder.append(hidden);
|
||||
builder.append(", status=");
|
||||
builder.append(status);
|
||||
builder.append(", createdBy=");
|
||||
builder.append(createdBy);
|
||||
builder.append(", createdDate=");
|
||||
builder.append(createdDate);
|
||||
builder.append(", modifiedBy=");
|
||||
builder.append(modifiedBy);
|
||||
builder.append(", modifiedDate=");
|
||||
builder.append(modifiedDate);
|
||||
builder.append(", redirectUri=");
|
||||
builder.append(redirectUri);
|
||||
builder.append(", accountId=");
|
||||
builder.append(accountId);
|
||||
builder.append(", bindTime=");
|
||||
builder.append(bindTime);
|
||||
builder.append(", unBindTime=");
|
||||
builder.append(unBindTime);
|
||||
builder.append(", lastLoginTime=");
|
||||
builder.append(lastLoginTime);
|
||||
builder.append(", state=");
|
||||
builder.append(state);
|
||||
builder.append(", userBind=");
|
||||
builder.append(userBind);
|
||||
builder.append("]");
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright [2021] [MaxKey of copyright http://www.maxkey.top]
|
||||
*
|
||||
* Licensed 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.
|
||||
*/
|
||||
|
||||
|
||||
package org.maxkey.persistence.mapper;
|
||||
|
||||
import org.apache.mybatis.jpa.persistence.IJpaBaseMapper;
|
||||
import org.maxkey.entity.SocialsProvider;
|
||||
|
||||
|
||||
/**
|
||||
* @author Crystal.Sea
|
||||
*
|
||||
*/
|
||||
public interface SocialsProviderMapper extends IJpaBaseMapper<SocialsProvider>{
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright [2021] [MaxKey of copyright http://www.maxkey.top]
|
||||
*
|
||||
* Licensed 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.
|
||||
*/
|
||||
|
||||
|
||||
package org.maxkey.persistence.service;
|
||||
|
||||
import org.apache.mybatis.jpa.persistence.JpaBaseService;
|
||||
import org.maxkey.entity.SocialsProvider;
|
||||
import org.maxkey.persistence.mapper.SocialsProviderMapper;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@Repository
|
||||
public class SocialsProviderService extends JpaBaseService<SocialsProvider>{
|
||||
final static Logger _logger = LoggerFactory.getLogger(SocialsProviderService.class);
|
||||
|
||||
|
||||
public SocialsProviderService() {
|
||||
super(SocialsProviderMapper.class);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see com.connsec.db.service.BaseService#getMapper()
|
||||
*/
|
||||
@Override
|
||||
public SocialsProviderMapper getMapper() {
|
||||
return (SocialsProviderMapper)super.getMapper();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="org.maxkey.persistence.mapper.SocialsProviderMapper">
|
||||
|
||||
<sql id="where_statement">
|
||||
<if test="id != null and id != ''">
|
||||
and id = #{id}
|
||||
</if>
|
||||
<if test="providerName != null and providerName != ''">
|
||||
and providerName like '%${providerName}%'
|
||||
</if>
|
||||
</sql>
|
||||
|
||||
|
||||
|
||||
<select id="queryPageResults" parameterType="SocialsProvider" resultType="SocialsProvider">
|
||||
select
|
||||
*
|
||||
from
|
||||
mxk_socials_provider
|
||||
where
|
||||
(1=1)
|
||||
<include refid="where_statement"/>
|
||||
order by sortindex
|
||||
</select>
|
||||
|
||||
|
||||
</mapper>
|
||||
@@ -41,7 +41,7 @@ import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
|
||||
public class ExtractPostBindingAdapter implements ExtractBindingAdapter, InitializingBean{
|
||||
private final static Logger logger = LoggerFactory.getLogger(ExtractPostBindingAdapter.class);
|
||||
private final static Logger _logger = LoggerFactory.getLogger(ExtractPostBindingAdapter.class);
|
||||
|
||||
static final String SAML_REQUEST_POST_PARAM_NAME = "SAMLRequest";
|
||||
static final String SAML_RESPONSE_POST_PARAM_NAME = "SAMLResponse";
|
||||
@@ -98,7 +98,7 @@ public class ExtractPostBindingAdapter implements ExtractBindingAdapter, Initial
|
||||
messageContext.setSecurityPolicyResolver(securityPolicyResolver);
|
||||
|
||||
decoder.decode(messageContext);
|
||||
logger.debug("decode successed ");
|
||||
_logger.debug("decode successed ");
|
||||
return messageContext;
|
||||
|
||||
}
|
||||
@@ -116,7 +116,9 @@ public class ExtractPostBindingAdapter implements ExtractBindingAdapter, Initial
|
||||
|
||||
|
||||
public void buildSecurityPolicyResolver(KeyStore trustKeyStore) {
|
||||
|
||||
_logger.debug("EntityName {}, KeystorePassword {}",
|
||||
keyStoreLoader.getEntityName(),keyStoreLoader.getKeystorePassword());
|
||||
|
||||
TrustResolver trustResolver = new TrustResolver(trustKeyStore,
|
||||
keyStoreLoader.getEntityName(),
|
||||
keyStoreLoader.getKeystorePassword(),
|
||||
|
||||
@@ -115,7 +115,10 @@ public class AssertionGenerator {
|
||||
assertion.setConditions(conditions);
|
||||
//sign Assertion
|
||||
try{
|
||||
|
||||
if(bindingAdapter.getSigningCredential() == null) {
|
||||
throw new Exception("Signing Credential is null..." );
|
||||
}
|
||||
logger.debug("EntityId " + bindingAdapter.getSigningCredential().getEntityId());
|
||||
BasicCredential basicCredential = new BasicCredential();
|
||||
basicCredential.setPrivateKey(bindingAdapter.getSigningCredential().getPrivateKey());
|
||||
|
||||
|
||||
@@ -20,11 +20,11 @@ package org.maxkey.web.contorller;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.maxkey.authn.support.socialsignon.service.SocialSignOnProvider;
|
||||
import org.maxkey.authn.support.socialsignon.service.SocialSignOnProviderService;
|
||||
import org.maxkey.authn.support.socialsignon.service.SocialsAssociate;
|
||||
import org.maxkey.authn.support.socialsignon.service.SocialsAssociateService;
|
||||
import org.maxkey.configuration.ApplicationConfig;
|
||||
import org.maxkey.entity.SocialsProvider;
|
||||
import org.maxkey.web.WebContext;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@@ -55,16 +55,16 @@ public class SocialSignOnListController {
|
||||
|
||||
ModelAndView modelAndView=new ModelAndView("social/socialSignOnProvider");
|
||||
if(applicationConfig.getLoginConfig().isSocialSignOn()){
|
||||
List<SocialSignOnProvider> listSocialSignOnProvider= socialSignOnProviderService.getSocialSignOnProviders();
|
||||
List<SocialsProvider> listSocialSignOnProvider= socialSignOnProviderService.getSocialSignOnProviders();
|
||||
|
||||
SocialsAssociate socialSignOnUser=new SocialsAssociate();
|
||||
socialSignOnUser.setUserId(WebContext.getUserInfo().getId());
|
||||
List<SocialsAssociate> listSocialSignOnUserToken= socialSignOnUserService.query(socialSignOnUser);
|
||||
List<SocialSignOnProvider> listBindSocialSignOnProvider=new ArrayList<SocialSignOnProvider>();
|
||||
List<SocialsProvider> listBindSocialSignOnProvider=new ArrayList<SocialsProvider>();
|
||||
_logger.debug("list SocialSignOnProvider : "+listSocialSignOnProvider);
|
||||
_logger.debug("list SocialSignOnUserToken : "+listSocialSignOnUserToken);
|
||||
for (SocialSignOnProvider ssop : listSocialSignOnProvider){
|
||||
SocialSignOnProvider socialSignOnProvider=new SocialSignOnProvider();
|
||||
for (SocialsProvider ssop : listSocialSignOnProvider){
|
||||
SocialsProvider socialSignOnProvider=new SocialsProvider();
|
||||
socialSignOnProvider.setProvider(ssop.getProvider());
|
||||
socialSignOnProvider.setProviderName(ssop.getProviderName());
|
||||
socialSignOnProvider.setIcon(ssop.getIcon());
|
||||
|
||||
@@ -58,8 +58,6 @@ maxkey.login.mfa =${LOGIN_MFA_ENABLED:true}
|
||||
maxkey.login.mfa.type =${LOGIN_MFA_TYPE:TimeBasedOtpAuthn}
|
||||
#enable social sign on
|
||||
maxkey.login.socialsignon =${LOGIN_SOCIAL_ENABLED:true}
|
||||
#social sign on providers
|
||||
maxkey.login.socialsignon.providers =${LOGIN_SOCIAL_PROVIDERS:gitee,wechatopen,sinaweibo,google,qq,dingtalk,microsoft,facebook,workweixin}
|
||||
#Enable kerberos/SPNEGO
|
||||
maxkey.login.kerberos =false
|
||||
#wsFederation
|
||||
@@ -312,93 +310,6 @@ maxkey.saml.v20.metadata.surName =maxkey
|
||||
maxkey.saml.v20.metadata.emailAddress =maxkeysupport@163.com
|
||||
maxkey.saml.v20.metadata.telephoneNumber =4008981111
|
||||
|
||||
############################################################################
|
||||
# Social Sign On Configuration #
|
||||
#you config client.id & client.secret only #
|
||||
############################################################################
|
||||
#gitee
|
||||
maxkey.socialsignon.gitee.provider =gitee
|
||||
maxkey.socialsignon.gitee.provider.name =Gitee
|
||||
maxkey.socialsignon.gitee.icon =images/social/gitee.png
|
||||
maxkey.socialsignon.gitee.client.id =${SOCIAL_GITEE_CLIENTID:ee6fdc484b3398d17e77d6ff37fd8b9fe502106398c7b22bf5522d3c01303f45}
|
||||
maxkey.socialsignon.gitee.client.secret =${SOCIAL_GITEE_CLIENTSECRET:d6c3558f295f044df538c966a9084166f9a877c7a7392543184007a5faccdbad}
|
||||
maxkey.socialsignon.gitee.account.id =id
|
||||
maxkey.socialsignon.gitee.hidden =false
|
||||
maxkey.socialsignon.gitee.sortorder =1
|
||||
#wechat
|
||||
maxkey.socialsignon.wechatopen.provider =wechatopen
|
||||
maxkey.socialsignon.wechatopen.provider.name =\u5fae\u4fe1
|
||||
maxkey.socialsignon.wechatopen.icon =images/social/wechat.png
|
||||
maxkey.socialsignon.wechatopen.client.id =${SOCIAL_WECHATOPEN_CLIENTID:ee6fdc484b3398d17e7}
|
||||
maxkey.socialsignon.wechatopen.client.secret =${SOCIAL_WECHATOPEN_CLIENTSECRET:7a5faccdbad}
|
||||
maxkey.socialsignon.wechatopen.account.id =id
|
||||
maxkey.socialsignon.wechatopen.hidden =false
|
||||
maxkey.socialsignon.wechatopen.sortorder =2
|
||||
#work weixin
|
||||
maxkey.socialsignon.workweixin.provider =workweixin
|
||||
maxkey.socialsignon.workweixin.provider.name =\u4F01\u4E1A\u5fae\u4fe1
|
||||
maxkey.socialsignon.workweixin.icon =images/social/wechat_enterprise.png
|
||||
maxkey.socialsignon.workweixin.client.id =${SOCIAL_WORKWEIXIN_CLIENTID:ww61ca142e1fe5b8ca}
|
||||
maxkey.socialsignon.workweixin.client.secret =${SOCIAL_WORKWEIXIN_CLIENTSECRET:CfWEoALuKdSKzXiV-QWXeGSD5zPd6Svze3GR_gB5eFs}
|
||||
maxkey.socialsignon.workweixin.agent.id =${SOCIAL_WORKWEIXIN_AGENTID:1000002}
|
||||
maxkey.socialsignon.workweixin.account.id =id
|
||||
maxkey.socialsignon.workweixin.hidden =true
|
||||
maxkey.socialsignon.workweixin.sortorder =2
|
||||
#sina weibo
|
||||
maxkey.socialsignon.sinaweibo.provider =sinaweibo
|
||||
maxkey.socialsignon.sinaweibo.provider.name =\u65b0\u6d6a\u5fae\u535a
|
||||
maxkey.socialsignon.sinaweibo.icon =images/social/weibo.png
|
||||
maxkey.socialsignon.sinaweibo.client.id =${SOCIAL_SINAWEIBO_CLIENTID:3379757634}
|
||||
maxkey.socialsignon.sinaweibo.client.secret =${SOCIAL_SINAWEIBO_CLIENTSECRET:1adfdf9800299037bcab9d1c238664ba}
|
||||
maxkey.socialsignon.sinaweibo.account.id =id
|
||||
maxkey.socialsignon.sinaweibo.hidden =false
|
||||
maxkey.socialsignon.sinaweibo.sortorder =3
|
||||
#Google
|
||||
maxkey.socialsignon.google.provider =google
|
||||
maxkey.socialsignon.google.provider.name =Google
|
||||
maxkey.socialsignon.google.icon =images/social/google.png
|
||||
maxkey.socialsignon.google.client.id =${SOCIAL_GOOGLE_CLIENTID:519914515488.apps.googleusercontent.com}
|
||||
maxkey.socialsignon.google.client.secret =${SOCIAL_GOOGLE_CLIENTSECRET:3aTW3Iw7e11QqMnHxciCaXTt}
|
||||
maxkey.socialsignon.google.account.id =id
|
||||
maxkey.socialsignon.google.hidden =false
|
||||
maxkey.socialsignon.google.sortorder =4
|
||||
#dingtalk
|
||||
maxkey.socialsignon.dingtalk.provider =dingtalk
|
||||
maxkey.socialsignon.dingtalk.provider.name =dingtalk
|
||||
maxkey.socialsignon.dingtalk.icon =images/social/dingtalk.png
|
||||
maxkey.socialsignon.dingtalk.client.id =${SOCIAL_DINGTALK_CLIENTID:dingoawf2jyiwh2uzqnphg}
|
||||
maxkey.socialsignon.dingtalk.client.secret =${SOCIAL_DINGTALK_CLIENTSECRET:Crm7YJbMKfRlvG2i1SHpg4GHVpqF_oXiEjhmRQyiSiuzNRWpbFh9i0UjDTfhOoN9}
|
||||
maxkey.socialsignon.dingtalk.account.id =openid
|
||||
maxkey.socialsignon.dingtalk.hidden =false
|
||||
maxkey.socialsignon.dingtalk.sortorder =5
|
||||
#QQ
|
||||
maxkey.socialsignon.qq.provider =qq
|
||||
maxkey.socialsignon.qq.provider.name =QQ
|
||||
maxkey.socialsignon.qq.icon =images/social/qq.png
|
||||
maxkey.socialsignon.qq.client.id =${SOCIAL_QQ_CLIENTID:101225363}
|
||||
maxkey.socialsignon.qq.client.secret =${SOCIAL_QQ_CLIENTSECRET:8577d75e0eb4a91ac549cc8be3371bfd}
|
||||
maxkey.socialsignon.qq.account.id =openid
|
||||
maxkey.socialsignon.qq.hidden =false
|
||||
maxkey.socialsignon.qq.sortorder =6
|
||||
#Microsoft
|
||||
maxkey.socialsignon.microsoft.provider =microsoft
|
||||
maxkey.socialsignon.microsoft.provider.name =Microsoft
|
||||
maxkey.socialsignon.microsoft.icon =images/social/microsoft.png
|
||||
maxkey.socialsignon.microsoft.client.id =${SOCIAL_MICROSOFT_CLIENTID:24aa73b6-7928-4e64-bd64-d8682e650f95}
|
||||
maxkey.socialsignon.microsoft.client.secret =${SOCIAL_MICROSOFT_CLIENTSECRET:PF[_AthtjVrtWVO2mNy@CJxY1@Z8FNf5}
|
||||
maxkey.socialsignon.microsoft.account.id =id
|
||||
maxkey.socialsignon.microsoft.hidden =false
|
||||
maxkey.socialsignon.microsoft.sortorder =7
|
||||
#facebook
|
||||
maxkey.socialsignon.facebook.provider =facebook
|
||||
maxkey.socialsignon.facebook.provider.name =facebook
|
||||
maxkey.socialsignon.facebook.icon =images/social/facebook.png
|
||||
maxkey.socialsignon.facebook.client.id =${SOCIAL_FACEBOOK_CLIENTID:appKey}
|
||||
maxkey.socialsignon.facebook.client.secret =${SOCIAL_FACEBOOK_CLIENTSECRET:appSecret}
|
||||
maxkey.socialsignon.facebook.account.id =id
|
||||
maxkey.socialsignon.facebook.hidden =false
|
||||
maxkey.socialsignon.facebook.sortorder =8
|
||||
|
||||
############################################################################
|
||||
#Management endpoints configuration #
|
||||
############################################################################
|
||||
|
||||
@@ -59,8 +59,6 @@ maxkey.login.mfa =${LOGIN_MFA_ENABLED:true}
|
||||
maxkey.login.mfa.type =${LOGIN_MFA_TYPE:TimeBasedOtpAuthn}
|
||||
#enable social sign on
|
||||
maxkey.login.socialsignon =${LOGIN_SOCIAL_ENABLED:true}
|
||||
#social sign on providers
|
||||
maxkey.login.socialsignon.providers =${LOGIN_SOCIAL_PROVIDERS:gitee,wechatopen,sinaweibo,google,qq,dingtalk,microsoft,facebook,workweixin}
|
||||
#Enable kerberos/SPNEGO
|
||||
maxkey.login.kerberos =false
|
||||
#wsFederation
|
||||
@@ -314,93 +312,6 @@ maxkey.saml.v20.metadata.surName =maxkey
|
||||
maxkey.saml.v20.metadata.emailAddress =maxkeysupport@163.com
|
||||
maxkey.saml.v20.metadata.telephoneNumber =4008981111
|
||||
|
||||
############################################################################
|
||||
# Social Sign On Configuration #
|
||||
#you config client.id & client.secret only #
|
||||
############################################################################
|
||||
#gitee
|
||||
maxkey.socialsignon.gitee.provider =gitee
|
||||
maxkey.socialsignon.gitee.provider.name =Gitee
|
||||
maxkey.socialsignon.gitee.icon =images/social/gitee.png
|
||||
maxkey.socialsignon.gitee.client.id =${SOCIAL_GITEE_CLIENTID:ee6fdc484b3398d17e77d6ff37fd8b9fe502106398c7b22bf5522d3c01303f45}
|
||||
maxkey.socialsignon.gitee.client.secret =${SOCIAL_GITEE_CLIENTSECRET:d6c3558f295f044df538c966a9084166f9a877c7a7392543184007a5faccdbad}
|
||||
maxkey.socialsignon.gitee.account.id =id
|
||||
maxkey.socialsignon.gitee.hidden =false
|
||||
maxkey.socialsignon.gitee.sortorder =1
|
||||
#wechat
|
||||
maxkey.socialsignon.wechatopen.provider =wechatopen
|
||||
maxkey.socialsignon.wechatopen.provider.name =\u5fae\u4fe1
|
||||
maxkey.socialsignon.wechatopen.icon =images/social/wechat.png
|
||||
maxkey.socialsignon.wechatopen.client.id =${SOCIAL_WECHATOPEN_CLIENTID:ee6fdc484b3398d17e7}
|
||||
maxkey.socialsignon.wechatopen.client.secret =${SOCIAL_WECHATOPEN_CLIENTSECRET:7a5faccdbad}
|
||||
maxkey.socialsignon.wechatopen.account.id =id
|
||||
maxkey.socialsignon.wechatopen.hidden =false
|
||||
maxkey.socialsignon.wechatopen.sortorder =2
|
||||
#work weixin
|
||||
maxkey.socialsignon.workweixin.provider =workweixin
|
||||
maxkey.socialsignon.workweixin.provider.name =\u4F01\u4E1A\u5fae\u4fe1
|
||||
maxkey.socialsignon.workweixin.icon =images/social/wechat_enterprise.png
|
||||
maxkey.socialsignon.workweixin.client.id =${SOCIAL_WORKWEIXIN_CLIENTID:ww61ca142e1fe5b8ca}
|
||||
maxkey.socialsignon.workweixin.client.secret =${SOCIAL_WORKWEIXIN_CLIENTSECRET:CfWEoALuKdSKzXiV-QWXeGSD5zPd6Svze3GR_gB5eFs}
|
||||
maxkey.socialsignon.workweixin.agent.id =${SOCIAL_WORKWEIXIN_AGENTID:1000002}
|
||||
maxkey.socialsignon.workweixin.account.id =id
|
||||
maxkey.socialsignon.workweixin.hidden =true
|
||||
maxkey.socialsignon.workweixin.sortorder =2
|
||||
#sina weibo
|
||||
maxkey.socialsignon.sinaweibo.provider =sinaweibo
|
||||
maxkey.socialsignon.sinaweibo.provider.name =\u65b0\u6d6a\u5fae\u535a
|
||||
maxkey.socialsignon.sinaweibo.icon =images/social/weibo.png
|
||||
maxkey.socialsignon.sinaweibo.client.id =${SOCIAL_SINAWEIBO_CLIENTID:3379757634}
|
||||
maxkey.socialsignon.sinaweibo.client.secret =${SOCIAL_SINAWEIBO_CLIENTSECRET:1adfdf9800299037bcab9d1c238664ba}
|
||||
maxkey.socialsignon.sinaweibo.account.id =id
|
||||
maxkey.socialsignon.sinaweibo.hidden =false
|
||||
maxkey.socialsignon.sinaweibo.sortorder =3
|
||||
#Google
|
||||
maxkey.socialsignon.google.provider =google
|
||||
maxkey.socialsignon.google.provider.name =Google
|
||||
maxkey.socialsignon.google.icon =images/social/google.png
|
||||
maxkey.socialsignon.google.client.id =${SOCIAL_GOOGLE_CLIENTID:519914515488.apps.googleusercontent.com}
|
||||
maxkey.socialsignon.google.client.secret =${SOCIAL_GOOGLE_CLIENTSECRET:3aTW3Iw7e11QqMnHxciCaXTt}
|
||||
maxkey.socialsignon.google.account.id =id
|
||||
maxkey.socialsignon.google.hidden =false
|
||||
maxkey.socialsignon.google.sortorder =4
|
||||
#dingtalk
|
||||
maxkey.socialsignon.dingtalk.provider =dingtalk
|
||||
maxkey.socialsignon.dingtalk.provider.name =dingtalk
|
||||
maxkey.socialsignon.dingtalk.icon =images/social/dingtalk.png
|
||||
maxkey.socialsignon.dingtalk.client.id =${SOCIAL_DINGTALK_CLIENTID:dingoawf2jyiwh2uzqnphg}
|
||||
maxkey.socialsignon.dingtalk.client.secret =${SOCIAL_DINGTALK_CLIENTSECRET:Crm7YJbMKfRlvG2i1SHpg4GHVpqF_oXiEjhmRQyiSiuzNRWpbFh9i0UjDTfhOoN9}
|
||||
maxkey.socialsignon.dingtalk.account.id =openid
|
||||
maxkey.socialsignon.dingtalk.hidden =false
|
||||
maxkey.socialsignon.dingtalk.sortorder =5
|
||||
#QQ
|
||||
maxkey.socialsignon.qq.provider =qq
|
||||
maxkey.socialsignon.qq.provider.name =QQ
|
||||
maxkey.socialsignon.qq.icon =images/social/qq.png
|
||||
maxkey.socialsignon.qq.client.id =${SOCIAL_QQ_CLIENTID:101225363}
|
||||
maxkey.socialsignon.qq.client.secret =${SOCIAL_QQ_CLIENTSECRET:8577d75e0eb4a91ac549cc8be3371bfd}
|
||||
maxkey.socialsignon.qq.account.id =openid
|
||||
maxkey.socialsignon.qq.hidden =false
|
||||
maxkey.socialsignon.qq.sortorder =6
|
||||
#Microsoft
|
||||
maxkey.socialsignon.microsoft.provider =microsoft
|
||||
maxkey.socialsignon.microsoft.provider.name =Microsoft
|
||||
maxkey.socialsignon.microsoft.icon =images/social/microsoft.png
|
||||
maxkey.socialsignon.microsoft.client.id =${SOCIAL_MICROSOFT_CLIENTID:24aa73b6-7928-4e64-bd64-d8682e650f95}
|
||||
maxkey.socialsignon.microsoft.client.secret =${SOCIAL_MICROSOFT_CLIENTSECRET:PF[_AthtjVrtWVO2mNy@CJxY1@Z8FNf5}
|
||||
maxkey.socialsignon.microsoft.account.id =id
|
||||
maxkey.socialsignon.microsoft.hidden =false
|
||||
maxkey.socialsignon.microsoft.sortorder =7
|
||||
#facebook
|
||||
maxkey.socialsignon.facebook.provider =facebook
|
||||
maxkey.socialsignon.facebook.provider.name =facebook
|
||||
maxkey.socialsignon.facebook.icon =images/social/facebook.png
|
||||
maxkey.socialsignon.facebook.client.id =${SOCIAL_FACEBOOK_CLIENTID:appKey}
|
||||
maxkey.socialsignon.facebook.client.secret =${SOCIAL_FACEBOOK_CLIENTSECRET:appSecret}
|
||||
maxkey.socialsignon.facebook.account.id =id
|
||||
maxkey.socialsignon.facebook.hidden =false
|
||||
maxkey.socialsignon.facebook.sortorder =8
|
||||
|
||||
############################################################################
|
||||
#Management endpoints configuration #
|
||||
############################################################################
|
||||
|
||||
@@ -127,6 +127,8 @@ public class MaxKeyMgtMvcConfig implements WebMvcConfigurer {
|
||||
.addPathPatterns("/historys/**")
|
||||
.addPathPatterns("/historys/**/**")
|
||||
.addPathPatterns("/session/**")
|
||||
.addPathPatterns("/socialsprovider/**")
|
||||
.addPathPatterns("/accountsstrategy/**")
|
||||
|
||||
;
|
||||
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
/*
|
||||
* Copyright [2021] [MaxKey of copyright http://www.maxkey.top]
|
||||
*
|
||||
* Licensed 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.
|
||||
*/
|
||||
|
||||
|
||||
package org.maxkey.web.contorller;
|
||||
|
||||
import org.apache.mybatis.jpa.persistence.JpaPageResults;
|
||||
import org.maxkey.constants.ConstantsOperateMessage;
|
||||
import org.maxkey.entity.SocialsProvider;
|
||||
import org.maxkey.persistence.service.SocialsProviderService;
|
||||
import org.maxkey.web.WebContext;
|
||||
import org.maxkey.web.message.Message;
|
||||
import org.maxkey.web.message.MessageType;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
|
||||
|
||||
@Controller
|
||||
@RequestMapping(value={"/socialsprovider"})
|
||||
public class SocialsProviderController {
|
||||
final static Logger _logger = LoggerFactory.getLogger(SocialsProviderController.class);
|
||||
|
||||
@Autowired
|
||||
SocialsProviderService socialsProviderService;
|
||||
|
||||
@RequestMapping(value={"/list"})
|
||||
public ModelAndView noticesList(){
|
||||
return new ModelAndView("socialsprovider/socialsProviderList");
|
||||
}
|
||||
|
||||
|
||||
@RequestMapping(value = { "/grid" })
|
||||
@ResponseBody
|
||||
public JpaPageResults<SocialsProvider> queryDataGrid(@ModelAttribute("socialsProvider") SocialsProvider socialsProvider) {
|
||||
_logger.debug(""+socialsProvider);
|
||||
return socialsProviderService.queryPageResults(socialsProvider);
|
||||
}
|
||||
|
||||
|
||||
@RequestMapping(value = { "/forwardAdd" })
|
||||
public ModelAndView forwardAdd() {
|
||||
return new ModelAndView("socialsprovider/socialsProviderAdd");
|
||||
}
|
||||
|
||||
@RequestMapping(value = { "/forwardUpdate/{id}" })
|
||||
public ModelAndView forwardUpdate(@PathVariable("id") String id) {
|
||||
ModelAndView modelAndView=new ModelAndView("socialsprovider/socialsProviderUpdate");
|
||||
modelAndView.addObject("model",socialsProviderService.get(id));
|
||||
return modelAndView;
|
||||
}
|
||||
|
||||
@ResponseBody
|
||||
@RequestMapping(value={"/add"})
|
||||
public Message insert(@ModelAttribute("socialsProvider") SocialsProvider socialsProvider) {
|
||||
_logger.debug("-Add :" + socialsProvider);
|
||||
|
||||
if (socialsProviderService.insert(socialsProvider)) {
|
||||
return new Message(WebContext.getI18nValue(ConstantsOperateMessage.INSERT_SUCCESS),MessageType.success);
|
||||
|
||||
} else {
|
||||
return new Message(WebContext.getI18nValue(ConstantsOperateMessage.INSERT_SUCCESS),MessageType.error);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询
|
||||
* @param role
|
||||
* @return
|
||||
*/
|
||||
@ResponseBody
|
||||
@RequestMapping(value={"/query"})
|
||||
public Message query(@ModelAttribute("socialsProvider") SocialsProvider socialsProvider) {
|
||||
_logger.debug("-query :" + socialsProvider);
|
||||
if (socialsProviderService.load(socialsProvider)!=null) {
|
||||
return new Message(WebContext.getI18nValue(ConstantsOperateMessage.INSERT_SUCCESS),MessageType.success);
|
||||
|
||||
} else {
|
||||
return new Message(WebContext.getI18nValue(ConstantsOperateMessage.INSERT_ERROR),MessageType.error);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改
|
||||
* @param role
|
||||
* @return
|
||||
*/
|
||||
@ResponseBody
|
||||
@RequestMapping(value={"/update"})
|
||||
public Message update(@ModelAttribute("socialsProvider") SocialsProvider socialsProvider) {
|
||||
_logger.debug("-update socialsProvider :" + socialsProvider);
|
||||
|
||||
if (socialsProviderService.update(socialsProvider)) {
|
||||
return new Message(WebContext.getI18nValue(ConstantsOperateMessage.UPDATE_SUCCESS),MessageType.success);
|
||||
|
||||
} else {
|
||||
return new Message(WebContext.getI18nValue(ConstantsOperateMessage.UPDATE_ERROR),MessageType.error);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ResponseBody
|
||||
@RequestMapping(value={"/delete"})
|
||||
public Message delete(@ModelAttribute("socialsProvider") SocialsProvider socialsProvider) {
|
||||
_logger.debug("-delete socialsProvider :" + socialsProvider);
|
||||
|
||||
if (socialsProviderService.batchDelete(socialsProvider.getId())) {
|
||||
return new Message(WebContext.getI18nValue(ConstantsOperateMessage.DELETE_SUCCESS),MessageType.success);
|
||||
|
||||
} else {
|
||||
return new Message(WebContext.getI18nValue(ConstantsOperateMessage.DELETE_SUCCESS),MessageType.error);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -36,6 +36,7 @@ common.text.createddate=\u521b\u5efa\u65f6\u95f4
|
||||
common.text.modifiedby=\u4fee\u6539\u4eba
|
||||
common.text.modifieddate=\u4fee\u6539\u65f6\u95f4
|
||||
common.text.sortindex=\u6392\u5e8f
|
||||
common.text.status=\u72B6\u6001
|
||||
common.text.status.start=\u5f00\u59cb
|
||||
common.text.status.normal=\u6b63\u5e38
|
||||
common.text.status.validated=\u6709\u6548
|
||||
@@ -453,6 +454,15 @@ accounts.strategy.name=\u7B56\u7565\u540D\u79F0
|
||||
accounts.strategy.mapping=\u8D26\u53F7\u6620\u5C04
|
||||
accounts.strategy.filters=\u7528\u6237\u6761\u4EF6
|
||||
accounts.strategy.orgidslist=\u673A\u6784\u5217\u8868
|
||||
#socials.provider
|
||||
socials.provider.id=\u7F16\u53F7
|
||||
socials.provider.provider=\u63D0\u4F9B\u8005
|
||||
socials.provider.providerName=\u540D\u79F0
|
||||
socials.provider.icon=\u56FE\u6807
|
||||
socials.provider.clientId=\u51ED\u8BC1
|
||||
socials.provider.clientSecret=\u5BC6\u94A5
|
||||
socials.provider.agentId=AgentId
|
||||
socials.provider.hidden=\u9690\u85CF
|
||||
#synchronizers
|
||||
synchronizers.id=\u7F16\u53F7
|
||||
synchronizers.name=\u540C\u6B65\u5668\u540D\u79F0
|
||||
@@ -592,4 +602,5 @@ navs.role.permissions=\u89d2\u8272\u6743\u9650\u7ba1\u7406
|
||||
navs.resources=\u8d44\u6e90\u7ba1\u7406
|
||||
navs.adapters=\u9002\u914D\u5668\u6CE8\u518C
|
||||
navs.notices=\u901A\u77E5\u516C\u544A
|
||||
navs.socials.provider=\u793E\u4EA4\u63D0\u4F9B\u5546
|
||||
navs.synchronizers=\u540C\u6B65\u5668\u7BA1\u7406
|
||||
@@ -36,6 +36,7 @@ common.text.createddate=CreatedDate
|
||||
common.text.modifiedby=ModifiedBy
|
||||
common.text.modifieddate=ModifiedDate
|
||||
common.text.sortindex=sort
|
||||
common.text.status=status
|
||||
common.text.status.start=start
|
||||
common.text.status.normal=normal
|
||||
common.text.status.validated=validated
|
||||
@@ -462,6 +463,15 @@ accounts.strategy.mapping=mapping
|
||||
accounts.strategy.filters=filters
|
||||
accounts.strategy.orgidslist=orgIdsList
|
||||
|
||||
socials.provider.id=Id
|
||||
socials.provider.provider=Provider
|
||||
socials.provider.providerName=ProviderName
|
||||
socials.provider.icon=Icon
|
||||
socials.provider.clientId=ClientId
|
||||
socials.provider.clientSecret=ClientSecret
|
||||
socials.provider.agentId=AgentId
|
||||
socials.provider.hidden=Hidden
|
||||
|
||||
#synchronizers
|
||||
synchronizers.id=id
|
||||
synchronizers.name=name
|
||||
@@ -602,4 +612,5 @@ navs.role.permissions=Permissions
|
||||
navs.resources=Resources
|
||||
navs.adapters=Adapters
|
||||
navs.notices=Notices
|
||||
navs.socials.provider=SocialsProvider
|
||||
navs.synchronizers=Synchronizers
|
||||
@@ -36,6 +36,7 @@ common.text.createddate=\u521b\u5efa\u65f6\u95f4
|
||||
common.text.modifiedby=\u4fee\u6539\u4eba
|
||||
common.text.modifieddate=\u4fee\u6539\u65f6\u95f4
|
||||
common.text.sortindex=\u6392\u5e8f
|
||||
common.text.status=\u72B6\u6001
|
||||
common.text.status.start=\u5f00\u59cb
|
||||
common.text.status.normal=\u6b63\u5e38
|
||||
common.text.status.validated=\u6709\u6548
|
||||
@@ -459,6 +460,15 @@ accounts.strategy.name=\u7B56\u7565\u540D\u79F0
|
||||
accounts.strategy.mapping=\u8D26\u53F7\u6620\u5C04
|
||||
accounts.strategy.filters=\u7528\u6237\u6761\u4EF6
|
||||
accounts.strategy.orgidslist=\u673A\u6784\u5217\u8868
|
||||
#socials.provider
|
||||
socials.provider.id=\u7F16\u53F7
|
||||
socials.provider.provider=\u63D0\u4F9B\u8005
|
||||
socials.provider.providerName=\u540D\u79F0
|
||||
socials.provider.icon=\u56FE\u6807
|
||||
socials.provider.clientId=\u51ED\u8BC1
|
||||
socials.provider.clientSecret=\u5BC6\u94A5
|
||||
socials.provider.agentId=AgentId
|
||||
socials.provider.hidden=\u9690\u85CF
|
||||
#synchronizers
|
||||
synchronizers.id=\u7F16\u53F7
|
||||
synchronizers.name=\u540C\u6B65\u5668\u540D\u79F0
|
||||
@@ -597,4 +607,5 @@ navs.role.permissions=\u89d2\u8272\u6743\u9650\u7ba1\u7406
|
||||
navs.resources=\u8d44\u6e90\u7ba1\u7406
|
||||
navs.adapters=\u9002\u914D\u5668\u6CE8\u518C
|
||||
navs.notices=\u901A\u77E5\u516C\u544A
|
||||
navs.socials.provider=\u793E\u4EA4\u63D0\u4F9B\u5546
|
||||
navs.synchronizers=\u540C\u6B65\u5668\u7BA1\u7406
|
||||
@@ -102,7 +102,13 @@
|
||||
<li>
|
||||
<a class="side-nav-menu" href="<@base />/accountsstrategy/list/">
|
||||
<@locale code="navs.accounts.strategy"/>
|
||||
<span class="fa fa-fw fa-globe fa-lg"></span>
|
||||
<span class="fa fa-fw fa-superpowers fa-lg"></span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="side-nav-menu" href="<@base />/socialsprovider/list/">
|
||||
<@locale code="navs.socials.provider"/>
|
||||
<span class="fa fa-fw fa-commenting fa-lg"></span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<#include "../layout/header.ftl"/>
|
||||
<#include "../layout/common.cssjs.ftl"/>
|
||||
<style type="text/css">
|
||||
.table th, .table td {
|
||||
padding: .2rem;
|
||||
vertical-align: middle;
|
||||
}
|
||||
</style>
|
||||
<script type="text/javascript">
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<form id="actionForm" method="post" type="label" autoclose="true" action="<@base/>/socialsprovider/add" class="needs-validation" novalidate>
|
||||
<table border="0" cellpadding="0" cellspacing="0" class="table table-bordered" >
|
||||
<tbody>
|
||||
<tr style="display:none">
|
||||
<th><@locale code="common.text.id" />:</th>
|
||||
<td nowrap>
|
||||
<input type="text" id="id" name="id" class="form-control" title="" value="" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><@locale code="socials.provider.icon" />:</th>
|
||||
<td nowrap>
|
||||
<input type="text" id="title" name="icon" class="form-control" title="" value="" required="" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><@locale code="socials.provider.provider" />:</th>
|
||||
<td nowrap>
|
||||
<input type="text" id="provider" name="provider" class="form-control" title="" value="" required="" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><@locale code="socials.provider.providerName" />:</th>
|
||||
<td nowrap>
|
||||
<input type="text" id="providerName" name="providerName" class="form-control" title="" value="" required="" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><@locale code="socials.provider.clientId" />:</th>
|
||||
<td nowrap>
|
||||
<input type="text" id="clientId" name="clientId" class="form-control" title="" value="" required="" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><@locale code="socials.provider.clientSecret" />:</th>
|
||||
<td nowrap>
|
||||
<input type="text" id="clientSecret" name="clientSecret" class="form-control" title="" value="" required="" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><@locale code="socials.provider.agentId" />:</th>
|
||||
<td nowrap>
|
||||
<input type="text" id="agentId" name="agentId" class="form-control" title="" value="" required="" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><@locale code="common.text.sortindex" />:</th>
|
||||
<td nowrap>
|
||||
<input type="text" id="sortIndex" name="sortIndex" class="form-control" title="" value="" required="" />
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th><@locale code="socials.provider.hidden" />:</th>
|
||||
<td nowrap>
|
||||
<input type="text" id="hidden" name="hidden" class="form-control" title="" value="" required="" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><@locale code="common.text.status" />:</th>
|
||||
<td nowrap>
|
||||
<input type="text" id="status" name="status" class="form-control" title="" value="" required="" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td nowrap colspan="2" class="center">
|
||||
<input id="_method" type="hidden" name="_method" value="post"/>
|
||||
<input class="button btn btn-primary mr-3" id="submitBtn" type="submit" value="<@locale code="button.text.save" />">
|
||||
<input class="button btn btn-secondary mr-3" id="closeBtn" type="button" value="<@locale code="button.text.cancel" />">
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,131 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<#include "../layout/header.ftl"/>
|
||||
<#include "../layout/common.cssjs.ftl"/>
|
||||
<script type="text/javascript">
|
||||
function dynamicFormatter(value, row, index){
|
||||
return value=='0'? '<@locale code="common.text.no" />':'<@locale code="common.text.yes" />';
|
||||
};
|
||||
function iconFormatter(value, row, index){
|
||||
return "<img height='30' border='0px' src='<@base/>/static/"+value+"'/>";
|
||||
};
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="app header-default side-nav-dark">
|
||||
<div class="layout">
|
||||
<div class="header navbar">
|
||||
<#include "../layout/top.ftl"/>
|
||||
</div>
|
||||
|
||||
<div class="col-md-3 sidebar-nav side-nav" >
|
||||
<#include "../layout/sidenav.ftl"/>
|
||||
</div>
|
||||
<div class="page-container">
|
||||
|
||||
<div class="main-content">
|
||||
<div class="container-fluid">
|
||||
<div class="breadcrumb-wrapper row">
|
||||
<div class="col-12 col-lg-3 col-md-6">
|
||||
<h4 class="page-title"><@locale code="navs.socials.provider"/></h4>
|
||||
</div>
|
||||
<div class="col-12 col-lg-9 col-md-6">
|
||||
<ol class="breadcrumb float-right">
|
||||
<li><a href="<@base/>/main"><@locale code="navs.home"/></a></li>
|
||||
<li class="active">/ <@locale code="navs.socials.provider"/></li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="container-fluid">
|
||||
<div class="content-wrapper row">
|
||||
<div class="col-12 grid-margin">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
|
||||
<table class="table table-bordered">
|
||||
<tr>
|
||||
<td width="120px"><@locale code="socials.provider.providerName"/>:</td>
|
||||
<td width="375px">
|
||||
<form id="basic_search_form">
|
||||
<input class="form-control" type="text" name="providerName" style ="width:150px;float:left;">
|
||||
<input class="button btn btn-primary mr-3" id="searchBtn" type="button" size="50" value="<@locale code="button.text.search"/>">
|
||||
<!--<input class="button btn btn-secondary" id="advancedSearchExpandBtn" type="button" size="50" value="<@locale code="button.text.expandsearch"/>" expandValue="<@locale code="button.text.expandsearch"/>" collapseValue="<@locale code="button.text.collapsesearch"/>">
|
||||
-->
|
||||
</form>
|
||||
</td>
|
||||
<td colspan="2">
|
||||
<div id="tool_box_right">
|
||||
<input class="button btn btn-success mr-3" id="addBtn" type="button" value="<@locale code="button.text.add"/>"
|
||||
wurl="<@base/>/socialsprovider/forwardAdd"
|
||||
wwidth="700"
|
||||
wheight="500"
|
||||
target="window">
|
||||
|
||||
<input class="button btn btn-info mr-3 " id="modifyBtn" type="button" value="<@locale code="button.text.edit"/>"
|
||||
wurl="<@base/>/socialsprovider/forwardUpdate"
|
||||
wwidth="700"
|
||||
wheight="500"
|
||||
target="window">
|
||||
|
||||
<input class="button btn btn-danger mr-3 " id="deleteBtn" type="button" value="<@locale code="button.text.delete"/>"
|
||||
wurl="<@base/>/socialsprovider/delete" />
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div id="advanced_search">
|
||||
<form id="advanced_search_form">
|
||||
|
||||
</form>
|
||||
</div>
|
||||
<table data-url="<@base/>/socialsprovider/grid"
|
||||
id="datagrid"
|
||||
data-toggle="table"
|
||||
data-classes="table table-bordered table-hover table-striped"
|
||||
data-click-to-select="true"
|
||||
data-pagination="true"
|
||||
data-total-field="records"
|
||||
data-page-list="[10, 25, 50, 100]"
|
||||
data-search="false"
|
||||
data-locale="zh-CN"
|
||||
data-query-params="dataGridQueryParams"
|
||||
data-query-params-type="pageSize"
|
||||
data-side-pagination="server">
|
||||
<thead>
|
||||
<tr>
|
||||
<th data-checkbox="true"></th>
|
||||
<th data-sortable="true" data-field="id" data-visible="false">Id</th>
|
||||
<th data-field="icon" data-formatter="iconFormatter"><@locale code="socials.provider.icon"/></th>
|
||||
<th data-field="provider"><@locale code="socials.provider.provider"/></th>
|
||||
<th data-field="providerName"><@locale code="socials.provider.providerName"/></th>
|
||||
<th data-field="sortIndex"><@locale code="common.text.sortindex"/></th>
|
||||
<th data-field="status"><@locale code="common.text.status"/></th>
|
||||
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<footer class="content-footer">
|
||||
<#include "../layout/footer.ftl"/>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="preloader">
|
||||
<div class="loader" id="loader-1"></div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,95 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<#include "../layout/header.ftl"/>
|
||||
<#include "../layout/common.cssjs.ftl"/>
|
||||
<style type="text/css">
|
||||
.table th, .table td {
|
||||
padding: .2rem;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.ck-content {
|
||||
min-height: 300px;
|
||||
}
|
||||
</style>
|
||||
<script type="text/javascript">
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<form id="actionForm" method="post" type="label" autoclose="true" action="<@base/>/socialsprovider/update" class="needs-validation" novalidate>
|
||||
<table border="0" cellpadding="0" cellspacing="0" class="table table-bordered">
|
||||
<tbody>
|
||||
<tr style="display:none">
|
||||
<th><@locale code="common.text.id" />:</th>
|
||||
<td nowrap>
|
||||
<input id="id" type="text" readonly name="id" class="form-control" value="${model.id}"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><@locale code="socials.provider.icon" />:</th>
|
||||
<td nowrap>
|
||||
<input type="text" id="title" name="icon" class="form-control" title="" value="${model.icon!}" required="" style="width:80%;float:left;"/><img height='30' border='0px' src='<@base/>/static/${model.icon!}'/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><@locale code="socials.provider.provider" />:</th>
|
||||
<td nowrap>
|
||||
<input type="text" id="provider" name="provider" class="form-control" title="" value="${model.provider!}" required="" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><@locale code="socials.provider.providerName" />:</th>
|
||||
<td nowrap>
|
||||
<input type="text" id="providerName" name="providerName" class="form-control" title="" value="${model.providerName!}" required="" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><@locale code="socials.provider.clientId" />:</th>
|
||||
<td nowrap>
|
||||
<input type="text" id="clientId" name="clientId" class="form-control" title="" value="${model.clientId!}" required="" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><@locale code="socials.provider.clientSecret" />:</th>
|
||||
<td nowrap>
|
||||
<input type="text" id="clientSecret" name="clientSecret" class="form-control" title="" value="${model.clientSecret!}" required="" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><@locale code="socials.provider.agentId" />:</th>
|
||||
<td nowrap>
|
||||
<input type="text" id="agentId" name="agentId" class="form-control" title="" value="${model.agentId!}" required="" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><@locale code="common.text.sortindex" />:</th>
|
||||
<td nowrap>
|
||||
<input type="text" id="sortIndex" name="sortIndex" class="form-control" title="" value="${model.sortIndex!}" required="" />
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th><@locale code="socials.provider.hidden" />:</th>
|
||||
<td nowrap>
|
||||
<input type="text" id="hidden" name="hidden" class="form-control" title="" value="${model.hidden!}" required="" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><@locale code="common.text.status" />:</th>
|
||||
<td nowrap>
|
||||
<input type="text" id="status" name="status" class="form-control" title="" value="${model.status!}" required="" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td nowrap colspan="2" class="center">
|
||||
<input id="_method" type="hidden" name="_method" value="post"/>
|
||||
<input class="button btn btn-primary mr-3" id="submitBtn" type="submit" value="<@locale code="button.text.save" />">
|
||||
<input class="button btn btn-secondary mr-3" id="closeBtn" type="button" value="<@locale code="button.text.cancel" />">
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user