This commit is contained in:
lsy
2018-01-15 22:32:34 +08:00
parent 4ab580e14f
commit 9ea6b1cd5e
11 changed files with 402 additions and 0 deletions
@@ -0,0 +1 @@
package com.micro.fast.security.core.authentication.mobile;
@@ -0,0 +1 @@
package com.micro.fast.security.core.browser;
@@ -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());
}
}
@@ -0,0 +1,13 @@
package com.micro.fast.security.core.social.qq.api;
/**
*
* @author lsy
*/
public interface QQ {
/**
* 获取qq用户的信息
* @return
*/
QQUserInfo getQQUserInfo() ;
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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<QQ> {
/**
* 测试当前的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
}
}
@@ -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<QQ> {
/**
* 使用连接工厂创建连接
* @param providerId
* @param appId
* @param appSecret
*/
public QQConnectionFactory(String providerId
,String appId,String appSecret) {
super(providerId,new QQServiceProvider(appId,appSecret),new QQAdapter());
}
}
@@ -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> {
/**
* 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);
}
}