基于Shiro 的 springCloudOAuth2授权管理

>一 . OAuth 角色

------1 . 1 资源拥有者 : 能授权访问受保护资源的一个实体
------1 . 2 资源服务器 : 存储受保护的资源
------1 . 3 授权服务器 : 成功验证资源拥有者并且获取授权之后,为他们颁发授权令牌给客户端
------1 . 4 客户端 : 使用它访问受保护的资源

在这里插入图片描述

>二 . 认证流程

------1、客户端从资源拥有者那请求授权。授权请求可以直接发给资源拥有者,或间接的通过授权服务器这种中介,后者更可取。
------2、客户端收到一个授权许可,代表资源服务器提供的授权。
------3、客户端使用它自己的私有证书及授权许可到授权服务器验证。
------4、如果验证成功,则下发一个访问令牌。
------5、客户端使用访问令牌向资源服务器请求受保护资源。
------6、资源服务器会验证访问令牌的有效性,如果成功则下发受保护资源。

>三 . spring maven 依赖

------1 . groupid : org.apache.oltu.oauth2 <----->artifactId : org.apache.oltu.oauth2.authzserver
------2 . groupId : org.apache.oltu.oauth2<----->artifactId : org.apache.oltu.oauth2.resourceserver

>四 . 常用的数据字典 USER

------ ID — bigInt — 主键
------ username — varchar— 用户名
------ password — varchar— 密码
------ salt— varchar— 盐

>五 . 常用的数据字典 Client

------ ID — bigInt — 主键
------ client_name — varchar—客户端名称
------ client_id — varchar— 唯一ID
------ client_secret — varchar— 客户端安全KEY

>六 . 授权控制器

------1 . 1 OAuthAuthzRequest oauthRequest = new OAuthAuthzRequest(request);
------>?------构建Oauth 授权请求
------1 . 2 检查提交的客户端ID , 对不合格的ID会返回Error信息
------1 . 3 获得Subject , 并且判断是否已经登录 , 根据情况跳转到登录页面
------1 . 3 . 1 >— 注意 :因为Oauth 登录 , 所以可通过设置client 属性 ,跳转到指定的client
------1 . 4 生成对应的授权码( 可生成 code 或者 Token ),可根据请求需求返回某种授权码
------1 . 4 . 1 >— 方法为 OAuthIssuerImpl . authorizationCode( )
------1 . 5 进行OAuth 响应的构建 ( OAuthASResponse.OAuthAuthorizationResponseBuilder )
------>-----OAuthASResponse.authorizationResponse(request,HttpServletResponse.SC_FOUND);
------1 . 6 设置授权码 ( builder.setCode(authorizationCode) )
------1 . 7 得到客户端重定向地址
------1 . 8 构建响应
------1 . 9 根据OAuthResponse 返回ResponseEntity 响应
------* 此处建议添加异常处理

>七 . 登录方法 login ( ) 方法解析

------ 1 . 1 对 请求进行判断是否要求
------ 1 . 2 获得请求中的Username 和 password
------ 1 . 3 对两种进行初级审核,例如非空等
------ 1 . 4 创建 UsernamePasswordToken 对象
------ 1 . 5 shiro 登录 subject . login ( token )
------ 1 . 6 穿插相关的异常处理不详细说明

>八 . 访问令牌控制器

------ 1 OAuthTokenRequest oauthRequest = new OAuthTokenRequest(request);
------ ? ------ 构建OAuth请求
------ 2 检查提交的客户端ID , 对不合格的ID会返回Error信息
------ 3 检查客户端安全KEY 是否 正确 , 对不合格的进行错误Error 信息返回
------ 4 获得Oauth code 或者 token 或者 password
------ 5 检查验证类型 , 不合格则返回 error 信息
------ 6 生成Access Token ( OAuthIssuer 对象 oauthIssuerImpl.accessToken() 方法 )
------ 7 生成OAuth 响应
------ > 7 . 1 ------- .tokenResponse(HttpServletResponse.SC_OK)
------ > 7 . 2 ------- .setAccessToken(accessToken)
------ > 7 . 3 ------- .setExpiresIn(String.valueOf(oAuthService.getExpireIn()))
------ > 7 . 4 ------- .buildJSONMessage();
------ 8 根据OAuthResponse生成ResponseEntity

>九 . 资源控制器

------ 1 OAuthAccessResourceRequest oauthRequest = new OAuthAccessResourceRequest(request, ParameterStyle.QUERY);
------ ? ------ 构建OAuth资源请求
------ 2 获取 Access Token ( oauthRequest.getAccessToken() )
------ 3 验证 Access Token ,不通过返回error信息 ( 注意这个过程可以设置Header )
------ 4 通过 accessToken 获得用户名
------ 5 返回 ResponseEntity
------ 6 异常处理 ,检查是否设置了错误码 , 进行相关反馈操作

>十 . 客户端配置

------ groupId ---- org.apache.oltu.oauth2
------ artifactId ---- org.apache.oltu.oauth2.client

>十一 . 身份验证控制 AuthenticatingFilter

------ 1 若当前用户还没有身份验证 , 则判断是否有code
------ 2 若无code则重定向到登录页面 , 返回 auth code
------ 3 OAuth2AuthenticationFilter 用 auth code 创建 OAuth2Token
------ 4 提交给Subject . login 进行登录
------ 5 OAuth2Realm 根据 OAuth2Token 进行相应的登录逻辑

>十二 . AuthenticatingFilter 详细方法

------- 1 详细属性
------- 1 . 1 —authcCodeParam = “code”; ------?—code 参数名
------- 1 . 2 —String clientId; ------?—客户端ID
------- 1 . 3 —String redirectUrl; ------?—成功后的重定向地址
------- 1 . 4 —String responseType = “code”; ------?—响应类型
------- 1 . 5 — String failureUrl; ------?—失败地址
------- 2 方法
------- 2 AuthenticationToken createToken(ServletRequest request, ServletResponse response)
------- ? -------创建token : 获取HttpServletRequest > 获取code > new OAuth2Token(code)
------- 3 onAccessDenied(ServletRequest request, ServletResponse response)
------- ? -------授权失败方法逻辑,如果服务端返回错误则反馈给前端 , 没有返回且没信息则跳转到服务器授权 , 有信息则调用subject . login登录
------- 4 onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request, ServletResponse response)
------- ? -------登录成功后的回调方法,进行重定向
------- 5 onLoginFailure(AuthenticationToken token, AuthenticationException ae, ServletRequest request, ServletResponse response)
------- ? -------登录失败后的回调

>十三 . 自定义 OAuth2Realm

------- 1 通过传入的auth code 去换取Access token
------- 2 根据access token 获取用户信息
------- 3 根据token 创建 AuthenticationInfo

>十四 . OAuth2Realm 具体方法

------- 1 extends AuthorizingRealm
------- 2 AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals)
------- 2 . 1 >------ OAuth2Token oAuth2Token = (OAuth2Token) token; ------?— 获取token对象
------- 2 . 2 >------ String code = oAuth2Token.getAuthCode(); ------?— 获取code
------- 2 . 3 >------ String username = extractUsername(code); ------?— 获取用户名
------- 2 . 4 >------ SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(username, code, getName());
------- 3 String extractUsername(String code) : 用户获得username
------- 3 . 1 >------ 获取access token ( OAuthAccessTokenResponse oAuthResponse )
------- 3 . 2 >------ 获取user info ( OAuthClientRequest userInfoRequest )
------- 3 . 3 >------ 获取username ( OAuthResourceResponse resourceResponse ) ------ resourceResponse.getBody();

Github 地址

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值