Spring Security构建Rest服务-1201-Spring Security OAuth开发APP认证框架之实现服务提供商
实现服务提供商,就是要实现认证服务器、资源服务器。

现在做的都是app的东西,所以在app项目写代码

认证服务器:
新建 ImoocAuthenticationServerConfig 类,@EnableAuthorizationServer 注解就说明该项目是一个 认证服务器:
@Configuration
@EnableAuthorizationServer //这个注解就是实现了一个认证服务器
public class ImoocAuthenticationServerConfig { }
OAuth协议流程:

实现授权码模式:
服务提供商需要提供两个服务:
1,用户调过来点击授权的地址 (如qq微信登录的授权页)
2,点完授权后带着授权码换取access_token的地址(对用户不可见)
加上了@EnableAuthorizationServer 注解的项目,启动后控制台会打印如下的信息:

/oauth/authorize 就是让用户授权的地址,启动应用,访问/oauth/authorize,需要一些参数:
- response_type:表示授权类型,必选项,此处的值固定为"code"
- client_id:表示客户端的ID,必选项
- redirect_uri:表示重定向URI,可选项
- scope:表示申请的权限范围,可选项
- state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。
其中client_id 在启动应用时控制台会打印:

实现授权码模式第一步:获取授权码
拼接访问串:
localhost:8080/oauth/authorize?response_type=code&client_id=f835525e-cbdb-4609-8dae-fbf5ef2b2484&redirect_uri=http://example.com&scope=all

我们的应用相当于 服务提供商,它需要知道三件事
1,哪个应用在请求授权 :通过client_id,第三方应用在应用服务器上注册时分配的id,通过client_id 识别是哪个应用在请求授权
2,在请求哪个用户在给你授权:上图中的form表单就是确认系统中的哪个用户在授权
3,赋予哪些权限:scope参数标识赋予哪些权限
demo项目引用app项目,启动的都是demo项目,

