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 在启动类上加上注解 注意:
保存登录用户 注解 保存用户登录信息,只要实现一个接口就可以了,在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()); }; } 上面 @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,!user.isBlock(),grantedAuthorities); } else { log.info("用户" + username + " 不存在"); throw new UsernameNotFoundException("用户名或密码不正确"); } } } 参考 代码详见:https://github.com/yiiu-co/yiiu 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |