纵身黑道,感官世界高清下载,美的日电集团协同商务平台
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
一个注解搞定一切
注意:
registered-redirect-uri
一样的@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("用户名或密码不正确"); } } }
参考
代码详见:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
浅析我对 String、StringBuilder、StringBuffer 的理解
使用IDEA搭建SSM框架的详细教程(spring + springMVC +MyBatis)
Springboot整合freemarker 404问题解决方案
引入mybatis-plus报 Invalid bound statement错误问题的解决方法
网友评论