作者:阿尼陀佛1314 | 来源:互联网 | 2023-07-11 19:01
本文纯真从简朴的手艺完成来说,不触及开放平台的多维度的运营理念。什么是开放平台经由过程开放本身平台产物效劳的种种API接口,让其他第三方开辟者在开辟运用时依据需求直接挪用,比方微信
本文纯真从简朴的手艺完成来说,不触及开放平台的多维度的运营理念。
什么是开放平台
经由过程开放本身平台产物效劳的种种API接口,让其他第三方开辟者在开辟运用时依据需求直接挪用,比方微信登录、QQ登录、微信付出、微博登录、热点等。
让第三方运用经由过程开辟平台,使得本身海量数据资本取得沉淀(变现)
目前国内主流的网站的的开放平台,都是基于oauth2.0 协定举行做的开放平台
oauth2.0 受权码形式
受权码形式(authorization code)是功用最完全、流程最周密的受权形式。 它的特性就是经由过程客户端的背景效劳器,与”效劳提供商”的认证效劳器举行互动,可以满足绝大多数开放平台认证受权的需求。
引入相干依靠
org.springframework.cloud
spring-cloud-starter-oauth2
org.springframework.cloud
spring-cloud-starter-security
设置认证效劳器
经由过程内存形式,初始化一个支撑受权码形式的客户端
@Configuration
@AllArgsConstructor
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
@Override
@SneakyThrows
public void configure(ClientDetailsServiceConfigurer clients) {
clients.inMemory()
.withClient("pigx") // client_id
.secret("pigx") // client_secret
.authorizedGrantTypes("authorization_code") // 该client许可的受权范例
.scopes("app"); // 许可的受权局限
}
}
开端完成,测试一下
注重这里是 /oauth/authorize 不是 /oauth/token 接口,只需要带 client_id 即可。
localhost:9999/oauth/authorize?client_id=pigx&response_type=code&redirect_uri=https://pig4cloud.com
- 先举行basic 登录,默许用户user,暗码已打在控制台本身查即可
简朴的几步就完成上图微信或许其他网站的受权流程,不过目前为止 略显大略
- 登录没有界面,用户暗码数据库没有保留
- 确认受权界面太丑,没有特性化
设置平安登录
- 设置未登录阻拦重定向到 loginPage
- 设置登录完成提交的页面途径 这里会被spring security 接受
@Primary
@Order(90)
@Configuration
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {
@Override
@SneakyThrows
protected void configure(HttpSecurity http) {
http
.formLogin()
.loginPage("/token/login")
.loginProcessingUrl("/token/form")
.and()
.authorizeRequests()
.anyRequest().authenticated();
}
}
认证效劳器设置用户加载划定规矩完成
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
endpoints.userDetailsService(pigxUserDetailsService)
}
// 经由过程这步去加载数据的用户名暗码
public interface UserDetailsService {
UserDetails loadUserByUsername(String var1) throws UsernameNotFoundException;
}
重写原有认证页面
默许逻辑/oauth/confirm_access,让他重定向到我们本身的途径,然后举行特性哈
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
endpoints
.userDetailsService(pigxUserDetailsService)
.pathMapping("/oauth/confirm_access", "/token/confirm_access")
}
猎取高低文中的受权信息,传给前端
/**
* 确认受权页面
*
* @param request
* @param session
* @param modelAndView
* @return
*/
@GetMapping("/confirm_access")
public ModelAndView confirm(HttpServletRequest request, HttpSession session, ModelAndView modelAndView) {
Map scopeList = (Map) request.getAttribute("scopes");
modelAndView.addObject("scopeList", scopeList.keySet());
Object auth = session.getAttribute("authorizationRequest");
if (auth != null) {
AuthorizationRequest authorizatiOnRequest= (AuthorizationRequest) auth;
ClientDetails clientDetails = clientDetailsService.loadClientByClientId(authorizationRequest.getClientId());
modelAndView.addObject("app", clientDetails.getAdditionalInformation());
modelAndView.addObject("user", SecurityUtils.getUser());
}
modelAndView.setViewName("ftl/confirm");
return modelAndView;
}
终究结果
总结
- 以上源码参考个人项目 基于Spring Cloud、OAuth2.0开辟基于Vue前后星散的开辟平台
- QQ: 2270033969 一起来聊聊你们是咋用 spring cloud 的吧。
- 迎接关注我们的民众号取得更多的好玩JavaEE 实践