소스 검색

SocialsProvider to database

Crystal.Sea 4 년 전
부모
커밋
4d3f124582
23개의 변경된 파일1073개의 추가작업 그리고 493개의 파일을 삭제
  1. 33 16
      maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/AbstractSocialSignOnEndpoint.java
  2. 13 5
      maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/SocialSignOnEndpoint.java
  3. 0 202
      maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/service/SocialSignOnProvider.java
  4. 93 40
      maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/service/SocialSignOnProviderService.java
  5. 6 42
      maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/autoconfigure/SocialSignOnAutoConfiguration.java
  6. 313 0
      maxkey-core/src/main/java/org/maxkey/entity/SocialsProvider.java
  7. 31 0
      maxkey-persistence/src/main/java/org/maxkey/persistence/mapper/SocialsProviderMapper.java
  8. 45 0
      maxkey-persistence/src/main/java/org/maxkey/persistence/service/SocialsProviderService.java
  9. 28 0
      maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/SocialsProviderMapper.xml
  10. 5 3
      maxkey-protocols/maxkey-protocol-saml-2.0/src/main/java/org/maxkey/authz/saml20/binding/impl/ExtractPostBindingAdapter.java
  11. 4 1
      maxkey-protocols/maxkey-protocol-saml-2.0/src/main/java/org/maxkey/authz/saml20/provider/xml/AssertionGenerator.java
  12. 5 5
      maxkey-webs/maxkey-web-maxkey/src/main/java/org/maxkey/web/contorller/SocialSignOnListController.java
  13. 0 89
      maxkey-webs/maxkey-web-maxkey/src/main/resources/application-http.properties
  14. 0 89
      maxkey-webs/maxkey-web-maxkey/src/main/resources/application-https.properties
  15. 2 0
      maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/MaxKeyMgtMvcConfig.java
  16. 137 0
      maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/contorller/SocialsProviderController.java
  17. 11 0
      maxkey-webs/maxkey-web-mgt/src/main/resources/messages/message.properties
  18. 11 0
      maxkey-webs/maxkey-web-mgt/src/main/resources/messages/message_en.properties
  19. 11 0
      maxkey-webs/maxkey-web-mgt/src/main/resources/messages/message_zh_CN.properties
  20. 7 1
      maxkey-webs/maxkey-web-mgt/src/main/resources/templates/views/layout/sidenav.ftl
  21. 92 0
      maxkey-webs/maxkey-web-mgt/src/main/resources/templates/views/socialsprovider/socialsProviderAdd.ftl
  22. 131 0
      maxkey-webs/maxkey-web-mgt/src/main/resources/templates/views/socialsprovider/socialsProviderList.ftl
  23. 95 0
      maxkey-webs/maxkey-web-mgt/src/main/resources/templates/views/socialsprovider/socialsProviderUpdate.ftl

+ 33 - 16
maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/AbstractSocialSignOnEndpoint.java

@@ -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;
  	}
   	
-
 }

+ 13 - 5
maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/SocialSignOnEndpoint.java

@@ -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;

+ 0 - 202
maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/service/SocialSignOnProvider.java

@@ -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();
-	}
-	
-	
-
-}

+ 93 - 40
maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/service/SocialSignOnProviderService.java

@@ -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 ,SocialsProvider>socialSignOnProviderMaps=new HashMap<String ,SocialsProvider>();
 	
-	HashMap<String ,SocialSignOnProvider>socialSignOnProviderMaps=new HashMap<String ,SocialSignOnProvider>();
+	private final JdbcTemplate jdbcTemplate;
 	
+	public SocialSignOnProviderService(JdbcTemplate jdbcTemplate) {
+        this.jdbcTemplate=jdbcTemplate; 
+    }
+
 	
-	public SocialSignOnProvider get(String provider){
+	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;
+        }
+    }
 }

+ 6 - 42
maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/autoconfigure/SocialSignOnAutoConfiguration.java

@@ -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 - 0
maxkey-core/src/main/java/org/maxkey/entity/SocialsProvider.java

@@ -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();
+    }
+	
+	
+
+}

+ 31 - 0
maxkey-persistence/src/main/java/org/maxkey/persistence/mapper/SocialsProviderMapper.java

@@ -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>{
+
+	
+}

+ 45 - 0
maxkey-persistence/src/main/java/org/maxkey/persistence/service/SocialsProviderService.java

@@ -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();
+	}
+	
+
+}

+ 28 - 0
maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/SocialsProviderMapper.xml

@@ -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>

+ 5 - 3
maxkey-protocols/maxkey-protocol-saml-2.0/src/main/java/org/maxkey/authz/saml20/binding/impl/ExtractPostBindingAdapter.java

@@ -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(), 

+ 4 - 1
maxkey-protocols/maxkey-protocol-saml-2.0/src/main/java/org/maxkey/authz/saml20/provider/xml/AssertionGenerator.java

@@ -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());
 	        

+ 5 - 5
maxkey-webs/maxkey-web-maxkey/src/main/java/org/maxkey/web/contorller/SocialSignOnListController.java

@@ -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());

+ 0 - 89
maxkey-webs/maxkey-web-maxkey/src/main/resources/application-http.properties

@@ -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           
@@ -313,93 +311,6 @@ 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                                        #
 ############################################################################
 management.security.enabled                     =false

+ 0 - 89
maxkey-webs/maxkey-web-maxkey/src/main/resources/application-https.properties

@@ -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           
@@ -315,93 +313,6 @@ 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                                        #
 ############################################################################
 management.security.enabled                     =false

+ 2 - 0
maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/MaxKeyMgtMvcConfig.java

@@ -127,6 +127,8 @@ public class MaxKeyMgtMvcConfig implements WebMvcConfigurer {
                 .addPathPatterns("/historys/**")
                 .addPathPatterns("/historys/**/**")
                 .addPathPatterns("/session/**")
+                .addPathPatterns("/socialsprovider/**")
+                .addPathPatterns("/accountsstrategy/**")
                 
                 ;
         

+ 137 - 0
maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/contorller/SocialsProviderController.java

@@ -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);
+		}
+		
+	}
+}

+ 11 - 0
maxkey-webs/maxkey-web-mgt/src/main/resources/messages/message.properties

@@ -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

+ 11 - 0
maxkey-webs/maxkey-web-mgt/src/main/resources/messages/message_en.properties

@@ -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

+ 11 - 0
maxkey-webs/maxkey-web-mgt/src/main/resources/messages/message_zh_CN.properties

@@ -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

+ 7 - 1
maxkey-webs/maxkey-web-mgt/src/main/resources/templates/views/layout/sidenav.ftl

@@ -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>
             

+ 92 - 0
maxkey-webs/maxkey-web-mgt/src/main/resources/templates/views/socialsprovider/socialsProviderAdd.ftl

@@ -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>

+ 131 - 0
maxkey-webs/maxkey-web-mgt/src/main/resources/templates/views/socialsprovider/socialsProviderList.ftl

@@ -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>

+ 95 - 0
maxkey-webs/maxkey-web-mgt/src/main/resources/templates/views/socialsprovider/socialsProviderUpdate.ftl

@@ -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>