源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-12-28 11:19 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要: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
在启动类上加上注解 [code]@EnableOAuth2Sso [/code]一个注解搞定一切 [b]注意:[/b] [list=1] [*]github上的申请应用,这里不多说,要注意的是github上要填的回调地址是跟上面配置的[code] registered-redirect-uri [/code]一样的[/*] [*]加上 [code]@EnableOAuth2Sso [/code]注解后,原来系统里配置的[code] /login [/code]就默认成了oauth2登录的路由了,这里通过配置 [code]security.oauth2.sso.login-path [/code]更改了[/*] [/list] [b]保存登录用户[/b] 注解 [code]@EnableOAuth2Sso [/code]登录成功了,会把用户信息写入到内存,还是跟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());
 };
}

上面[code] yiiuUserDetailService.loadUserByUsername(user.getUsername()) [/code]这段代码见下面,就是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("用户名或密码不正确");
  }
 }

}

参考 代码详见:[url=https://github.com/yiiu-co/yiiu]https://github.com/yiiu-co/yiiu[/url] 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程素材网。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部