From b6d30a8730c5990e4b813d5e99e32a6ef4d007d6 Mon Sep 17 00:00:00 2001 From: MaxKey Date: Fri, 22 Apr 2022 22:00:39 +0800 Subject: [PATCH] kaptcha --- .../code/kaptcha/impl/UniqueTextCreator.java | 27 +++++++++++++++++++ .../src/main/resources/kaptcha.properties | 9 ++++--- .../org/maxkey/authn/jwt/AuthJwtService.java | 5 +++- .../java/org/maxkey/entity/apps/Apps.java | 16 +++++++++-- .../entity/apps/AppsOAuth20Details.java | 1 + .../repository/InstitutionsRepository.java | 20 +++++++++++--- .../maxkey/web/endpoint/LoginEntryPoint.java | 2 +- .../web/contorller/LoginEntryPoint.java | 1 + 8 files changed, 70 insertions(+), 11 deletions(-) create mode 100644 maxkey-authentications/maxkey-authentication-captcha/src/main/java/com/google/code/kaptcha/impl/UniqueTextCreator.java diff --git a/maxkey-authentications/maxkey-authentication-captcha/src/main/java/com/google/code/kaptcha/impl/UniqueTextCreator.java b/maxkey-authentications/maxkey-authentication-captcha/src/main/java/com/google/code/kaptcha/impl/UniqueTextCreator.java new file mode 100644 index 000000000..93555c309 --- /dev/null +++ b/maxkey-authentications/maxkey-authentication-captcha/src/main/java/com/google/code/kaptcha/impl/UniqueTextCreator.java @@ -0,0 +1,27 @@ +package com.google.code.kaptcha.impl; + +import java.util.Random; + +import com.google.code.kaptcha.text.TextProducer; +import com.google.code.kaptcha.util.Configurable; + +public class UniqueTextCreator extends Configurable implements TextProducer{ + + @Override + public String getText() { + int length = getConfig().getTextProducerCharLength(); + char[] chars = getConfig().getTextProducerCharString(); + Random rand = new Random(); + StringBuffer text = new StringBuffer(); + int i = 0; + while ( i < length){ + char word= chars[rand.nextInt(chars.length)]; + if(text.indexOf(word + "") <= -1 ) { + text.append(word); + i++; + } + } + return text.toString(); + } + +} diff --git a/maxkey-authentications/maxkey-authentication-captcha/src/main/resources/kaptcha.properties b/maxkey-authentications/maxkey-authentication-captcha/src/main/resources/kaptcha.properties index 5900c0c70..5112f0876 100644 --- a/maxkey-authentications/maxkey-authentication-captcha/src/main/resources/kaptcha.properties +++ b/maxkey-authentications/maxkey-authentication-captcha/src/main/resources/kaptcha.properties @@ -1,13 +1,14 @@ -kaptcha.image.width=80 +kaptcha.image.width=120 kaptcha.image.height=40 kaptcha.border=no #kaptcha.obscurificator.impl=com.google.code.kaptcha.impl.ShadowGimpy kaptcha.obscurificator.impl=com.google.code.kaptcha.impl.Ripple -kaptcha.textproducer.font.size=23 +kaptcha.textproducer.font.size=30 kaptcha.textproducer.char.string=0123456789 kaptcha.textproducer.char.length=4 -kaptcha.textproducer.char.space=3 +kaptcha.textproducer.char.space=6 #kaptcha.noise.impl=com.google.code.kaptcha.impl.DefaultNoise kaptcha.noise.impl=com.google.code.kaptcha.impl.LightNoise #kaptcha.noise.color=white -kaptcha.word.impl=com.google.code.kaptcha.text.impl.RandomColorWordRenderer \ No newline at end of file +kaptcha.word.impl=com.google.code.kaptcha.text.impl.RandomColorWordRenderer +kaptcha.textproducer.impl=com.google.code.kaptcha.impl.UniqueTextCreator \ No newline at end of file diff --git a/maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/jwt/AuthJwtService.java b/maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/jwt/AuthJwtService.java index d50cc85c3..19653cdfd 100644 --- a/maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/jwt/AuthJwtService.java +++ b/maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/jwt/AuthJwtService.java @@ -65,7 +65,10 @@ public class AuthJwtService { * @return AuthJwt */ public AuthJwt genAuthJwt(Authentication authentication) { - return new AuthJwt(genJwt(authentication), authentication); + if(authentication != null) { + return new AuthJwt(genJwt(authentication), authentication); + } + return null; } /** diff --git a/maxkey-core/src/main/java/org/maxkey/entity/apps/Apps.java b/maxkey-core/src/main/java/org/maxkey/entity/apps/Apps.java index ba123196a..23bd52898 100644 --- a/maxkey-core/src/main/java/org/maxkey/entity/apps/Apps.java +++ b/maxkey-core/src/main/java/org/maxkey/entity/apps/Apps.java @@ -141,6 +141,9 @@ public class Apps extends JpaBaseEntity implements Serializable { @Column private String adapter; + @Column + private String frequently; + @Column protected int sortIndex; @Column @@ -157,7 +160,7 @@ public class Apps extends JpaBaseEntity implements Serializable { protected String description; @Column private String instId; - + private String instName; protected String loginDateTime; @@ -248,7 +251,16 @@ public class Apps extends JpaBaseEntity implements Serializable { this.secret = secret; } - /** + + public String getFrequently() { + return frequently; + } + + public void setFrequently(String frequently) { + this.frequently = frequently; + } + + /** * @return the icon */ public byte[] getIcon() { diff --git a/maxkey-core/src/main/java/org/maxkey/entity/apps/AppsOAuth20Details.java b/maxkey-core/src/main/java/org/maxkey/entity/apps/AppsOAuth20Details.java index fc4ef04ad..80ef5306d 100644 --- a/maxkey-core/src/main/java/org/maxkey/entity/apps/AppsOAuth20Details.java +++ b/maxkey-core/src/main/java/org/maxkey/entity/apps/AppsOAuth20Details.java @@ -106,6 +106,7 @@ public class AppsOAuth20Details extends Apps { this.setAdapter(application.getAdapter()); this.setAdapterId(application.getAdapterId()); this.setAdapterName(application.getAdapterName()); + this.setFrequently(application.getFrequently()); this.clientSecret = baseClientDetails.getClientSecret(); this.scope = StringUtils diff --git a/maxkey-core/src/main/java/org/maxkey/persistence/repository/InstitutionsRepository.java b/maxkey-core/src/main/java/org/maxkey/persistence/repository/InstitutionsRepository.java index 6677d1268..5e56bf576 100644 --- a/maxkey-core/src/main/java/org/maxkey/persistence/repository/InstitutionsRepository.java +++ b/maxkey-core/src/main/java/org/maxkey/persistence/repository/InstitutionsRepository.java @@ -37,6 +37,8 @@ public class InstitutionsRepository { private static final String SELECT_STATEMENT = "select * from mxk_institutions where id = ? or domain = ? " ; + + private static final String DEFAULT_INSTID = "1"; protected static final Cache institutionsStore = Caffeine.newBuilder() @@ -54,7 +56,17 @@ public class InstitutionsRepository { public Institutions get(String instIdOrDomain) { _logger.trace(" instId {}" , instIdOrDomain); - Institutions inst = institutionsStore.getIfPresent(mapper.get(instIdOrDomain)==null ? "1" : mapper.get(instIdOrDomain) ); + Institutions inst = getByInstIdOrDomain(instIdOrDomain); + if(inst == null) {//use default inst + inst = getByInstIdOrDomain(DEFAULT_INSTID); + institutionsStore.put(instIdOrDomain, inst); + } + return inst; + } + + private Institutions getByInstIdOrDomain(String instIdOrDomain) { + _logger.trace(" instId {}" , instIdOrDomain); + Institutions inst = institutionsStore.getIfPresent(mapper.get(instIdOrDomain)==null ? DEFAULT_INSTID : mapper.get(instIdOrDomain) ); if(inst == null) { List institutions = jdbcTemplate.query(SELECT_STATEMENT,new InstitutionsRowMapper(),instIdOrDomain,instIdOrDomain); @@ -62,8 +74,10 @@ public class InstitutionsRepository { if (institutions != null && institutions.size() > 0) { inst = institutions.get(0); } - institutionsStore.put(inst.getDomain(), inst); - mapper.put(inst.getId(), inst.getDomain()); + if(inst != null ) { + institutionsStore.put(inst.getDomain(), inst); + mapper.put(inst.getId(), inst.getDomain()); + } } return inst; diff --git a/maxkey-webs/maxkey-web-maxkey/src/main/java/org/maxkey/web/endpoint/LoginEntryPoint.java b/maxkey-webs/maxkey-web-maxkey/src/main/java/org/maxkey/web/endpoint/LoginEntryPoint.java index 2f596ecc6..642cfd0c1 100644 --- a/maxkey-webs/maxkey-web-maxkey/src/main/java/org/maxkey/web/endpoint/LoginEntryPoint.java +++ b/maxkey-webs/maxkey-web-maxkey/src/main/java/org/maxkey/web/endpoint/LoginEntryPoint.java @@ -155,7 +155,7 @@ public class LoginEntryPoint { String authType = loginCredential.getAuthType(); _logger.debug("Login AuthN Type " + authType); if (StringUtils.isNotBlank(authType)){ - Authentication authentication = authenticationProvider.doAuthenticate(loginCredential); + Authentication authentication = authenticationProvider.authenticate(loginCredential); if(authentication != null) { authJwtMessage = new Message(authJwtService.genAuthJwt(authentication)); } diff --git a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/contorller/LoginEntryPoint.java b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/contorller/LoginEntryPoint.java index e52dd2b63..bcba1c54f 100644 --- a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/contorller/LoginEntryPoint.java +++ b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/contorller/LoginEntryPoint.java @@ -45,6 +45,7 @@ import org.springframework.http.MediaType; * */ @Controller +@RequestMapping(value = "/login") public class LoginEntryPoint { private static Logger _logger = LoggerFactory.getLogger(LoginEntryPoint.class);