diff --git a/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/authentication/mobile/package-info.java b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/authentication/mobile/package-info.java new file mode 100644 index 0000000..3f042c1 --- /dev/null +++ b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/authentication/mobile/package-info.java @@ -0,0 +1 @@ +package com.micro.fast.security.core.authentication.mobile; \ No newline at end of file diff --git a/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/browser/package-info.java b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/browser/package-info.java new file mode 100644 index 0000000..dbca955 --- /dev/null +++ b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/browser/package-info.java @@ -0,0 +1 @@ +package com.micro.fast.security.core.browser; \ No newline at end of file diff --git a/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/master/package-info.java b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/master/package-info.java new file mode 100644 index 0000000..7f6fda1 --- /dev/null +++ b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/master/package-info.java @@ -0,0 +1 @@ +package com.micro.fast.security.core.master; \ No newline at end of file diff --git a/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/SocialConfig.java b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/SocialConfig.java new file mode 100644 index 0000000..a5ed117 --- /dev/null +++ b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/SocialConfig.java @@ -0,0 +1,33 @@ +package com.micro.fast.security.core.social; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.crypto.encrypt.Encryptors; +import org.springframework.social.config.annotation.EnableSocial; +import org.springframework.social.config.annotation.SocialConfigurerAdapter; +import org.springframework.social.connect.ConnectionFactoryLocator; +import org.springframework.social.connect.UsersConnectionRepository; +import org.springframework.social.connect.jdbc.JdbcUsersConnectionRepository; + +import javax.sql.DataSource; + +@Configuration +@EnableSocial +public class SocialConfig extends SocialConfigurerAdapter{ + + @Autowired + @Qualifier("dynamicDataSource") + private DataSource dataSource; + + /** + * + * @param connectionFactoryLocator + * @return + */ + @Override + public UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) { + //第三参数是加解密的策略,这里指定是不做加解密操作 + return new JdbcUsersConnectionRepository(dataSource,connectionFactoryLocator, Encryptors.noOpText()); + } +} diff --git a/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/package-info.java b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/package-info.java new file mode 100644 index 0000000..c9ee14c --- /dev/null +++ b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/package-info.java @@ -0,0 +1 @@ +package com.micro.fast.security.core.social; \ No newline at end of file diff --git a/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/qq/api/QQ.java b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/qq/api/QQ.java new file mode 100644 index 0000000..c556b46 --- /dev/null +++ b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/qq/api/QQ.java @@ -0,0 +1,13 @@ +package com.micro.fast.security.core.social.qq.api; + +/** + * + * @author lsy + */ +public interface QQ { + /** + * 获取qq用户的信息 + * @return + */ + QQUserInfo getQQUserInfo() ; +} diff --git a/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/qq/api/QQUserInfo.java b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/qq/api/QQUserInfo.java new file mode 100644 index 0000000..fe65103 --- /dev/null +++ b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/qq/api/QQUserInfo.java @@ -0,0 +1,160 @@ +package com.micro.fast.security.core.social.qq.api; + +/** + * @author lsy + */ +public class QQUserInfo { + + /** + * ret : 0 + * msg : + * nickname : Peter + * figureurl : http://qzapp.qlogo.cn/qzapp/111111/942FEA70050EEAFBD4DCE2C1FC775E56/30 + * figureurl_1 : http://qzapp.qlogo.cn/qzapp/111111/942FEA70050EEAFBD4DCE2C1FC775E56/50 + * figureurl_2 : http://qzapp.qlogo.cn/qzapp/111111/942FEA70050EEAFBD4DCE2C1FC775E56/100 + * figureurl_qq_1 : http://q.qlogo.cn/qqapp/100312990/DE1931D5330620DBD07FB4A5422917B6/40 + * figureurl_qq_2 : http://q.qlogo.cn/qqapp/100312990/DE1931D5330620DBD07FB4A5422917B6/100 + * gender : 男 + * is_yellow_vip : 1 + * vip : 1 + * yellow_vip_level : 7 + * level : 7 + * is_yellow_year_vip : 1 + */ + + private int ret; + private String openId; + private String msg; + private String nickname; + private String figureurl; + private String figureurl_1; + private String figureurl_2; + private String figureurl_qq_1; + private String figureurl_qq_2; + private String gender; + private String is_yellow_vip; + private String vip; + private String yellow_vip_level; + private String level; + private String is_yellow_year_vip; + + public int getRet() { + return ret; + } + + public void setRet(int ret) { + this.ret = ret; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public String getFigureurl() { + return figureurl; + } + + public void setFigureurl(String figureurl) { + this.figureurl = figureurl; + } + + public String getFigureurl_1() { + return figureurl_1; + } + + public void setFigureurl_1(String figureurl_1) { + this.figureurl_1 = figureurl_1; + } + + public String getFigureurl_2() { + return figureurl_2; + } + + public void setFigureurl_2(String figureurl_2) { + this.figureurl_2 = figureurl_2; + } + + public String getFigureurl_qq_1() { + return figureurl_qq_1; + } + + public void setFigureurl_qq_1(String figureurl_qq_1) { + this.figureurl_qq_1 = figureurl_qq_1; + } + + public String getFigureurl_qq_2() { + return figureurl_qq_2; + } + + public void setFigureurl_qq_2(String figureurl_qq_2) { + this.figureurl_qq_2 = figureurl_qq_2; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public String getIs_yellow_vip() { + return is_yellow_vip; + } + + public void setIs_yellow_vip(String is_yellow_vip) { + this.is_yellow_vip = is_yellow_vip; + } + + public String getVip() { + return vip; + } + + public void setVip(String vip) { + this.vip = vip; + } + + public String getYellow_vip_level() { + return yellow_vip_level; + } + + public void setYellow_vip_level(String yellow_vip_level) { + this.yellow_vip_level = yellow_vip_level; + } + + public String getLevel() { + return level; + } + + public void setLevel(String level) { + this.level = level; + } + + public String getIs_yellow_year_vip() { + return is_yellow_year_vip; + } + + public String getOpenId() { + return openId; + } + + public void setOpenId(String openId) { + this.openId = openId; + } + + public void setIs_yellow_year_vip(String is_yellow_year_vip) { + this.is_yellow_year_vip = is_yellow_year_vip; + } +} diff --git a/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/qq/api/impl/QQImpl.java b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/qq/api/impl/QQImpl.java new file mode 100644 index 0000000..b226343 --- /dev/null +++ b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/qq/api/impl/QQImpl.java @@ -0,0 +1,64 @@ +package com.micro.fast.security.core.social.qq.api.impl; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.micro.fast.security.core.social.qq.api.QQUserInfo; +import com.micro.fast.security.core.social.qq.api.QQ; +import org.apache.commons.lang3.StringUtils; +import org.springframework.social.oauth2.AbstractOAuth2ApiBinding; +import org.springframework.social.oauth2.TokenStrategy; + +import java.io.IOException; + +/** + * 获取qq用户信息的实现类 + * @author lsy + */ +public class QQImpl extends AbstractOAuth2ApiBinding implements QQ { + + /** + * 获取用户openId的字符串 + */ + public static final String URL_GET_OPENID = "https://graph.qq.com/oauth2.0/me?access_token=%s"; + + /** + * 获取qq用户信息的字符串 + */ + public static final String URL_GET_USERINFO = "https://graph.qq.com/user/get_user_info?oauth_consumer_key=%s&openid=%s"; + + /** + * 系统在qq互联注册的id + */ + private String appId; + + /** + * qq用户的id + */ + private String openId; + + private ObjectMapper objectMapper = new ObjectMapper(); + + public QQImpl(String accessToken,String appId){ + //将accessToken放在请求的url中 + super(accessToken, TokenStrategy.ACCESS_TOKEN_PARAMETER); + this.appId = appId; + //使用accessToken获取用户的openId + String url = String.format(URL_GET_OPENID,accessToken); + String result = getRestTemplate().getForObject(url, String.class); + System.out.println(result); + this.openId = StringUtils.substringBetween(result,"\"openid\":","}"); + } + + @Override + public QQUserInfo getQQUserInfo() { + //获取qq用户的信息对象 + String url = String.format(URL_GET_USERINFO, appId, openId); + String result = getRestTemplate().getForObject(url, String.class); + QQUserInfo qqUserInfo = null; + try { + qqUserInfo = objectMapper.readValue(result, QQUserInfo.class); + } catch (IOException e) { + throw new RuntimeException("获取用户信息失败"); + } + return qqUserInfo; + } +} diff --git a/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/qq/connet/QQAdapter.java b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/qq/connet/QQAdapter.java new file mode 100644 index 0000000..d3bd094 --- /dev/null +++ b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/qq/connet/QQAdapter.java @@ -0,0 +1,63 @@ +package com.micro.fast.security.core.social.qq.connet; + +import com.micro.fast.security.core.social.qq.api.QQ; +import com.micro.fast.security.core.social.qq.api.QQUserInfo; +import org.springframework.social.connect.ApiAdapter; +import org.springframework.social.connect.ConnectionValues; +import org.springframework.social.connect.UserProfile; + +/** + * @author lsy + */ +public class QQAdapter implements ApiAdapter { + + /** + * 测试当前的qqApi是否可用 + * @param qq + * @return + */ + @Override + public boolean test(QQ qq) { + //默认qq第三方登录永久可用 + return true; + } + + + /** + * 设置用户的连接信息 + * @param qq + * @param connectionValues + */ + @Override + public void setConnectionValues(QQ qq, ConnectionValues connectionValues) { + QQUserInfo qqUserInfo = qq.getQQUserInfo(); + //设置用户的昵称 + connectionValues.setDisplayName(qqUserInfo.getNickname()); + //qq用户40*40的头像 + connectionValues.setImageUrl(qqUserInfo.getFigureurl_qq_1()); + //设置用户的主页 + connectionValues.setProfileUrl(null); + //服务商提供的用户的id + connectionValues.setProviderUserId(qqUserInfo.getOpenId()); + } + + /** + * + * @param qq + * @return + */ + @Override + public UserProfile fetchUserProfile(QQ qq) { + return null; + } + + /** + * qq没有此功能 + * @param qq + * @param s + */ + @Override + public void updateStatus(QQ qq, String s) { + //do nothing + } +} diff --git a/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/qq/connet/QQConnectionFactory.java b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/qq/connet/QQConnectionFactory.java new file mode 100644 index 0000000..ee3ee72 --- /dev/null +++ b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/qq/connet/QQConnectionFactory.java @@ -0,0 +1,17 @@ +package com.micro.fast.security.core.social.qq.connet; + +import com.micro.fast.security.core.social.qq.api.QQ; +import org.springframework.social.connect.support.OAuth2ConnectionFactory; + +public class QQConnectionFactory extends OAuth2ConnectionFactory { + /** + * 使用连接工厂创建连接 + * @param providerId + * @param appId + * @param appSecret + */ + public QQConnectionFactory(String providerId + ,String appId,String appSecret) { + super(providerId,new QQServiceProvider(appId,appSecret),new QQAdapter()); + } +} diff --git a/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/qq/connet/QQServiceProvider.java b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/qq/connet/QQServiceProvider.java new file mode 100644 index 0000000..a57d613 --- /dev/null +++ b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/qq/connet/QQServiceProvider.java @@ -0,0 +1,48 @@ +package com.micro.fast.security.core.social.qq.connet; + +import com.micro.fast.security.core.social.qq.api.QQ; +import com.micro.fast.security.core.social.qq.api.impl.QQImpl; +import org.springframework.social.oauth2.AbstractOAuth2ServiceProvider; +import org.springframework.social.oauth2.OAuth2Template; + +/** + * 获取QQ用户信息服务的提供方 + * @author lsy + */ +public class QQServiceProvider extends AbstractOAuth2ServiceProvider { + + /** + * qq分配给应用的id + */ + private String appId; + + /** + * 认证服务器地址 + */ + public static final String URL_AUTHORIZE = "https://graph.qq.com/oauth2.0/authorize"; + + /** + * accessToken的获取地址 + */ + public static final String URL_ACCESS_TOKEN = "https://graph.qq.com/oauth2.0/token"; + + /** + * qq互联会给每一个应用分配一个appId和一个appSecret,相当于appd的id和密码 + * @param appId 应用的id + * @param appSecret 应用的密码 + */ + public QQServiceProvider(String appId,String appSecret) { + super(new OAuth2Template(appId,appSecret,URL_AUTHORIZE,URL_ACCESS_TOKEN)); + this.appId = appId; + } + + /** + * 返回获取用户信息的对象 + * @param accessToken 会由抽象类传入 + * @return + */ + @Override + public QQ getApi(String accessToken) { + return new QQImpl(accessToken ,this.appId); + } +}