MaxKey před 3 roky
rodič
revize
0c467a72a6
20 změnil soubory, kde provedl 370 přidání a 328 odebrání
  1. 5 12
      maxkey-authentications/maxkey-authentication-captcha/src/main/java/org/maxkey/web/contorller/ImageCaptchaEndpoint.java
  2. 1 2
      maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/AbstractAuthenticationProvider.java
  3. 6 2
      maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/RealmAuthenticationProvider.java
  4. 13 61
      maxkey-core/src/main/java/org/maxkey/configuration/LoginConfig.java
  5. 44 8
      maxkey-core/src/main/java/org/maxkey/entity/Institutions.java
  6. 3 0
      maxkey-core/src/main/java/org/maxkey/persistence/repository/InstitutionsRepository.java
  7. 27 27
      maxkey-webs/maxkey-web-maxkey/src/main/java/org/maxkey/web/contorller/SocialSignOnListController.java
  8. 5 2
      maxkey-webs/maxkey-web-maxkey/src/main/java/org/maxkey/web/endpoint/IndexEndpoint.java
  9. 4 6
      maxkey-webs/maxkey-web-maxkey/src/main/java/org/maxkey/web/endpoint/LoginEndpoint.java
  10. 1 6
      maxkey-webs/maxkey-web-maxkey/src/main/resources/application-http.properties
  11. 1 6
      maxkey-webs/maxkey-web-maxkey/src/main/resources/application-https.properties
  12. 1 1
      maxkey-webs/maxkey-web-maxkey/src/main/resources/templates/views/loginnormal.ftl
  13. 4 1
      maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/endpoint/LoginEndpoint.java
  14. 0 9
      maxkey-webs/maxkey-web-mgt/src/main/resources/application-http.properties
  15. 12 4
      maxkey-webs/maxkey-web-mgt/src/main/resources/messages/message.properties
  16. 12 4
      maxkey-webs/maxkey-web-mgt/src/main/resources/messages/message_en.properties
  17. 13 4
      maxkey-webs/maxkey-web-mgt/src/main/resources/messages/message_zh_CN.properties
  18. 215 171
      maxkey-webs/maxkey-web-mgt/src/main/resources/templates/views/institutions/updateInstitutions.ftl
  19. 1 1
      maxkey-webs/maxkey-web-mgt/src/main/resources/templates/views/login.ftl
  20. 2 1
      maxkey-webs/maxkey-web-resources/src/main/resources/static/javascript/platform.common.js

+ 5 - 12
maxkey-authentications/maxkey-authentication-captcha/src/main/java/org/maxkey/web/contorller/ImageCaptchaEndpoint.java

@@ -28,9 +28,9 @@ import javax.servlet.http.HttpServletResponse;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 
 
 /**
@@ -48,10 +48,6 @@ public class ImageCaptchaEndpoint {
     
     @Autowired
     private Producer captchaProducer;
-    
-    @Value("${maxkey.login.captcha.type}")
-    private String captchaType;
-    
 
     /**
      * captcha image Producer.
@@ -60,9 +56,11 @@ public class ImageCaptchaEndpoint {
      * @param response HttpServletResponse
      */
     @RequestMapping(value = "/captcha")
