0%

Spring Security && oauth2

权限认证

oauth2 应用的步骤

  1. 配置资源服务器 EnableResourceServer
  2. 配置认证服务器 EnableAuthorizationServer
  3. 配置 Spring security EnableWebSercurity

oauth2 据场景分4种模式

  1. 授权码模式 (authorization code) 使用场景: 网站授权
  2. 简化模式 (implicit)
  3. 密码模式 (resource owner password credentials) 使用场景:有用户、权限体系
  4. 客户端模式 (client credentials) 使用场景:仅是接口、不考虑用户

Spring security中具体内容UserDetailsService \ AuthenticationManager \ authenticationProvider 关系

EnableResourceServer具体内容

TokenGranter

  1. CompositeTokenGranter
  2. AbstractokenGranter
  • ResourceOwnerPasswordTokenGranter
  • AuthorizationCodeTokenGranter
  • ImplicitTokenGranter
  • ClientCredentialsTokenGranter
  • RefreshTokenGranter refresh_token 刷新token专用

AuthorizationServerTokenServices创建、刷新、获取token
tokenStore中包含redis、jwt、db实现

问题

  1. 登陆 接口
    TokenEndpoint类 /oauth/token 见postman中【鉴权-demo】
  2. 刷新token
    1⃣️ 什么时候用?
    access_token过期
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    if (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'
    })
    }
    }
    }
    }
    2⃣️ 异常码处理方式?怎么实现前端拦截后得到401码
    HttpServletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
  3. 退出
  4. 鉴权中clientId的作用
    授权时作为第三方进行使用(微信授权登陆时,需要先在微信端申请为可信应用)
  5. BasicAuthenticationFilter默认登录HttpSecurity.httpBasic()
  6. AbstractTokenGranter查看校验validateGrantType与clientDetails.getAuthorizedGrantTypes校验
    TokenGranter.grant(grantType, tokenRequest);

参考

鉴权专题
鉴权demo
refresh token的使用-参考1
refresh token的使用-参考2
refresh token的使用-参考3
设置返回码为401