社交账号关联调整及优化

社交账号关联调整及优化
This commit is contained in:
shimingxy 2020-05-31 10:20:47 +08:00
parent 777a5c6574
commit 4c8635d062
8 changed files with 127 additions and 115 deletions

View File

@ -5,12 +5,12 @@
*(MAXKEY-200604) 修复用户组访问权限删除问题 *(MAXKEY-200604) 修复用户组访问权限删除问题
*(MAXKEY-200605) Javascript验证及AJAX提交优化 *(MAXKEY-200605) Javascript验证及AJAX提交优化
*(MAXKEY-200606) DAO层整合 *(MAXKEY-200606) DAO层整合
*(MAXKEY-200607) 社交账号关联调整 *(MAXKEY-200607) 社交账号关联调整及优化
*(MAXKEY-200608) 数据库表字段的注释修复 *(MAXKEY-200608) 数据库表字段的注释修复
*(MAXKEY-200609) 官方网站优化 *(MAXKEY-200609) 官方网站优化
*(MAXKEY-200610) properties优化 *(MAXKEY-200610) properties优化
*(MAXKEY-200611) 访问控制修复,访问重定向的问题修复 *(MAXKEY-200611) 访问控制修复,访问重定向的问题修复
*(MAXKEY-200607) 依赖jar升级,消除非必要依赖 *(MAXKEY-200612) 依赖jar升级,消除非必要依赖
spring 5.2.6.RELEASE spring 5.2.6.RELEASE
springBoot 2.3.0.RELEASE springBoot 2.3.0.RELEASE
springSecurity 5.3.2.RELEASE springSecurity 5.3.2.RELEASE

View File

@ -19,7 +19,7 @@
<h3>认证配置</h3> <h3>认证配置</h3>
文件 文件
maxkey/config/applicationConfig.properties maxkey/maxkey.properties
<pre><code class="ini hljs"> <pre><code class="ini hljs">
#enable social sign on #enable social sign on
@ -40,25 +40,13 @@ config.socialsignon.sinaweibo.account.id=id
config.socialsignon.sinaweibo.sortorder=1 config.socialsignon.sinaweibo.sortorder=1
</code></pre> </code></pre>
配置maxkey/spring/maxkey.xml 配置maxkey/maxkey.properties
<pre><code class="xml hljs"> <pre><code class="ini hljs">
&lt;bean id="socialSignOnWeibo" class="org.maxkey.authn.support.socialsignon.service.SocialSignOnProvider"&gt; #enable social sign on
&lt;property name="provider" value="${config.socialsignon.sinaweibo.provider}"/&gt; config.login.socialsignon=true
&lt;property name="providerName" value="${config.socialsignon.sinaweibo.provider.name}"/&gt; #social sign on providers
&lt;property name="icon" value="${config.socialsignon.sinaweibo.icon}"/&gt; config.login.socialsignon.providers=sinaweibo,google,qq,dingtalk,microsoft,facebook
&lt;property name="clientId" value="${config.socialsignon.sinaweibo.client.id}"/&gt;
&lt;property name="clientSecret" value="${config.socialsignon.sinaweibo.client.secret}"/&gt;
&lt;property name="sortOrder" value="${config.socialsignon.sinaweibo.sortorder}"/&gt;
&lt;/bean&gt;
&lt;bean id="socialSignOnProviderService" class="org.maxkey.authn.support.socialsignon.service.SocialSignOnProviderService"&gt;
&lt;property name="socialSignOnProviders" &gt;
&lt;list&gt;
&lt;ref bean="socialSignOnWeibo" /&gt;
&lt;/list&gt;
&lt;/property&gt;
&lt;/bean&gt;
</code></pre> </code></pre>
<h3>账号绑定</h3> <h3>账号绑定</h3>

View File

@ -2,7 +2,6 @@ package org.maxkey.persistence.db;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import org.maxkey.domain.PasswordPolicy; import org.maxkey.domain.PasswordPolicy;
import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.RowMapper;

View File

@ -2,7 +2,6 @@ package org.maxkey.persistence.db;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import org.maxkey.domain.UserInfo; import org.maxkey.domain.UserInfo;
import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.RowMapper;

View File

