spring-boot集成spring-security的oauth2实现github登录网站的示例

 更新时间:2017年10月30日 14:05:53   作者:Tomoya  
本篇文章主要介绍了spring-boot集成spring-security的oauth2实现github登录网站的示例,非常具有实用价值,需要的朋友可以参考下

spring-security 里自带了oauth2,正好YIIU里也用到了spring-security做权限部分,那为何不直接集成上第三方登录呢?

然后我开始了折腾

注意:本篇只折腾了spring-security oauth2的客户端部分,spring-security还可以搭建标准的oauth2服务端

引入依赖

<dependency>
 <groupId>org.springframework.security.oauth</groupId>
 <artifactId>spring-security-oauth2</artifactId>
</dependency>

添加配置

security:
 oauth2:
  client:
   client-id:
   client-secret:
   accessTokenUri: https://github.com/login/oauth/access_token
   userAuthorizationUri: https://github.com/login/oauth/authorize
   clientAuthenticationScheme: form
   registered-redirect-uri: ${site.baseUrl}/github_login
   use-current-uri: false
  resource:
   userInfoUri: https://api.github.com/user
  sso:
   login-path: /github_login

在启动类上加上注解 @EnableOAuth2Sso 一个注解搞定一切

注意:

  1. github上的申请应用,这里不多说,要注意的是github上要填的回调地址是跟上面配置的 registered-redirect-uri 一样的
  2. 加上 @EnableOAuth2Sso 注解后,原来系统里配置的 /login 就默认成了oauth2登录的路由了,这里通过配置 security.oauth2.sso.login-path 更改了

保存登录用户

注解 @EnableOAuth2Sso 登录成功了,会把用户信息写入到内存,还是跟session生命周期一样的,session没了,它就没了, 所以既然登录成功了,就要保存到数据库里,而且也可以跟本地用户做关联,登录成功了,直接读取用户的权限信息

保存用户登录信息,只要实现一个接口就可以了,在oauth2授权成功了,它会回调这个接口的,上代码

这个类放哪都可以,只要能被spring管理就行

@Bean
public PrincipalExtractor principalExtractor() {
 return map -> {
  String login = map.get("login").toString();//github的登录名
  GithubUser githubUser = githubUserService.findByLogin(login);
  User user;
  if (githubUser == null) {
   githubUser = new GithubUser();
   githubUser = githubUserService.convert(map, githubUser);
   //创建一个本地用户
   user = userService.findByUsername(login);
   if (user == null) {
    user = new User();
    user.setUsername(login);
   } else {
    user.setUsername(login + "_" + githubUser.getGithubId());
   }
   user.setEmail(githubUser.getEmail());
   user.setBio(githubUser.getBio());
   user.setUrl(githubUser.getHtml_url());
   user.setPassword(new BCryptPasswordEncoder().encode(StrUtil.randomString(16)));
   user.setInTime(new Date());
   user.setBlock(false);
   user.setToken(UUID.randomUUID().toString());
   user.setAvatar(githubUser.getAvatar_url());
   user.setAttempts(0);
   user.setScore(2000);// first register score 2000
   user.setSpaceSize(siteConfig.getUserUploadSpaceSize());
   user.setGithubUser(githubUser);

   // set user's role
   Role role = roleService.findById(3); // normal user
   Set roles = new HashSet();
   roles.add(role);
   user.setRoles(roles);
   userService.save(user);
  } else {
   githubUser = githubUserService.convert(map, githubUser);
   user = githubUser.getUser();
   githubUserService.save(githubUser);
  }
  //加载用户的权限信息
  return yiiuUserDetailService.loadUserByUsername(user.getUsername());
 };
}

上面 yiiuUserDetailService.loadUserByUsername(user.getUsername()) 这段代码见下面,就是spring-security的加载用户权限代码

@Service
public class YiiuUserDetailService implements UserDetailsService {

 private Logger log = Logger.getLogger(YiiuUserDetailService.class);

 @Autowired
 private UserService userService;
 @Autowired
 private PermissionService permissionService;

 public UserDetails loadUserByUsername(String username) {
  User user = userService.findByUsername(username);
  if (user != null) {
   List<Permission> permissions = permissionService.findByAdminUserId(user.getId());
   List<GrantedAuthority> grantedAuthorities = new ArrayList<>();
   for (Permission permission : permissions) {
    GrantedAuthority grantedAuthority = new SimpleGrantedAuthority(permission.getName());
    grantedAuthorities.add(grantedAuthority);
   }
   return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(),
     true, true, true, !user.isBlock(), grantedAuthorities);
  } else {
   log.info("用户" + username + " 不存在");
   throw new UsernameNotFoundException("用户名或密码不正确");
  }
 }

}

参考

代码详见:https://github.com/yiiu-co/yiiu

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 使用SpringBoot+AOP实现可插拔式日志的示例代码

    使用SpringBoot+AOP实现可插拔式日志的示例代码

    这篇文章主要介绍了使用SpringBoot+AOP实现可插拔式日志的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Java中使用ForkJoinPool的实现示例

    Java中使用ForkJoinPool的实现示例

    ForkJoinPool是一个功能强大的Java类,用于处理计算密集型任务,本文主要介绍了Java中使用ForkJoinPool的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • SpringBoot原生组件注入实现两种方式介绍

    SpringBoot原生组件注入实现两种方式介绍

    SpringBoot是Spring全家桶的成员之一,基于约定优于配置的思想(即有约定默认值,在不配置的情况下会使用默认值,在配置文件下配置的话会使用配置的值)。SpringBoot是一种整合Spring技术栈的方式(或者说是框架),同时也是简化Spring的一种快速开发的脚手架
    2022-10-10
  • 数据库连接超时java处理的两种方式

    数据库连接超时java处理的两种方式

    这篇文章主要介绍了数据库连接超时java处理的两种方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • SpringBoot 缓存 Caffeine使用解析

    SpringBoot 缓存 Caffeine使用解析

    这篇文章主要介绍了SpringBoot 缓存 Caffeine使用解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 基于dubbo中Listener的实现方法

    基于dubbo中Listener的实现方法

    下面小编就为大家带来一篇基于dubbo中Listener的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • SpringMVC生成的验证码图片不显示问题及解决方法

    SpringMVC生成的验证码图片不显示问题及解决方法

    这篇文章主要介绍了SpringMVC生成的验证码图片不显示问题,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • 全面了解Java中的内部类和匿名类

    全面了解Java中的内部类和匿名类

    下面小编就为大家带来一篇全面了解Java中的内部类和匿名类。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • Java8中Optional类的使用说明

    Java8中Optional类的使用说明

    Optional类主要解决的问题是臭名昭著的空指针异常(NullPointerException),每个Java程序员都非常了解的异常,这篇文章主要给大家介绍了关于Java8中Optional类使用的相关资料,需要的朋友可以参考下
    2021-11-11
  • Java集合中的Iterator迭代器接口详解

    Java集合中的Iterator迭代器接口详解

    这篇文章主要介绍了Java集合中的Iterator迭代器接口详解,Iterator,被称为迭代器接口,本身并不提供存储对象的能力,主要用于遍历Collection中的元素,需要的朋友可以参考下
    2023-11-11

最新评论