-    public void captchaHandleRequest(HttpServletRequest request, HttpServletResponse response) {
+    public void captchaHandleRequest(HttpServletRequest  request, 
+    								 HttpServletResponse response, 
+    								 @RequestParam(value="captcha",required=false,defaultValue="text") String captchaType) {
         try {
-           
+        	
             String kaptchaText = captchaProducer.createText();
             if (captchaType.equalsIgnoreCase("Arithmetic")) {
                 Integer intParamA = Integer.valueOf(kaptchaText.substring(0, 1));
@@ -127,11 +125,6 @@ public class ImageCaptchaEndpoint {
             }
         }
     }
- 
-
-    public void setCaptchaType(String captchaType) {
-		this.captchaType = captchaType;
-	}
 
 	public void setCaptchaProducer(Producer captchaProducer) {
         this.captchaProducer = captchaProducer;

+ 1 - 2
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/AbstractAuthenticationProvider.java

@@ -203,8 +203,7 @@ public abstract class AbstractAuthenticationProvider {
      */
     protected void captchaValid(String captcha, String authType) {
         // for basic
-        if (applicationConfig.getLoginConfig().isCaptcha() 
-        		&& authType.equalsIgnoreCase(AuthType.NORMAL)) {
+        if (authType.equalsIgnoreCase(AuthType.NORMAL)) {
             _logger.info("captcha : "
                     + WebContext.getSession().getAttribute(
                             WebConstants.KAPTCHA_SESSION_KEY).toString());

+ 6 - 2
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/RealmAuthenticationProvider.java

@@ -24,6 +24,7 @@ import org.maxkey.authn.online.OnlineTicketServices;
 import org.maxkey.authn.realm.AbstractAuthenticationRealm;
 import org.maxkey.authn.support.rememberme.AbstractRemeberMeService;
 import org.maxkey.configuration.ApplicationConfig;
+import org.maxkey.entity.Institutions;
 import org.maxkey.entity.UserInfo;
 import org.maxkey.password.onetimepwd.AbstractOtpAuthn;
 import org.maxkey.password.onetimepwd.OtpAuthnService;
@@ -84,8 +85,11 @@ public class RealmAuthenticationProvider extends AbstractAuthenticationProvider
         //jwtTokenValid(j_jwtToken);
 
         authTypeValid(loginCredential.getAuthType());
-
-        captchaValid(loginCredential.getCaptcha(),loginCredential.getAuthType());
+        
+        Institutions inst = (Institutions)WebContext.getAttribute(WebConstants.CURRENT_INST);
+        if(inst.getCaptcha().equalsIgnoreCase("YES")) {
+        	captchaValid(loginCredential.getCaptcha(),loginCredential.getAuthType());
+        }
 
         emptyPasswordValid(loginCredential.getPassword());
 

+ 13 - 61
maxkey-core/src/main/java/org/maxkey/configuration/LoginConfig.java

@@ -22,19 +22,10 @@ import org.springframework.context.annotation.Configuration;
 
 @Configuration
 public class LoginConfig {
-    @Value("${maxkey.login.captcha}")
-    boolean captcha;
-    
-    //验证码类型 text 文本 , arithmetic算术验证码
-    @Value("${maxkey.login.captcha.type:text}")
-    String captchaType;
     
     @Value("${maxkey.login.mfa}")
     boolean mfa;
     
-    @Value("${maxkey.login.socialsignon}")
-    boolean socialSignOn;
-    
     @Value("${maxkey.login.kerberos}")
     boolean kerberos;
     
@@ -43,9 +34,6 @@ public class LoginConfig {
     
     @Value("${maxkey.login.wsfederation}")
     boolean wsFederation;
-    
-    @Value("${maxkey.login.default.uri}")
-    String defaultUri;
 
     /**
      *  .
@@ -53,21 +41,7 @@ public class LoginConfig {
     public LoginConfig() {
     }
 
-    public boolean isCaptcha() {
-        return captcha;
-    }
-
-    public void setCaptcha(boolean captcha) {
-        this.captcha = captcha;
-    }
-
-    public boolean isSocialSignOn() {
-        return socialSignOn;
-    }
 
-    public void setSocialSignOn(boolean socialSignOn) {
-        this.socialSignOn = socialSignOn;
-    }
 
     public boolean isKerberos() {
         return kerberos;
@@ -85,13 +59,7 @@ public class LoginConfig {
         this.mfa = mfa;
     }
 
-    public String getDefaultUri() {
-        return defaultUri;
-    }
 
-    public void setDefaultUri(String defaultUri) {
-        this.defaultUri = defaultUri;
-    }
 
     public boolean isRemeberMe() {
         return remeberMe;
@@ -109,35 +77,19 @@ public class LoginConfig {
         this.wsFederation = wsFederation;
     }
     
-    public String getCaptchaType() {
-        return captchaType;
-    }
-
-    public void setCaptchaType(String captchaType) {
-        this.captchaType = captchaType;
-    }
-
     @Override
-    public String toString() {
-        StringBuilder builder = new StringBuilder();
-        builder.append("LoginConfig [captcha=");
-        builder.append(captcha);
-        builder.append(", captchaType=");
-        builder.append(captchaType);
-        builder.append(", mfa=");
-        builder.append(mfa);
-        builder.append(", socialSignOn=");
-        builder.append(socialSignOn);
-        builder.append(", kerberos=");
-        builder.append(kerberos);
-        builder.append(", remeberMe=");
-        builder.append(remeberMe);
-        builder.append(", wsFederation=");
-        builder.append(wsFederation);
-        builder.append(", defaultUri=");
-        builder.append(defaultUri);
-        builder.append("]");
-        return builder.toString();
-    }
+	public String toString() {
+		StringBuilder builder = new StringBuilder();
+		builder.append("LoginConfig [mfa=");
+		builder.append(mfa);
+		builder.append(", kerberos=");
+		builder.append(kerberos);
+		builder.append(", remeberMe=");
+		builder.append(remeberMe);
+		builder.append(", wsFederation=");
+		builder.append(wsFederation);
+		builder.append("]");
+		return builder.toString();
+	}
 
 }

+ 44 - 8
maxkey-core/src/main/java/org/maxkey/entity/Institutions.java

@@ -44,14 +44,6 @@ public class Institutions extends JpaBaseEntity implements Serializable {
 	@Column
 	private String fullName;
 	@Column
-	private String logo;
-	@Column
-	private String title;
-	@Column
-	private String consoleTitle;
-	@Column
-	private String domain;
-	@Column
     private String division;
     @Column
     private String country;
@@ -76,8 +68,25 @@ public class Institutions extends JpaBaseEntity implements Serializable {
     
     @Column
     private String description;
+    
     @Column
     private int status;
+    
+	@Column
+	private String logo;
+	@Column
+	private String title;
+	@Column
+	private String consoleTitle;
+	@Column
+	private String domain;
+    @Column
+    private String captcha;
+    @Column
+    private String captchaSupport;
+    @Column
+    private String defaultUri;
+    
     @Column
     String createdBy;
     @Column
@@ -236,6 +245,33 @@ public class Institutions extends JpaBaseEntity implements Serializable {
 	public void setModifiedDate(String modifiedDate) {
 		this.modifiedDate = modifiedDate;
 	}
+	
+	
+	public String getCaptcha() {
+		return captcha;
+	}
+	public void setCaptcha(String captcha) {
+		this.captcha = captcha;
+	}
+
+	public String getCaptchaSupport() {
+		return captchaSupport;
+	}
+	
+	public boolean isCaptchaSupport() {
+		return (captchaSupport !=null && captchaSupport.equalsIgnoreCase("YES") ? true : false);
+	}
+	
+	
+	public void setCaptchaSupport(String captchaSupport) {
+		this.captchaSupport = captchaSupport;
+	}
+	public String getDefaultUri() {
+		return defaultUri;
+	}
+	public void setDefaultUri(String defaultUri) {
+		this.defaultUri = defaultUri;
+	}
 	@Override
 	public String toString() {
 		StringBuilder builder = new StringBuilder();

+ 3 - 0
maxkey-core/src/main/java/org/maxkey/persistence/repository/InstitutionsRepository.java

@@ -104,6 +104,9 @@ public class InstitutionsRepository {
         	institution.setDomain(rs.getString("domain"));
         	institution.setTitle(rs.getString("title"));
         	institution.setConsoleTitle(rs.getString("consoletitle"));
+        	institution.setCaptcha(rs.getString("captcha"));
+        	institution.setCaptchaSupport(rs.getString("CaptchaSupport"));
+        	institution.setDefaultUri(rs.getString("DefaultUri"));
             return institution;
         }
     }

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

@@ -56,36 +56,36 @@ public class SocialSignOnListController {
 	public ModelAndView forwardUpdate() {
 		
 		ModelAndView modelAndView=new ModelAndView("social/socialSignOnProvider");
-		if(applicationConfig.getLoginConfig().isSocialSignOn()){
-			Institutions inst = (Institutions)WebContext.getAttribute(WebConstants.CURRENT_INST);
-			List<SocialsProvider>  listSocialSignOnProvider = 
-									socialSignOnProviderService.loadSocialsProviders(inst.getId()).getSocialSignOnProviders();
-			
-			SocialsAssociate socialSignOnUser=new SocialsAssociate();
-			socialSignOnUser.setUserId(WebContext.getUserInfo().getId());
-			List<SocialsAssociate>  listSocialSignOnUserToken= socialSignOnUserService.query(socialSignOnUser);
-			List<SocialsProvider>  listBindSocialSignOnProvider=new ArrayList<SocialsProvider>();
-			_logger.debug("list SocialSignOnProvider : "+listSocialSignOnProvider);
-			_logger.debug("list SocialSignOnUserToken : "+listSocialSignOnUserToken);
-			for (SocialsProvider ssop : listSocialSignOnProvider){
-				SocialsProvider socialSignOnProvider=new SocialsProvider();
-				socialSignOnProvider.setProvider(ssop.getProvider());
-				socialSignOnProvider.setProviderName(ssop.getProviderName());
-				socialSignOnProvider.setIcon(ssop.getIcon());
-				socialSignOnProvider.setSortOrder(ssop.getSortOrder());
-				for(SocialsAssociate ssout :listSocialSignOnUserToken){
-					if(ssout.getProvider().equals(ssop.getProvider())){
-						socialSignOnProvider.setUserBind(true);
-						socialSignOnProvider.setBindTime(ssout.getCreatedDate());
-						socialSignOnProvider.setLastLoginTime(ssout.getUpdatedDate());
-						_logger.debug("binded provider : "+ssout.getProvider());
-					}
+
+		Institutions inst = (Institutions)WebContext.getAttribute(WebConstants.CURRENT_INST);
+		List<SocialsProvider>  listSocialSignOnProvider = 
+								socialSignOnProviderService.loadSocialsProviders(inst.getId()).getSocialSignOnProviders();
+		
+		SocialsAssociate socialSignOnUser=new SocialsAssociate();
+		socialSignOnUser.setUserId(WebContext.getUserInfo().getId());
+		List<SocialsAssociate>  listSocialSignOnUserToken= socialSignOnUserService.query(socialSignOnUser);
+		List<SocialsProvider>  listBindSocialSignOnProvider=new ArrayList<SocialsProvider>();
+		_logger.debug("list SocialSignOnProvider : "+listSocialSignOnProvider);
+		_logger.debug("list SocialSignOnUserToken : "+listSocialSignOnUserToken);
+		for (SocialsProvider ssop : listSocialSignOnProvider){
+			SocialsProvider socialSignOnProvider=new SocialsProvider();
+			socialSignOnProvider.setProvider(ssop.getProvider());
+			socialSignOnProvider.setProviderName(ssop.getProviderName());
+			socialSignOnProvider.setIcon(ssop.getIcon());
+			socialSignOnProvider.setSortOrder(ssop.getSortOrder());
+			for(SocialsAssociate ssout :listSocialSignOnUserToken){
+				if(ssout.getProvider().equals(ssop.getProvider())){
+					socialSignOnProvider.setUserBind(true);
+					socialSignOnProvider.setBindTime(ssout.getCreatedDate());
+					socialSignOnProvider.setLastLoginTime(ssout.getUpdatedDate());
+					_logger.debug("binded provider : "+ssout.getProvider());
 				}
-				listBindSocialSignOnProvider.add(socialSignOnProvider);
 			}
-			
-			modelAndView.addObject("listSocialSignOnProvider", listBindSocialSignOnProvider);
+			listBindSocialSignOnProvider.add(socialSignOnProvider);
 		}
+		
+		modelAndView.addObject("listSocialSignOnProvider", listBindSocialSignOnProvider);
+		
 		return modelAndView;
 	}
 	

+ 5 - 2
maxkey-webs/maxkey-web-maxkey/src/main/java/org/maxkey/web/endpoint/IndexEndpoint.java

@@ -24,6 +24,8 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import org.maxkey.configuration.ApplicationConfig;
+import org.maxkey.entity.Institutions;
+import org.maxkey.web.WebConstants;
 import org.maxkey.web.WebContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -53,10 +55,11 @@ public class IndexEndpoint {
 	public ModelAndView forwardindex(HttpServletRequest request,
             HttpServletResponse response) throws ServletException, IOException {
 		_logger.debug("IndexEndpoint /forwardindex.");
-        String defaultUri = applicationConfig.getLoginConfig().getDefaultUri();
+		Institutions inst = (Institutions)WebContext.getAttribute(WebConstants.CURRENT_INST);
+        String defaultUri = inst.getDefaultUri();
         if (defaultUri != null && !defaultUri.equals("")) {
             _logger.debug("defaultUri " + defaultUri);
-            return WebContext.redirect(applicationConfig.getLoginConfig().getDefaultUri());
+            return WebContext.redirect(defaultUri);
         }
         _logger.debug("Uri /appList");
 		return  new ModelAndView("/appList");

+ 4 - 6
maxkey-webs/maxkey-web-maxkey/src/main/java/org/maxkey/web/endpoint/LoginEndpoint.java

@@ -122,15 +122,13 @@ public class LoginEndpoint {
 		if( applicationConfig.getLoginConfig().isKerberos()){
 			modelAndView.addObject("userDomainUrlJson", kerberosService.buildKerberosProxys());
 		}
-		modelAndView.addObject("isCaptcha", applicationConfig.getLoginConfig().isCaptcha());
+		Institutions inst = (Institutions)WebContext.getAttribute(WebConstants.CURRENT_INST);
+		modelAndView.addObject("isCaptcha", inst.isCaptchaSupport());
+		modelAndView.addObject("captcha", inst.getCaptcha());
 		modelAndView.addObject("sessionid", WebContext.getSession().getId());
 		//modelAndView.addObject("jwtToken",jwtLoginService.buildLoginJwt());
 		//load Social Sign On Providers
-		if(applicationConfig.getLoginConfig().isSocialSignOn()){
-			_logger.trace("Load Social Sign On Providers ");
-			Institutions inst = (Institutions)WebContext.getAttribute(WebConstants.CURRENT_INST);
-			modelAndView.addObject("sspLogin", socialSignOnProviderService.loadSocialsProviders(inst.getId()));
-		}
+		modelAndView.addObject("sspLogin", socialSignOnProviderService.loadSocialsProviders(inst.getId()));
 		
 		Object loginErrorMessage=WebContext.getAttribute(WebConstants.LOGIN_ERROR_SESSION_MESSAGE);
         modelAndView.addObject("loginErrorMessage", loginErrorMessage==null?"":loginErrorMessage);

+ 1 - 6
maxkey-webs/maxkey-web-maxkey/src/main/resources/application-http.properties

@@ -48,10 +48,6 @@ maxkey.app.issuer                               =CN=ConSec,CN=COM,CN=SH
 ############################################################################
 #Login configuration                                                       #
 ############################################################################
-#enable captcha
-maxkey.login.captcha                            =${LOGIN_CAPTCHA:true}
-#text or arithmetic
-maxkey.login.captcha.type                       =${LOGIN_CAPTCHA_TYPE:text}
 #enable two factor,use one time password
 maxkey.login.mfa                                =${LOGIN_MFA_ENABLED:true}
 #TimeBasedOtpAuthn MailOtpAuthn SmsOtpAuthnYunxin SmsOtpAuthnAliyun SmsOtpAuthnTencentCloud
@@ -69,8 +65,7 @@ maxkey.login.remeberme.validity                 =0
 #JWT support
 maxkey.login.jwt                                =${LOGIN_JWT:true}
 maxkey.login.jwt.issuer                         =${LOGIN_JWT_ISSUER:${maxkey.server.authz.uri}}
-#to default application web site            
-maxkey.login.default.uri                        =appList
+#whitelist       
 maxkey.ipaddress.whitelist                      =false
 #notices show
 maxkey.notices.visible                          =false

+ 1 - 6
maxkey-webs/maxkey-web-maxkey/src/main/resources/application-https.properties

@@ -49,10 +49,6 @@ maxkey.app.issuer                               =CN=ConSec,CN=COM,CN=SH
 ############################################################################
 #Login configuration                                                       #
 ############################################################################
-#enable captcha
-maxkey.login.captcha                            =${LOGIN_CAPTCHA:true}
-#text or arithmetic
-maxkey.login.captcha.type                       =${LOGIN_CAPTCHA_TYPE:text}
 #enable two factor,use one time password
 maxkey.login.mfa                                =${LOGIN_MFA_ENABLED:true}
 #TimeBasedOtpAuthn MailOtpAuthn SmsOtpAuthnYunxin SmsOtpAuthnAliyun SmsOtpAuthnTencentCloud
@@ -70,8 +66,7 @@ maxkey.login.remeberme.validity                 =0
 #JWT support
 maxkey.login.jwt                                =${LOGIN_JWT:true}
 maxkey.login.jwt.issuer                         =${LOGIN_JWT_ISSUER:${maxkey.server.authz.uri}}
-#to default application web site            
-maxkey.login.default.uri                        =appList
+#whitelist
 maxkey.ipaddress.whitelist                      =false
 #notices show
 maxkey.notices.visible                          =false

+ 1 - 1
maxkey-webs/maxkey-web-maxkey/src/main/resources/templates/views/loginnormal.ftl

@@ -38,7 +38,7 @@
                 	<div class="input-group" >
                 	   <i class="fa fa-lock fa-2" ></i>
 					   <input required="" class="form-control "  type='text' id="j_captcha" name="captcha"  tabindex="3"  value="" style="float: left;"  placeholder='<@locale code="login.text.captcha"/>'/>
-					   <img id="j_captchaimg" class="captcha-image" src="<@base/>/captcha"/>
+					   <img id="j_captchaimg" class="captcha-image" src="<@base/>/captcha?captcha=${captcha}"/>
 				    </div >
 				</div >
 			</td>

+ 4 - 1
maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/endpoint/LoginEndpoint.java

@@ -20,6 +20,7 @@ package org.maxkey.web.endpoint;
 import org.maxkey.authn.AbstractAuthenticationProvider;
 import org.maxkey.authn.LoginCredential;
 import org.maxkey.configuration.ApplicationConfig;
+import org.maxkey.entity.Institutions;
 import org.maxkey.web.WebConstants;
 import org.maxkey.web.WebContext;
 import org.slf4j.Logger;
@@ -64,8 +65,10 @@ public class LoginEndpoint {
 		}
 		
 		ModelAndView modelAndView = new ModelAndView();
+		Institutions inst = (Institutions)WebContext.getAttribute(WebConstants.CURRENT_INST);
 		modelAndView.addObject("isRemeberMe", applicationConfig.getLoginConfig().isRemeberMe());
-		modelAndView.addObject("isCaptcha", applicationConfig.getLoginConfig().isCaptcha());
+		modelAndView.addObject("isCaptcha", inst.isCaptchaSupport());
+		modelAndView.addObject("captcha", inst.getCaptcha());
 		modelAndView.addObject("sessionid", WebContext.getSession().getId());
 		Object loginErrorMessage=WebContext.getAttribute(WebConstants.LOGIN_ERROR_SESSION_MESSAGE);
         modelAndView.addObject("loginErrorMessage", loginErrorMessage==null?"":loginErrorMessage);

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

@@ -43,14 +43,8 @@ maxkey.server.message.queue                     =${SERVER_MESSAGE_QUEUE:none}
 ############################################################################
 #Login configuration                                                       #
 ############################################################################
-#enable captcha
-maxkey.login.captcha                            =${LOGIN_CAPTCHA:true}
-#text or arithmetic
-maxkey.login.captcha.type                       =${LOGIN_CAPTCHA_TYPE:text}
 #enable two factor,use one time password
 maxkey.login.mfa                                =false
-#enable social sign on
-maxkey.login.socialsignon                       =false
 #Enable kerberos/SPNEGO
 maxkey.login.kerberos                           =false
 #wsFederation
@@ -59,9 +53,6 @@ maxkey.login.wsfederation                       =false
 maxkey.login.remeberme                          =false
 #validity
 maxkey.login.remeberme.validity                 =0
-#default.uri
-#to appList page
-maxkey.login.default.uri                        =appList
 #ipaddress whitelist
 maxkey.ipaddress.whitelist                      =false
 #JWT support

+ 12 - 4
maxkey-webs/maxkey-web-mgt/src/main/resources/messages/message.properties

@@ -504,10 +504,6 @@ synchronizers.syncStartTime=\u533A\u95F4
 
 institutions.name=\u7B80\u79F0
 institutions.fullName=\u5168\u79F0
-institutions.logo=\u56FE\u6807
-institutions.title=\u7CFB\u7EDF\u540D\u79F0
-institutions.consoleTitle=\u63A7\u5236\u53F0\u540D\u79F0
-institutions.domain=\u57DF\u540D
 institutions.division=\u5206\u652F\u673A\u6784
 institutions.contact=\u8054\u7CFB\u4EBA
 institutions.phone=\u7535\u8BDD
@@ -520,6 +516,17 @@ institutions.street=\u8857\u9053
 institutions.address=\u5730\u5740
 institutions.postalcode=\u90AE\u7F16
 
+institutions.logo=\u56FE\u6807
+institutions.title=\u7CFB\u7EDF\u540D\u79F0
+institutions.consoleTitle=\u63A7\u5236\u53F0\u540D\u79F0
+institutions.domain=\u57DF\u540D
+institutions.captchaSupport=\u9A8C\u8BC1\u7801\u652F\u6301
+institutions.captcha=\u9A8C\u8BC1\u7801
+institutions.captcha.type=\u9A8C\u8BC1\u7801\u7C7B\u578B
+institutions.captcha.type.text=\u6570\u5B57
+institutions.captcha.type.arithmetic=\u7B97\u672F
+institutions.default.uri=\u9ED8\u8BA4\u5730\u5740
+
 localization.property=\u5C5E\u6027
 localization.langZh=\u4E2D\u6587
 localization.langEn=\u82F1\u6587
@@ -680,6 +687,7 @@ navs.resources=\u8D44\u6E90\u7BA1\u7406
 navs.adapters=\u9002\u914D\u5668\u6CE8\u518C
 navs.notices=\u901A\u77E5\u516C\u544A
 navs.institutions=\u673A\u6784\u914D\u7F6E
+navs.institutions.system=\u7CFB\u7EDF\u4FE1\u606F
 navs.socials.provider=\u793E\u4EA4\u670D\u52A1
 navs.synchronizers=\u540C\u6B65\u5668\u7BA1\u7406
 navs.ldapcontext=LDAP\u914D\u7F6E

+ 12 - 4
maxkey-webs/maxkey-web-mgt/src/main/resources/messages/message_en.properties

@@ -512,10 +512,6 @@ synchronizers.syncStartTime=During
 
 institutions.name=name
 institutions.fullName=fullName
-institutions.logo=logo
-institutions.title=Title
-institutions.consoleTitle=ConsoleTitle
-institutions.domain=domainName
 institutions.division=division
 institutions.contact=contact
 institutions.phone=phone
@@ -528,6 +524,17 @@ institutions.street=street
 institutions.address=address
 institutions.postalcode=postalcode
 
+institutions.logo=logo
+institutions.title=Title
+institutions.consoleTitle=ConsoleTitle
+institutions.domain=domainName
+institutions.captchaSupport=captchaSupport
+institutions.captcha=captcha
+institutions.captcha.type=captchaType
+institutions.captcha.type.text=Numeral
+institutions.captcha.type.arithmetic=Arithmetic
+institutions.default.uri=defaultUri
+
 localization.property=Property
 localization.langZh=Chinese
 localization.langEn=English
@@ -688,6 +695,7 @@ navs.resources=Resources
 navs.adapters=Adapters
 navs.notices=Notices
 navs.institutions=Institutions
+navs.institutions.system=System
 navs.socials.provider=SocialsProvider
 navs.synchronizers=Synchronizers
 navs.ldapcontext=LdapContext

+ 13 - 4
maxkey-webs/maxkey-web-mgt/src/main/resources/messages/message_zh_CN.properties

@@ -503,10 +503,7 @@ synchronizers.syncStartTime=\u533A\u95F4
 
 institutions.name=\u7B80\u79F0
 institutions.fullName=\u5168\u79F0
-institutions.logo=\u56FE\u6807
-institutions.title=\u7CFB\u7EDF\u540D\u79F0
-institutions.consoleTitle=\u63A7\u5236\u53F0\u540D\u79F0
-institutions.domain=\u57DF\u540D
+
 institutions.division=\u5206\u652F\u673A\u6784
 institutions.contact=\u8054\u7CFB\u4EBA
 institutions.phone=\u7535\u8BDD
@@ -519,6 +516,17 @@ institutions.street=\u8857\u9053
 institutions.address=\u5730\u5740
 institutions.postalcode=\u90AE\u7F16
 
+institutions.logo=\u56FE\u6807
+institutions.title=\u7CFB\u7EDF\u540D\u79F0
+institutions.consoleTitle=\u63A7\u5236\u53F0\u540D\u79F0
+institutions.domain=\u57DF\u540D
+institutions.captchaSupport=\u9A8C\u8BC1\u7801\u652F\u6301
+institutions.captcha=\u9A8C\u8BC1\u7801
+institutions.captcha.type=\u9A8C\u8BC1\u7801\u7C7B\u578B
+institutions.captcha.type.text=\u6570\u5B57
+institutions.captcha.type.arithmetic=\u7B97\u672F
+institutions.default.uri=\u9ED8\u8BA4\u5730\u5740
+
 localization.property=\u5C5E\u6027
 localization.langZh=\u4E2D\u6587
 localization.langEn=\u82F1\u6587
@@ -679,6 +687,7 @@ navs.resources=\u8D44\u6E90\u7BA1\u7406
 navs.adapters=\u9002\u914D\u5668\u6CE8\u518C
 navs.notices=\u901A\u77E5\u516C\u544A
 navs.institutions=\u673A\u6784\u914D\u7F6E
+navs.institutions.system=\u7CFB\u7EDF\u4FE1\u606F
 navs.socials.provider=\u793E\u4EA4\u670D\u52A1
 navs.synchronizers=\u540C\u6B65\u5668\u7BA1\u7406
 navs.ldapcontext=LDAP\u914D\u7F6E

+ 215 - 171
maxkey-webs/maxkey-web-mgt/src/main/resources/templates/views/institutions/updateInstitutions.ftl

@@ -33,215 +33,259 @@
 		</div>
 		<div class="container-fluid">
 			<div class="content-wrapper row">
-			<div class="col-12 grid-margin">
-				<div class="card">
-					<div class="card-header border-bottom">
-						<h4 class="card-title"><@locale code="navs.institutions"/></h4>
-					</div>
-					<div class="card-body">
-								<form  method="post" type="label" validate="true" action="<@base/>/institutions/update" id="actionForm"   class="needs-validation" novalidate>
+				<div class="col-12 grid-margin">
+					<div class="card">
+						<div class="card-header border-bottom">
+							<h4 class="card-title"><@locale code="navs.institutions"/></h4>
+						</div>
+						<form  method="post" type="label" validate="true" action="<@base/>/institutions/update" id="actionForm"   class="needs-validation" novalidate>
+                                        
+						<div class="card-body">
 									<div class="row mb-3">
-										<div class="col-md-6">
-											<div class="form-group row">
-												<label class="col-sm-3 col-form-label"><@locale code="institutions.name" /></label>
-												<div class="col-sm-9">
-													<input id="id" name="id" type="hidden" value="${model.id!}"/>
-						   							<input  required="" class="form-control" type="text" id="name" name="name"  value="${model.name!}" />
+											<div class="col-md-6">
+												<div class="form-group row">
+													<label class="col-sm-3 col-form-label"><@locale code="institutions.name" /></label>
+													<div class="col-sm-9">
+														<input id="id" name="id" type="hidden" value="${model.id!}"/>
+							   							<input  required="" class="form-control" type="text" id="name" name="name"  value="${model.name!}" />
+													</div>
 												</div>
 											</div>
-										</div>
-										<div class="col-md-6">
-											<div class="form-group row">
-												<label class="col-sm-3 col-form-label"><@locale code="institutions.fullName" /></label>
-												<div class="col-sm-9">
-													<input required=""  class="form-control" type="text" id="fullName" name="fullName" value="${model.fullName!}" />
+											<div class="col-md-6">
+												<div class="form-group row">
+													<label class="col-sm-3 col-form-label"><@locale code="institutions.fullName" /></label>
+													<div class="col-sm-9">
+														<input required=""  class="form-control" type="text" id="fullName" name="fullName" value="${model.fullName!}" />
+													</div>
 												</div>
 											</div>
 										</div>
-									</div>
-									<div class="row mb-3">
-                                        <div class="col-md-6">
-                                            <div class="form-group row">
-                                                <label class="col-sm-3 col-form-label"><@locale code="institutions.title" /></label>
-                                                <div class="col-sm-7">
-                                                    <input  required="" class="form-control" type="text" id="title" name="title"  value="${model.title!}" />
-                                                    
-                                                </div>
-                                                <div class="col-sm-2">
-                                                    <input class="button btn btn-primary mr-3 window" type="button" value="<@locale code="common.text.locale"/>" 
-                                                        wurl="<@base/>/localization/forward/global.title"
-                                                        wwidth="650"
-                                                        wheight="200"
-                                                        target="window"> 
-                                                </div>
-                                            </div>
-                                        </div>
-                                        <div class="col-md-6">
-                                            <div class="form-group row">
-                                                <label class="col-sm-3 col-form-label"><@locale code="institutions.consoleTitle" /></label>
-                                                <div class="col-sm-7">
-                                                    <input  required="" class="form-control" type="text" id="consoleTitle" name="consoleTitle" value="${model.consoleTitle!}" />
-                                                </div>
-                                                <div class="col-sm-2">
-                                                    <input class="button btn btn-primary mr-3 window" type="button" value="<@locale code="common.text.locale"/>" 
-                                                        wurl="<@base/>/localization/forward/global.consoleTitle"
-                                                        wwidth="650"
-                                                        wheight="200"
-                                                        target="window"> 
-                                                </div>
-                                            </div>
-                                        </div>
-                                    </div>
-									<div class="row mb-3">
-										<div class="col-md-6">
-											<div class="form-group row">
-												<label class="col-sm-3 col-form-label"><@locale code="institutions.logo" /></label>
-												<div class="col-sm-9">
-													<input  required="" class="form-control" type="text" id="logo" name="logo"  value="${model.logo!}" />
+										<div class="row mb-3">
+											<div class="col-md-6">
+												<div class="form-group row">
+													<label class="col-sm-3 col-form-label"><@locale code="institutions.division" /></label>
+													<div class="col-sm-9">
+														<input   class="form-control" type="text" id="division" name="division" value="${model.division!}"/>
+													</div>
 												</div>
 											</div>
-										</div>
-										<div class="col-md-6">
-											<div class="form-group row">
-												<label class="col-sm-3 col-form-label"><@locale code="institutions.domain" /></label>
-												<div class="col-sm-9">
-													<input  required="" class="form-control" type="text" id="domain" name="domain" value="${model.domain!}" />
+											<div class="col-md-6">
+												<div class="form-group row">
+													<label class="col-sm-3"><@locale code="institutions.contact" /></label>
+													<div class="col-sm-9">
+														<input    class="form-control" type="text" id="contact" name="contact"  value="${model.contact!}" />
+													</div>
 												</div>
 											</div>
 										</div>
-									</div>
-									<div class="row mb-3">
-										<div class="col-md-6">
-											<div class="form-group row">
-												<label class="col-sm-3 col-form-label"><@locale code="institutions.division" /></label>
-												<div class="col-sm-9">
-													<input   class="form-control" type="text" id="division" name="division" value="${model.division!}"/>
+										<div class="row mb-3">
+											<div class="col-md-6">
+												<div class="form-group row">
+													<label class="col-sm-3 col-form-label"><@locale code="institutions.phone" /></label>
+													<div class="col-sm-9">
+														<input   class="form-control" type="text" id="phone" name="phone" value="${model.phone!}" />
+													</div>
 												</div>
 											</div>
+											
+											<div class="col-md-6">
+												<div class="form-group row">
+	                                                <label class="col-sm-3 col-form-label"><@locale code="institutions.email" /></label>
+	                                                <div class="col-sm-9">
+	                                                    <input   class="form-control" type="text" id="email" name="email" value="${model.email!}" />
+	                                                </div>
+	                                            </div>
+											</div>
 										</div>
-										<div class="col-md-6">
-											<div class="form-group row">
-												<label class="col-sm-3"><@locale code="institutions.contact" /></label>
-												<div class="col-sm-9">
-													<input    class="form-control" type="text" id="contact" name="contact"  value="${model.contact!}" />
-												</div>
+										<div class="row mb-3">
+											<div class="col-md-6">
+												<div class="form-group row">
+	                                                
+	                                                <label class="col-sm-3 col-form-label"><@locale code="institutions.fax" /></label>
+	                                                <div class="col-sm-9">
+	                                                    <input   class="form-control" type="text" id="fax" name="fax" value="${model.fax!}" />
+	                                                </div>
+	                                            </div>
+											</div>
+											<div class="col-md-6">
+												<div class="form-group row">
+	                                                <label class="col-sm-3 col-form-label"><@locale code="institutions.postalcode" /></label>
+	                                                <div class="col-sm-9">
+	                                                    <input   class="form-control" type="text" id="postalCode" name="postalCode"  value="${model.postalCode!}" />
+	                                                </div>
+	                                            </div>
 											</div>
 										</div>
-									</div>
-									<div class="row mb-3">
-										<div class="col-md-6">
-											<div class="form-group row">
-												<label class="col-sm-3 col-form-label"><@locale code="institutions.phone" /></label>
-												<div class="col-sm-9">
-													<input   class="form-control" type="text" id="phone" name="phone" value="${model.phone!}" />
+										<div class="row mb-3">
+											<div class="col-md-6">
+												<div class="form-group row">
+	                                                <label class="col-sm-3 col-form-label"><@locale code="institutions.country" /></label>
+	                                                <div class="col-sm-9">
+	                                                    <input   class="form-control" type="text" id="country" name="country" value="${model.country!}" />
+	                                                </div>
+	                                            </div>
+											</div>
+											<div class="col-md-6">
+												<div class="form-group row">
+	                                                
+	                                                <label class="col-sm-3 col-form-label"><@locale code="institutions.region" /></label>
+	                                                <div class="col-sm-9">
+	                                                    <input   class="form-control" type="text" id="region" name="region" value="${model.region!}" />
+	                                                </div>
+	                                            </div>
+											</div>
+										</div>
+										<div class="row mb-3">
+											<div class="col-md-6">
+												<div class="form-group row">
+	                                                
+	                                                <label class="col-sm-3 col-form-label"><@locale code="institutions.locality" /></label>
+	                                                <div class="col-sm-9">
+	                                                    <input  class="form-control" type="text" id="locality" name="locality" value="${model.locality!}" />
+	                                                </div>
+	                                            </div>
+											</div>
+											<div class="col-md-6">
+												<div class="form-group row">
+	                                                <label class="col-sm-3 col-form-label"><@locale code="institutions.street" /></label>
+	                                                <div class="col-sm-9">
+	                                                    <input   class="form-control" type="text" id="street" name="street" value="${model.street!}" />
+	                                                </div>
+	                                            </div>
+											</div>
+										</div>
+										<div class="row mb-3">
+											<div class="col-md-12">
+	                                            <div class="form-group row">
+	                                                <div class="col-sm-2">
+													    <label class="col-form-label"><@locale code="institutions.address" /></label>
+													</div>
+													<div class="col-sm-10">
+														<input   class="form-control" type="text" id="address" name="address"  value="${model.address!}" />
+													</div>
 												</div>
 											</div>
 										</div>
+	                                    <div class="row mb-3">
+	                                        <div class="col-md-12">
+	                                            <div class="form-group row">
+	                                                <div class="col-sm-2">
+	                                                    <label class="col-form-label"><@locale code="common.text.description" /></label>
+	                                                </div>
+	                                                <div class="col-sm-10">
+	                                                    <input   class="form-control" type="text" id="description" name="description"  value="${model.description!}" />
+	                                                </div>
+	                                            </div>
+	                                        </div>
+	                                    </div>
 										
-										<div class="col-md-6">
-											<div class="form-group row">
-                                                <label class="col-sm-3 col-form-label"><@locale code="institutions.email" /></label>
-                                                <div class="col-sm-9">
-                                                    <input   class="form-control" type="text" id="email" name="email" value="${model.email!}" />
+								</div>
+						<div class="card-header border-bottom">
+	                        <h4 class="card-title"><@locale code="navs.institutions.system"/></h4>
+	                    </div>
+	                   <div class="card-body">
+                                   
+                                        <div class="row mb-3">
+                                            <div class="col-md-6">
+                                                <div class="form-group row">
+                                                    <label class="col-sm-3 col-form-label"><@locale code="institutions.title" /></label>
+                                                    <div class="col-sm-7">
+                                                        <input  required="" class="form-control" type="text" id="title" name="title"  value="${model.title!}" />
+                                                        
+                                                    </div>
+                                                    <div class="col-sm-2">
+                                                        <input class="button btn btn-primary mr-3 window" type="button" value="<@locale code="common.text.locale"/>" 
+                                                            wurl="<@base/>/localization/forward/global.title"
+                                                            wwidth="650"
+                                                            wheight="200"
+                                                            target="window"> 
+                                                    </div>
                                                 </div>
                                             </div>
-										</div>
-									</div>
-									<div class="row mb-3">
-										<div class="col-md-6">
-											<div class="form-group row">
-                                                
-                                                <label class="col-sm-3 col-form-label"><@locale code="institutions.fax" /></label>
-                                                <div class="col-sm-9">
-                                                    <input   class="form-control" type="text" id="fax" name="fax" value="${model.fax!}" />
+                                            <div class="col-md-6">
+                                                <div class="form-group row">
+                                                    <label class="col-sm-3 col-form-label"><@locale code="institutions.consoleTitle" /></label>
+                                                    <div class="col-sm-7">
+                                                        <input  required="" class="form-control" type="text" id="consoleTitle" name="consoleTitle" value="${model.consoleTitle!}" />
+                                                    </div>
+                                                    <div class="col-sm-2">
+                                                        <input class="button btn btn-primary mr-3 window" type="button" value="<@locale code="common.text.locale"/>" 
+                                                            wurl="<@base/>/localization/forward/global.consoleTitle"
+                                                            wwidth="650"
+                                                            wheight="200"
+                                                            target="window"> 
+                                                    </div>
                                                 </div>
                                             </div>
-										</div>
-										<div class="col-md-6">
-											<div class="form-group row">
-                                                <label class="col-sm-3 col-form-label"><@locale code="institutions.postalcode" /></label>
-                                                <div class="col-sm-9">
-                                                    <input   class="form-control" type="text" id="postalCode" name="postalCode"  value="${model.postalCode!}" />
+                                        </div>
+                                        <div class="row mb-3">
+                                            <div class="col-md-6">
+                                                <div class="form-group row">
+                                                    <label class="col-sm-3 col-form-label"><@locale code="institutions.logo" /></label>
+                                                    <div class="col-sm-9">
+                                                        <input  required="" class="form-control" type="text" id="logo" name="logo"  value="${model.logo!}" />
+                                                    </div>
                                                 </div>
                                             </div>
-										</div>
-									</div>
-									<div class="row mb-3">
-										<div class="col-md-6">
-											<div class="form-group row">
-                                                <label class="col-sm-3 col-form-label"><@locale code="institutions.country" /></label>
-                                                <div class="col-sm-9">
-                                                    <input   class="form-control" type="text" id="country" name="country" value="${model.country!}" />
+                                            <div class="col-md-6">
+                                                <div class="form-group row">
+                                                    <label class="col-sm-3 col-form-label"><@locale code="institutions.domain" /></label>
+                                                    <div class="col-sm-9">
+                                                        <input  required="" class="form-control" type="text" id="domain" name="domain" value="${model.domain!}" />
+                                                    </div>
                                                 </div>
                                             </div>
-										</div>
-										<div class="col-md-6">
-											<div class="form-group row">
-                                                
-                                                <label class="col-sm-3 col-form-label"><@locale code="institutions.region" /></label>
-                                                <div class="col-sm-9">
-                                                    <input   class="form-control" type="text" id="region" name="region" value="${model.region!}" />
+                                        </div>
+                                        <div class="row mb-3">
+                                            <div class="col-md-6">
+                                                <div class="form-group row">
+                                                    <label class="col-sm-3 col-form-label"><@locale code="institutions.captchaSupport" /></label>
+                                                    <div class="col-sm-9">
+                                                        <select  id="captchaSupport" name="captchaSupport" class="form-control  form-select" >
+								                            <option value="YES" <#if 'YES'==model.captchaSupport!>selected</#if>><@locale code="common.text.yes"/></option>
+								                            <option value="NO" <#if 'NO'==model.captchaSupport!>selected</#if>><@locale code="common.text.no"/></option>
+								                          </select>
+                                                    </div>
                                                 </div>
                                             </div>
-										</div>
-									</div>
-									<div class="row mb-3">
-										<div class="col-md-6">
-											<div class="form-group row">
-                                                
-                                                <label class="col-sm-3 col-form-label"><@locale code="institutions.locality" /></label>
-                                                <div class="col-sm-9">
-                                                    <input  class="form-control" type="text" id="locality" name="locality" value="${model.locality!}" />
+                                            <div class="col-md-6">
+                                                <div class="form-group row">
+                                                    <label class="col-sm-3"><@locale code="institutions.captcha.type" /></label>
+                                                    <div class="col-sm-9">
+                                                        <select  id="captcha" name="captcha" class="form-control  form-select" >
+                                                            <option value="TEXT" <#if 'none'==model.captcha!>selected</#if>><@locale code="institutions.captcha.type.text"/></option>
+                                                            <option value="ARITHMETIC" <#if 'https'==model.captcha!>selected</#if>><@locale code="institutions.captcha.type.arithmetic"/></option>
+                                                        </select>
+                                                    </div>
                                                 </div>
                                             </div>
-										</div>
-										<div class="col-md-6">
-											<div class="form-group row">
-                                                <label class="col-sm-3 col-form-label"><@locale code="institutions.street" /></label>
-                                                <div class="col-sm-9">
-                                                    <input   class="form-control" type="text" id="street" name="street" value="${model.street!}" />
+                                        </div>
+                                        
+                                        <div class="row mb-3">
+                                            <div class="col-md-12">
+                                                <div class="form-group row">
+                                                    <div class="col-sm-2">
+                                                        <label class="col-form-label"><@locale code="institutions.default.uri" /></label>
+                                                    </div>
+                                                    <div class="col-sm-10">
+                                                        <input   class="form-control" type="text" id="defaultUri" name="defaultUri"  value="${model.description!}" />
+                                                    </div>
                                                 </div>
                                             </div>
-										</div>
-									</div>
-									<div class="row mb-3">
-										<div class="col-md-12">
-                                            <div class="form-group row">
-                                                <div class="col-sm-2">
-												    <label class="col-form-label"><@locale code="institutions.address" /></label>
-												</div>
-												<div class="col-sm-10">
-													<input   class="form-control" type="text" id="address" name="address"  value="${model.address!}" />
-												</div>
-											</div>
-										</div>
-									</div>
-                                    <div class="row mb-3">
-                                        <div class="col-md-12">
-                                            <div class="form-group row">
-                                                <div class="col-sm-2">
-                                                    <label class="col-form-label"><@locale code="common.text.description" /></label>
-                                                </div>
-                                                <div class="col-sm-10">
-                                                    <input   class="form-control" type="text" id="description" name="description"  value="${model.description!}" />
-                                                </div>
+                                        </div>
+                                        <div class="row">
+                                            <div class="col-md-4"></div>
+                                            <div class="col-md-4">
+                                                  <input   class="form-control" type="hidden" id="status" name="status"  value="1" />
+                                                <button type="submit" class="button btn-primary btn btn-common btn-block mr-3"    id="submitBtn" ><@locale code="button.text.save" /></button>
                                             </div>
+                                            <div class="col-md-4"></div>
                                         </div>
-                                    </div>
-									<div class="row">
-										<div class="col-md-4"></div>
-										<div class="col-md-4">
-										      <input   class="form-control" type="hidden" id="status" name="status"  value="1" />
-											<button type="submit" class="button btn-primary btn btn-common btn-block mr-3"    id="submitBtn" ><@locale code="button.text.save" /></button>
-										</div>
-										<div class="col-md-4"></div>
-									</div>
-									
-								</form>
-							</div>
-						</div>
+                                </div>
+                            </form>
 					</div>
 				</div>
+		  </div>
 					<footer class="content-footer">
 		<#include  "../layout/footer.ftl"/>
 	</footer>

+ 1 - 1
maxkey-webs/maxkey-web-mgt/src/main/resources/templates/views/login.ftl

@@ -38,7 +38,7 @@
 								    <div class="input-group">
                                         <span class="input-group-text fa fa-shield d-flex justify-content-center"></span>
                                         <input id="j_captcha" name="captcha" class="form-control" value="" type="text" required="" placeholder="<@locale code="login.text.captcha"/>"> 
-                                        <img id="j_captchaimg" class="captcha-image" src="<@base/>/captcha" />
+                                        <img id="j_captchaimg" class="captcha-image" src="<@base/>/captcha?captcha=${captcha}" />
                                     </div>
 									
 								</div>

+ 2 - 1
maxkey-webs/maxkey-web-resources/src/main/resources/static/javascript/platform.common.js

@@ -29,9 +29,10 @@ $(function(){
         });
     });
     
+    var captchaImageUrl = $('.captcha-image').attr("src");
 	//on captcha image click ,new a captcha code
 	$('.captcha-image').click(function () {//
-		$(this).attr("src", webContextPath + "/captcha?"+(new Date()).getTime()); 
+		$(this).attr("src", captchaImageUrl+"&"+(new Date()).getTime()); 
 	});
     
     //passwdeye