@ -1,10 +1,7 @@
package org.maxkey; package org.maxkey;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Properties;
import org.apache.catalina.Context; import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector; import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection; import org.apache.tomcat.util.descriptor.web.SecurityCollection;
@ -17,9 +14,6 @@ import org.maxkey.authn.realm.activedirectory.ActiveDirectoryAuthenticationRealm
import org.maxkey.authn.realm.activedirectory.ActiveDirectoryServer; import org.maxkey.authn.realm.activedirectory.ActiveDirectoryServer;
import org.maxkey.authn.support.kerberos.KerberosProxy; import org.maxkey.authn.support.kerberos.KerberosProxy;
import org.maxkey.authn.support.kerberos.RemoteKerberosService; import org.maxkey.authn.support.kerberos.RemoteKerberosService;
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.authz.oauth2.provider.endpoint.TokenEndpointAuthenticationFilter; import org.maxkey.authz.oauth2.provider.endpoint.TokenEndpointAuthenticationFilter;
import org.maxkey.constants.ConstantsProperties; import org.maxkey.constants.ConstantsProperties;
import org.maxkey.crypto.password.opt.algorithm.KeyUriFormat; import org.maxkey.crypto.password.opt.algorithm.KeyUriFormat;
@ -34,16 +28,12 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
import org.springframework.context.annotation.PropertySource; import org.springframework.context.annotation.PropertySource;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.JdbcTemplate;
@ -69,8 +59,7 @@ import org.springframework.jdbc.core.JdbcTemplate;
"org.maxkey.authz.exapi.endpoint", "org.maxkey.authz.exapi.endpoint",
"org.maxkey.authz.formbased.endpoint", "org.maxkey.authz.formbased.endpoint",
"org.maxkey.authz.ltpa.endpoint", "org.maxkey.authz.ltpa.endpoint",
"org.maxkey.authz.token.endpoint", "org.maxkey.authz.token.endpoint"
"org.maxkey.web.authentication.support.socialsignon"
}) })
public class MaxKeyConfig implements InitializingBean { public class MaxKeyConfig implements InitializingBean {
private static final Logger _logger = LoggerFactory.getLogger(MaxKeyConfig.class); private static final Logger _logger = LoggerFactory.getLogger(MaxKeyConfig.class);
@ -239,45 +228,7 @@ public class MaxKeyConfig implements InitializingBean {
return kerberosService; return kerberosService;
} }
@Bean(name = "socialSignOnProviderService")
@ConditionalOnClass(SocialSignOnProvider.class)
public SocialSignOnProviderService socialSignOnProviderService() throws IOException {
SocialSignOnProviderService socialSignOnProviderService = new SocialSignOnProviderService();
Resource resource = new ClassPathResource(
ConstantsProperties.classPathResource(ConstantsProperties.classPathResource(ConstantsProperties.maxKeyPropertySource)));
Properties properties = new Properties();
properties.load(resource.getInputStream());
String [] providerList =properties.get("config.login.socialsignon.providers").toString().split(",");
List<SocialSignOnProvider> socialSignOnProviderList = new ArrayList<SocialSignOnProvider>();
for(String provider : providerList) {
String providerName = properties.getProperty("config.socialsignon."+provider+".provider.name");
String icon=properties.getProperty("config.socialsignon."+provider+".icon");
String clientId=properties.getProperty("config.socialsignon."+provider+".client.id");
String clientSecret=properties.getProperty("config.socialsignon."+provider+".client.secret");
String sortOrder = properties.getProperty("config.socialsignon."+provider+".sortorder");
SocialSignOnProvider socialSignOnProvider = new SocialSignOnProvider();
socialSignOnProvider.setProvider(provider);
socialSignOnProvider.setProviderName(providerName);
socialSignOnProvider.setIcon(icon);
socialSignOnProvider.setClientId(clientId);
socialSignOnProvider.setClientSecret(clientSecret);
socialSignOnProvider.setSortOrder(Integer.valueOf(sortOrder));
_logger.debug("socialSignOnProvider " + socialSignOnProvider);
socialSignOnProviderList.add(socialSignOnProvider);
}
socialSignOnProviderService.setSocialSignOnProviders(socialSignOnProviderList);
_logger.debug("SocialSignOnProviderService inited.");
return socialSignOnProviderService;
}
@Bean(name = "socialsAssociateService")
public JdbcSocialsAssociateService socialsAssociateService(
JdbcTemplate jdbcTemplate) {
JdbcSocialsAssociateService socialsAssociateService = new JdbcSocialsAssociateService(jdbcTemplate);
_logger.debug("JdbcSocialsAssociateService inited.");
return socialsAssociateService;
}
@Override @Override
public void afterPropertiesSet() throws Exception { public void afterPropertiesSet() throws Exception {

View File

@ -0,0 +1,78 @@
package org.maxkey.autoconfigure;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
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.constants.ConstantsProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
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.context.annotation.PropertySource;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.jdbc.core.JdbcTemplate;
@Configuration
@ComponentScan(basePackages = {
"org.maxkey.authn.support.socialsignon"
})
@PropertySource(ConstantsProperties.maxKeyPropertySource)
public class SocialSignOnAutoConfiguration implements InitializingBean {
private static final Logger _logger = LoggerFactory.getLogger(SocialSignOnAutoConfiguration.class);
@Bean(name = "socialSignOnProviderService")
@ConditionalOnClass(SocialSignOnProvider.class)
public SocialSignOnProviderService socialSignOnProviderService() throws IOException {
SocialSignOnProviderService socialSignOnProviderService = new SocialSignOnProviderService();
Resource resource = new ClassPathResource(
ConstantsProperties.classPathResource(ConstantsProperties.classPathResource(ConstantsProperties.maxKeyPropertySource)));
Properties properties = new Properties();
properties.load(resource.getInputStream());
String [] providerList =properties.get("config.login.socialsignon.providers").toString().split(",");
List<SocialSignOnProvider> socialSignOnProviderList = new ArrayList<SocialSignOnProvider>();
for(String provider : providerList) {
String providerName = properties.getProperty("config.socialsignon."+provider+".provider.name");
String icon=properties.getProperty("config.socialsignon."+provider+".icon");
String clientId=properties.getProperty("config.socialsignon."+provider+".client.id");
String clientSecret=properties.getProperty("config.socialsignon."+provider+".client.secret");
String sortOrder = properties.getProperty("config.socialsignon."+provider+".sortorder");
SocialSignOnProvider socialSignOnProvider = new SocialSignOnProvider();
socialSignOnProvider.setProvider(provider);
socialSignOnProvider.setProviderName(providerName);
socialSignOnProvider.setIcon(icon);
socialSignOnProvider.setClientId(clientId);
socialSignOnProvider.setClientSecret(clientSecret);
socialSignOnProvider.setSortOrder(Integer.valueOf(sortOrder));
_logger.debug("socialSignOnProvider " + socialSignOnProvider);
socialSignOnProviderList.add(socialSignOnProvider);
}
socialSignOnProviderService.setSocialSignOnProviders(socialSignOnProviderList);
_logger.debug("SocialSignOnProviderService inited.");
return socialSignOnProviderService;
}
@Bean(name = "socialsAssociateService")
public JdbcSocialsAssociateService socialsAssociateService(
JdbcTemplate jdbcTemplate) {
JdbcSocialsAssociateService socialsAssociateService = new JdbcSocialsAssociateService(jdbcTemplate);
_logger.debug("JdbcSocialsAssociateService inited.");
return socialsAssociateService;
}
@Override
public void afterPropertiesSet() throws Exception {
// TODO Auto-generated method stub
}
}

View File

@ -7,4 +7,5 @@ org.maxkey.autoconfigure.RedisAutoConfiguration,\
org.maxkey.autoconfigure.CasAutoConfiguration,\ org.maxkey.autoconfigure.CasAutoConfiguration,\
org.maxkey.autoconfigure.Oauth20AutoConfiguration,\ org.maxkey.autoconfigure.Oauth20AutoConfiguration,\
org.maxkey.autoconfigure.Saml20AutoConfiguration,\ org.maxkey.autoconfigure.Saml20AutoConfiguration,\
org.maxkey.autoconfigure.SocialSignOnAutoConfiguration,\
org.maxkey.MaxKeyMvcConfig org.maxkey.MaxKeyMvcConfig

View File

@ -58,11 +58,8 @@ config.support.kerberos.default.redirecturi=http://sso.maxkey.org/kerberos/authn
############################################################################ ############################################################################
# HTTPHEADER Login configuration # HTTPHEADER Login configuration
############################################################################ ############################################################################
config.support.httpheader.enable=false config.support.httpheader.enable=false
config.support.httpheader.headername=header-user config.support.httpheader.headername=header-user
# iv-user is for IBM Security Access Manager # iv-user is for IBM Security Access Manager
#config.httpheader.headername=iv-user #config.httpheader.headername=iv-user
@ -94,12 +91,48 @@ config.support.wsfederation.logoutUrl=https://adfs.maxkey.org/adfs/ls/?wa=wsigno
############################################################################# #############################################################################
############################################################################# #############################################################################
# OIDC V1.0 METADATA configuration
config.oidc.metadata.issuer=${config.server.name}/maxkey config.oidc.metadata.issuer=${config.server.name}/maxkey
config.oidc.metadata.authorizationEndpoint=${config.server.name}/maxkey/oauth/v20/authorize config.oidc.metadata.authorizationEndpoint=${config.server.name}/maxkey/oauth/v20/authorize
config.oidc.metadata.tokenEndpoint=${config.server.name}/maxkey/oauth/v20/token config.oidc.metadata.tokenEndpoint=${config.server.name}/maxkey/oauth/v20/token
config.oidc.metadata.userinfoEndpoint=${config.server.name}/maxkey/api/connect/userinfo config.oidc.metadata.userinfoEndpoint=${config.server.name}/maxkey/api/connect/userinfo
#############################################################################
#############################################################################
# SAML V2.0 configuration
#saml common
config.saml.v20.max.parser.pool.size=2
config.saml.v20.assertion.validity.time.ins.seconds=90
config.saml.v20.replay.cache.life.in.millis=14400000
config.saml.v20.issue.instant.check.clock.skew.in.seconds=90
config.saml.v20.issue.instant.check.validity.time.in.seconds=300
#saml idp keystore
config.saml.v20.idp.keystore.password=maxkey
config.saml.v20.idp.keystore.private.key.password=maxkey
config.saml.v20.idp.keystore=classpath\:config/samlServerKeystore.jks
#keystore id for sec
config.saml.v20.idp.issuing.entity.id=maxkey.org
config.saml.v20.idp.issuer=https://sso.maxkey.org/maxkey/saml
config.saml.v20.idp.receiver.endpoint=https\://sso.maxkey.org/
#saml sp keystore
config.saml.v20.sp.keystore.password=maxkey
config.saml.v20.sp.keystore.private.key.password=maxkey
config.saml.v20.sp.keystore=classpath\:config/samlClientKeystore.jks
config.saml.v20.sp.issuing.entity.id=client.maxkey.org
#Saml v20 METADATA
config.saml.v20.metadata.orgName=maxkey
config.saml.v20.metadata.orgDisplayName=maxkey
config.saml.v20.metadata.orgURL=https://github.com/shimingxy/MaxKey
config.saml.v20.metadata.contactType=technical
config.saml.v20.metadata.company=maxkey
config.saml.v20.metadata.givenName=maxkey
config.saml.v20.metadata.surName=maxkey
config.saml.v20.metadata.emailAddress=shimingxy@163.com
config.saml.v20.metadata.telephoneNumber=4008981111
############################################################################ ############################################################################
# Social Sign On Configuration # # Social Sign On Configuration #
@ -160,40 +193,3 @@ config.socialsignon.facebook.client.id=appKey
config.socialsignon.facebook.client.secret=appSecret config.socialsignon.facebook.client.secret=appSecret
config.socialsignon.facebook.account.id=id config.socialsignon.facebook.account.id=id
config.socialsignon.facebook.sortorder=7 config.socialsignon.facebook.sortorder=7
############################################################################
# SAML V2.0 configuration
#saml common
config.saml.v20.max.parser.pool.size=2
config.saml.v20.assertion.validity.time.ins.seconds=90
config.saml.v20.replay.cache.life.in.millis=14400000
config.saml.v20.issue.instant.check.clock.skew.in.seconds=90
config.saml.v20.issue.instant.check.validity.time.in.seconds=300
#saml idp keystore
config.saml.v20.idp.keystore.password=maxkey
config.saml.v20.idp.keystore.private.key.password=maxkey
config.saml.v20.idp.keystore=classpath\:config/samlServerKeystore.jks
#keystore id for sec
config.saml.v20.idp.issuing.entity.id=maxkey.org
config.saml.v20.idp.issuer=https://sso.maxkey.org/maxkey/saml
config.saml.v20.idp.receiver.endpoint=https\://sso.maxkey.org/
#saml sp keystore
config.saml.v20.sp.keystore.password=maxkey
config.saml.v20.sp.keystore.private.key.password=maxkey
config.saml.v20.sp.keystore=classpath\:config/samlClientKeystore.jks
config.saml.v20.sp.issuing.entity.id=client.maxkey.org
#Saml v20 Metadata
config.saml.v20.metadata.orgName=maxkey
config.saml.v20.metadata.orgDisplayName=maxkey
config.saml.v20.metadata.orgURL=https://github.com/shimingxy/MaxKey
config.saml.v20.metadata.contactType=technical
config.saml.v20.metadata.company=maxkey
config.saml.v20.metadata.givenName=maxkey
config.saml.v20.metadata.surName=maxkey
config.saml.v20.metadata.emailAddress=shimingxy@163.com
config.saml.v20.metadata.telephoneNumber=4008981111