spring-boot集成spring-security的oauth2如何实现github登录网站
这篇文章主要为大家展示了“spring-boot集成spring-security的oauth2如何实现github登录网站”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“spring-boot集成spring-security的oauth2如何实现github登录网站”这篇文章吧。

创新互联建站是一家朝气蓬勃的网站建设公司。公司专注于为企业提供信息化建设解决方案。从事网站开发,网站制作,网站设计,网站模板,微信公众号开发,软件开发,小程序设计,10余年建站对木托盘等多个行业,拥有丰富的网站营销经验。
引入依赖
org.springframework.security.oauth spring-security-oauth3
添加配置
security:
oauth3:
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在启动类上加上注解 @EnableOAuth3Sso 一个注解搞定一切
注意:
github上的申请应用,这里不多说,要注意的是github上要填的回调地址是跟上面配置的
registered-redirect-uri一样的加上
@EnableOAuth3Sso注解后,原来系统里配置的/login就默认成了oauth3登录的路由了,这里通过配置security.oauth3.sso.login-path更改了
保存登录用户
注解 @EnableOAuth3Sso 登录成功了,会把用户信息写入到内存,还是跟session生命周期一样的,session没了,它就没了, 所以既然登录成功了,就要保存到数据库里,而且也可以跟本地用户做关联,登录成功了,直接读取用户的权限信息
保存用户登录信息,只要实现一个接口就可以了,在oauth3授权成功了,它会回调这个接口的,上代码
这个类放哪都可以,只要能被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 permissions = permissionService.findByAdminUserId(user.getId());
List 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("用户名或密码不正确");
}
}
} 以上是“spring-boot集成spring-security的oauth2如何实现github登录网站”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!
新闻标题:spring-boot集成spring-security的oauth2如何实现github登录网站
URL链接:http://jxruijie.cn/article/jdchog.html