demo项目里有处理认证的类MyUserDetailsService 类,用户名没有处理,只要密码是123456就行
private SocialUserDetails buildUser(String userId) {
String password = passwordEncoder.encode("123456");
System.err.println("加密后密码: "+password);
//参数:用户名|密码|是否启用|账户是否过期|密码是否过期|账户是否锁定|权限集合
return new SocialUser(userId,password,true,true,true,true,AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
}
在认证表单输入密码123456,用户名随便,点击登录,403 拒绝访问

原因是默认情况下,认证服务器上请求需要有ROLE_USER的角色才能访问,在MyUserDetailsService 里加上:
private SocialUserDetails buildUser(String userId) {
String password = passwordEncoder.encode("123456");
System.err.println("加密后密码: "+password);
//参数:用户名|密码|是否启用|账户是否过期|密码是否过期|账户是否锁定|权限集合
return new SocialUser(userId,password,true,true,true,true,AuthorityUtils.commaSeparatedStringToAuthorityList("admin,ROLE_USER"));
}
把client_id 配置到application.properties 配置文件:
security.oauth2.client.clientId = imooc
#注意clientSecret 大写
security.oauth2.client.clientSecret = imoocsecret
再次访问:http://localhost:8080/oauth/authorize?response_type=code&client_id=imooc&redirect_uri=http://example.com&scope=all

这个页面相当于qq登录授权页或微信登录的扫码页,询问是否同意授权,点击同意,返回到http://example.com,并携带了授权码
http://example.com/?code=lUDDeG
实现授权码模式第二步:授权码换取access_token:
此时就该拿着授权码去获取access_token了,post请求 /oauth/token ,使用Resetlet Client,在请求头里新建一个Authentication(Authorization 设置HTTP身份验证的凭证https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Authorization),用户名输入imooc,密码输入 imoocsecret


客户端向认证服务器申请令牌的HTTP请求,包含以下参数:
- grant_type:表示使用的授权模式,必选项,此处的值固定为"authorization_code"。
- code:表示上一步获得的授权码,必选项。
- redirect_uri:表示重定向URI,必选项,且必须与上边步骤中的该参数值保持一致。
- client_id:表示客户端ID,必选项。
- client_secret:客户端密钥
完整的请求:

响应:

密码模式:
参数是用户名密码,其实是用户把在 服务提供商上的 用户名/密码 告诉了第三方,第三方拿着用户名密码去给服务提供商说用户已经授权了。
在app场景下是可用的,因为第三方是app,是公司前端,提供商是服务端,都是一伙的,不涉及安全问题

响应:

可以看到,用同一个用户名登录,响应的access_token是同一个,只要这个token还没过期。
资源服务器:
和认证服务器类似
/**
* 资源服务器,和认证服务器在物理上可以在一起也可以分开
* ClassName: ImoocResourceServerConfig
* @Description: TODO
* @author lihaoyang
* @date 2018年3月13日
*/
@Configuration
@EnableResourceServer
public class ImoocResourceServerConfig { }
启动demo项目,由于没有配置token存储策略,所以生成的token都是在内存中的,在这里重新用密码模式获取一下token:
http://127.0.0.1:8080/oauth/token
@GetMapping("/me")
public Object getCurrentUser(@AuthenticationPrincipal UserDetails user) {
return user;
}

响应:
{
"password": null,
"username": "user",
"authorities":[
{
"authority": "ROLE_USER"
},
{
"authority": "admin"
}
],
"accountNonExpired": true,
"accountNonLocked": true,
"credentialsNonExpired": true,
"enabled": true,
"userId": "user"
}
通过token 获取到了用户信息。
到目前为止获取token和用token 访问服务已完成,但是都是用的OAuth标准的规范和spring security默认的实现。认证方式只能是OAuth规定的四种模式,还不能用手机验证码登录,token也是存在了内存里,是不行的。token的样式也是默认的。
下一步个性化实现,改造 用户名密码登录、短信验证码登录、第三方登录
Spring Security构建Rest服务-1201-Spring Security OAuth开发APP认证框架之实现服务提供商的更多相关文章
- Spring Security构建Rest服务-1300-Spring Security OAuth开发APP认证框架之JWT实现单点登录
基于JWT实现SSO 在淘宝( https://www.taobao.com )上点击登录,已经跳到了 https://login.taobao.com,这是又一个服务器.只要在淘宝登录了,就能直接访 ...
- Spring Security构建Rest服务-1200-SpringSecurity OAuth开发APP认证框架
基于服务器Session的认证方式: 前边说的用户名密码登录.短信登录.第三方登录,都是普通的登录,是基于服务器Session保存用户信息的登录方式.登录信息都是存在服务器的session(服务器的一 ...
- Spring Security构建Rest服务-1202-Spring Security OAuth开发APP认证框架之重构3种登录方式
SpringSecurityOAuth核心源码解析 蓝色表示接口,绿色表示类 1,TokenEndpoint 整个入口点,相当于一个controller,不同的授权模式获取token的地址都是 /oa ...
- Spring Security构建Rest服务-1203-Spring Security OAuth开发APP认证框架之短信验证码登录
浏览器模式下验证码存储策略 浏览器模式下,生成的短信验证码或者图形验证码是存在session里的,用户接收到验证码后携带过来做校验. APP模式下验证码存储策略 在app场景下里是没有cookie信息 ...
- Spring Security构建Rest服务-1205-Spring Security OAuth开发APP认证框架之Token处理
token处理之二使用JWT替换默认的token JWT(Json Web Token) 特点: 1,自包含:jwt token包含有意义的信息 spring security oauth默认生成的t ...
- Spring Security构建Rest服务-1204-Spring Security OAuth开发APP认证框架之Token处理
token处理之一基本参数配置 处理token时间.存储策略,客户端配置等 以前的都是spring security oauth默认的token生成策略,token默认在org.springframe ...
- ASP.NET Core的身份认证框架IdentityServer4--(3)令牌服务配置访问控制跟UI添加
使用密码保护API OAuth 2.0 资源所有者密码授权允许一个客户端发送用户名和密码到IdentityServer并获得一个表示该用户的可以用于访问api的Token. 该规范建议仅对" ...
- spring boot:构建多模块项目(spring boot 2.3.1)
一,为什么要使用多模块? 1,结构更清晰,方便管理 如果只是一个小项目当然没有问题, 但如果功能越增越多则管理越来越复杂, 多模块可以使项目中模块间的结构分离 2,把项目划分成多 ...
- Android 从硬件到应用程序:一步一步爬上去 6 -- 我写的APP测试框架层硬件服务(终点)
创Android Applicationproject:采用Eclipse的Android插入ADT创Androidproject,project名字Gpio,创建完成后,project文件夹pack ...
随机推荐
- mysql图文安装教程(win7 32位 亲测)
一.下载mysql:http://www.mysql.com/downloads/ 弹出: 你需要有一个 Oracle Web 帐户,没有的话,注册一个: 勾选许可: 输入搜索条件: 下载MySQL ...
- Global Mapper
https://blog.csdn.net/mrib/article/details/75116373 http://www.bluemarblegeo.com/products/global-map ...
- day08(异常处理,创建异常,finally,throws和throw的区别)
异常处理, 异常的产生 运行时异常:程序运行中产生的异常:RuntimeException类. 编译时异常:程序在编译时产生的异常:除了RuntimeException类 其他都是编译时产生的 ...
- Java动态绑定与静态绑定
Java动态绑定来自于继承体现,子类继承父类,子类重新覆盖了父类的方法,就是动态绑定,以下举例: (动态绑定是在运行期间) 动物类: /** * 创建一个动物类 * @author Liudeli * ...
- ECG心电图数据2
1.如何下载获取MIT-BIH的数据从下面这个官方链接页面可以下载到所有48组MIT-BIH心电数据: http://www.physionet.org/physiobank/database/mit ...
- oracle只导出触发器
只要触发器,其他都不要 方法1:plsql develop调用exp:tools->export object—>trigger 方法2:select dbms_metadata.get_ ...
- 在TFS中使用Git Tags(标签或标记),实现代码的版本管理
一.概述: 与TFVC中标记(Label)一样,Git的标签(Tag)也是TFS系统的代码管理中非常重要的一个版本管理工具.使用标签,我们可以每个时间点的代码注上一个通俗.并且容易记忆的名称(例如标签 ...
- Visual Studio模板
转载自MSDN,此文仅作参考. http://msdn.microsoft.com/zh-cn/library/6db0hwky(VS.80).aspx 1. 如何导入“项目模板(Project Te ...
- HLSL-高级着色语言简介【转】
HLSL-High Level Shader Language 优点 用来书写Vertex Shader和Pixel Shader程序的代码,语法类似于C/C++,在DirectX 8.x的时代,Sh ...
- python——回文函数(reversed)
回文数:正向排列与反向排列所得结果是相等的(即从左到右和从右到左的结果是相等的),例如:“123321”,“0000”等. reversed函数:反转一个序列对象,将其元素从后向前颠倒构建成一个新的迭 ...