Spring Social流程

短命女 2022-05-09 07:38 263阅读 0赞

在这里插入图片描述

自定义 处理content-type text/html

  1. public class QQOAuth2Template extends OAuth2Template {
  2. private Logger logger = LoggerFactory.getLogger(getClass());
  3. public QQOAuth2Template(String clientId, String clientSecret, String authorizeUrl, String accessTokenUrl) {
  4. super(clientId, clientSecret, authorizeUrl, accessTokenUrl);
  5. setUseParametersForClientAuthentication(true);
  6. }
  7. /* (non-Javadoc)
  8. * @see org.springframework.social.oauth2.OAuth2Template#postForAccessGrant(java.lang.String, org.springframework.util.MultiValueMap)
  9. */
  10. @Override
  11. protected AccessGrant postForAccessGrant(String accessTokenUrl, MultiValueMap<String, String> parameters) {
  12. String responseStr = getRestTemplate().postForObject(accessTokenUrl, parameters, String.class);
  13. logger.info("获取accessToke的响应:"+responseStr);
  14. String[] items = StringUtils.splitByWholeSeparatorPreserveAllTokens(responseStr, "&");
  15. String accessToken = StringUtils.substringAfterLast(items[0], "=");
  16. Long expiresIn = new Long(StringUtils.substringAfterLast(items[1], "="));
  17. String refreshToken = StringUtils.substringAfterLast(items[2], "=");
  18. return new AccessGrant(accessToken, null, refreshToken, expiresIn);
  19. }
  20. /* (non-Javadoc)
  21. * @see org.springframework.social.oauth2.OAuth2Template#createRestTemplate()
  22. */
  23. @Override
  24. protected RestTemplate createRestTemplate() {
  25. RestTemplate restTemplate = super.createRestTemplate();
  26. restTemplate.getMessageConverters().add(new StringHttpMessageConverter(Charset.forName("UTF-8")));
  27. return restTemplate;
  28. }
  29. }

使用

  1. public class QQServiceProvider extends AbstractOAuth2ServiceProvider<QQ> {
  2. private String appId;
  3. private static final String URL_AUTHORIZE = "https://graph.qq.com/oauth2.0/authorize";
  4. private static final String URL_ACCESS_TOKEN = "https://graph.qq.com/oauth2.0/token";
  5. public QQServiceProvider(String appId, String appSecret) {
  6. super(new QQOAuth2Template(appId, appSecret, URL_AUTHORIZE, URL_ACCESS_TOKEN));
  7. this.appId = appId;
  8. }

处理流程的工具类,在注册页面,拿到QQ信息

  1. @Configuration
  2. @EnableSocial
  3. public class SocialConfig extends SocialConfigurerAdapter {
  4. @Autowired
  5. private DataSource dataSource;
  6. @Autowired
  7. private SecurityProperties securityProperties;
  8. @Autowired(required = false)
  9. private ConnectionSignUp connectionSignUp;
  10. @Autowired(required = false)
  11. private SocialAuthenticationFilterPostProcessor socialAuthenticationFilterPostProcessor;
  12. /* (non-Javadoc)
  13. * @see org.springframework.social.config.annotation.SocialConfigurerAdapter#getUsersConnectionRepository(org.springframework.social.connect.ConnectionFactoryLocator)
  14. */
  15. @Override
  16. public UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) {
  17. JdbcUsersConnectionRepository repository = new JdbcUsersConnectionRepository(dataSource,
  18. connectionFactoryLocator, Encryptors.noOpText());
  19. repository.setTablePrefix("imooc_");
  20. if(connectionSignUp != null) {
  21. repository.setConnectionSignUp(connectionSignUp);
  22. }
  23. return repository;
  24. }
  25. /**
  26. * 社交登录配置类,供浏览器或app模块引入设计登录配置用。
  27. * @return
  28. */
  29. @Bean
  30. public SpringSocialConfigurer imoocSocialSecurityConfig() {
  31. String filterProcessesUrl = securityProperties.getSocial().getFilterProcessesUrl();
  32. ImoocSpringSocialConfigurer configurer = new ImoocSpringSocialConfigurer(filterProcessesUrl);
  33. configurer.signupUrl(securityProperties.getBrowser().getSignUpUrl());
  34. configurer.setSocialAuthenticationFilterPostProcessor(socialAuthenticationFilterPostProcessor);
  35. return configurer;
  36. }
  37. /**
  38. * 用来处理注册流程的工具类
  39. *
  40. * @param connectionFactoryLocator
  41. * @return
  42. */
  43. @Bean
  44. public ProviderSignInUtils providerSignInUtils(ConnectionFactoryLocator connectionFactoryLocator) {
  45. return new ProviderSignInUtils(connectionFactoryLocator,
  46. getUsersConnectionRepository(connectionFactoryLocator)) {
  47. };
  48. }
  49. }

注册接口

  1. @PostMapping("/regist")
  2. public void regist(User user, HttpServletRequest request) {
  3. //不管是注册用户还是绑定用户,都会拿到一个用户唯一标识。
  4. String userId = user.getUsername();
  5. providerSignInUtils.doPostSignUp(userId, new ServletWebRequest(request));
  6. // appSingUpUtils.doPostSignUp(new ServletWebRequest(request), userId);
  7. }

提供默认注册

  1. //@Component
  2. public class DemoConnectionSignUp implements ConnectionSignUp {
  3. @Override
  4. public String execute(Connection<?> connection) {
  5. //根据社交用户信息默认创建用户并返回用户唯一标识
  6. return connection.getDisplayName();
  7. }
  8. }
  9. public class SocialConfig extends SocialConfigurerAdapter {
  10. @Autowired
  11. private DataSource dataSource;
  12. @Autowired
  13. private SecurityProperties securityProperties;
  14. @Autowired(required = false)
  15. private ConnectionSignUp connectionSignUp;
  16. @Override
  17. public UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) {
  18. JdbcUsersConnectionRepository repository = new JdbcUsersConnectionRepository(dataSource,
  19. connectionFactoryLocator, Encryptors.noOpText());
  20. repository.setTablePrefix("imooc_");
  21. if(connectionSignUp != null) {
  22. repository.setConnectionSignUp(connectionSignUp);
  23. }
  24. return repository;
  25. }

返回的ContextType

application/json;charset=UTF-8
text/html

在这里插入图片描述

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,263人围观)

还没有评论,来说两句吧...

相关阅读

    相关 spring social理解

    现在互联网飞速发展,人们每天在互联网上冲浪,获取各种信息。各大网站为了方便用户的登录,提供了各式各样的社交登录,比如:QQ、微信和微博登录等。这些主流的社交登录大多是基于oau