权限认证
oauth2 应用的步骤
- 配置资源服务器 EnableResourceServer
- 配置认证服务器 EnableAuthorizationServer
- 配置 Spring security EnableWebSercurity
oauth2 据场景分4种模式
- 授权码模式 (authorization code) 使用场景: 网站授权
- 简化模式 (implicit)
- 密码模式 (resource owner password credentials) 使用场景:有用户、权限体系
- 客户端模式 (client credentials) 使用场景:仅是接口、不考虑用户
Spring security中具体内容UserDetailsService \ AuthenticationManager \ authenticationProvider 关系
EnableResourceServer具体内容
TokenGranter
- CompositeTokenGranter
- AbstractokenGranter
- ResourceOwnerPasswordTokenGranter
- AuthorizationCodeTokenGranter
- ImplicitTokenGranter
- ClientCredentialsTokenGranter
- RefreshTokenGranter refresh_token 刷新token专用
AuthorizationServerTokenServices创建、刷新、获取token
tokenStore中包含redis、jwt、db实现
问题
- 登陆 接口
TokenEndpoint类 /oauth/token 见postman中【鉴权-demo】 - 刷新token
1⃣️ 什么时候用?
access_token过期2⃣️ 异常码处理方式?怎么实现前端拦截后得到401码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20if (error.response) {
if (error.response.status === 401) {
// 如果当前路由不是login,并且用户有 “记住密码” 的操作
// 那么去请求新 token
if (router.currentRoute.name !== 'login') {
if (getRemember() && getRefreshToken()) {
return doRequest(error)
} else {
Message.error('登陆过期请重新登陆!')
setToken('')
router.push({
name: 'login'
})
}
}
}
}HttpServletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - 退出
- 鉴权中clientId的作用
授权时作为第三方进行使用(微信授权登陆时,需要先在微信端申请为可信应用) - BasicAuthenticationFilter默认登录HttpSecurity.httpBasic()
- AbstractTokenGranter查看校验validateGrantType与clientDetails.getAuthorizedGrantTypes校验
TokenGranter.grant(grantType, tokenRequest);
参考
鉴权专题
鉴权demo
refresh token的使用-参考1
refresh token的使用-参考2
refresh token的使用-参考3
设置返回码为401