Oauth2权限认证系统

这是我自己做的一个权限系统的对接文档,需要了解互相交流的可以私信我。

需求分析

Oauth2权限认证系统基于spring security和spring cloud oauth2实现的为各个业务系统提供认证,权限控制,包括按钮,菜单,接口级别的权限,以及用户,角色,权限资源的管理。业务系统只需求按照要求接入配置,就可以完成系统间授权,联合登陆,并且解决了开发api。
详细设计

技术分析

  • Spring security
    Spring Security为基于J2EE的企业软件应用程序提供全面的安全服务
    核心功能:认证-授权(访问控制)
  • Oauth2
  1. 用于REST/APIs的代理授权 框架(delegated authorization framework)
  2. 基于令牌Token的授权, 在无需暴露用户密码的情 况下,使应用能获取对用户数据的有限访问权限
  3. 解耦认证和授权
  4. 事实上的标准安全框架, 支持多种用例场景:
    (1)服务器端WebApp
    (2)浏览器单页SPA
    (3)无线/原生App
    (4)服务器对服务器之间

OAuth 2.0不是一个认证协议, OAuth 2.0本身并不能告诉你任何用户信息

  • oauth2主要角色
  • Oauth2权限认证系统使用文档_客户端

  • Oauth2术语:
    客户应用 (Client Application) :通常是一个Web 或者无线应用, 它需要访问用户 的受保护资源
    资源服务器 (Resource Server): 是一个web站点 或者web service API,用户的受保护数据保存于此
    授权服务器 (Authorized Server) :在客户应用成功 认证并获得授权 之后,向客户应用颁发访问令牌 Access Token
    资源拥有者 (Resource Owner) :资源的拥有人,想要分享某些资源给第三方应用
    客户凭证 (Client Credentials) :客户的clientId 和密码用于认证客户
    **令牌 (Tokens) :**授权服务器在接收到客户请求后,颁发的访问令牌
    作用域 (Scopes) :客户请求访问令牌 时,由资源拥有者 额外指定的细分权限(permission)
  • Oauth2令牌类型:
    授权码(Authorization Code Token) :仅用于授权码授权类型,用于交 换获取访问令牌和刷新令牌
    Bearer Token: 不管谁拿到Token都可以 访问资源,像现钞
    Proof of Possession(PoP) Token: 可以校验client是否对Token 有明确的拥有权
    刷新令牌(Refresh Token): 用于去授权服务器获取一个新的
    访问令牌访问令牌(Access Token): 用于代表一个用户或服务直接 去访问受保护的资源
  • 授权流程
  • Oauth2权限认证系统使用文档_服务器_02

  • 授权类型:
  • Oauth2权限认证系统使用文档_客户端_03

实现方案

  • 授权服务器:
    提供客户端应用的客户端id和客户端密钥以及授权方式。
/**
* 配置客户端详情
*
* @param clients
* @throws Exception
*/
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
super.configure(clients);
/**
* 数据库方式
*/
clients.withClientDetails(new JdbcClientDetailsService(dataSource));
/**
* 配置方式
*/
// clients.withClientDetails(new JdbcClientDetailsService(dataSource));
// clients.inMemory() // 使用内存存储客户端信息
// .withClient("boot-oauth2") // client_id
// .redirectUris("http://localhost:8081/oauth2/callback")
// .secret("oauth2") // client_secret
// .authorizedGrantTypes("authorization_code", "password", "client_credentials", "client_credentials") // 该client允许的授权类型
// .accessTokenValiditySeconds(3600) // Token 的有效期
// .scopes("scope") // 允许的授权范围
// .autoApprove(true); //登录后绕过批准询问(/oauth/confirm_access)
}

通过认证客户端id和客户端密钥,颁发令牌给客户端,客户端通过令牌去访问资源服务器;

@Data
@Builder
public class AccessToken implements Serializable {

/**
* 令牌
*/
private String accessToken;

/**
* 令牌类型
*/
private String tokenType;

/**
* 令牌过期时间
*/
private String expiresIn;

/**
* 刷新令牌
*/
private String refreshToken;


}
  • 资源服务器:
    受保护的资源由授权服务器提供,客户端应用通过令牌去获取资源,用户,角色,资源等信息。实现受保护的资源接口:
@RestController
@RequestMapping("/resources")
public class OAuth2ResourceController {
}
  • 客户端应用:
    客户端提供授权服务接口去请求授权服务器获取AccessToken(授权码模式);
@Controller
@RequestMapping("/oauth2")
@Slf4j
public class OAuth2Controller {


@Autowired
private OAuth2Service oAuth2Service;

@Autowired
private OAuth2ClientConfigProperties clientConfigProperties;

@RequestMapping("/authorize")
public ModelAndView authorize(HttpServletRequest request, HttpServletResponse response) {
try {
String applyForTokenUri = oAuth2Service.authorize(request, response);
return new ModelAndView(new RedirectView(applyForTokenUri));
} catch (Exception e) {
return null;
}
}

@RequestMapping("/callback")
public ModelAndView authorize(HttpServletRequest request, HttpServletResponse response, String code) {
try {
OAuth2Token oAuth2Token = oAuth2Service.getOAuth2Token(code);
//设置当前登录用户信息
oAuth2Service.currentUserLogin(oAuth2Token, request);
response.addHeader("Authorization", "Bearer " + oAuth2Token.getAccessToken());
log.info("oauth2Token:{}", oAuth2Token);
return new ModelAndView(new RedirectView(clientConfigProperties.getClientUri()));
} catch (Exception e) {
return null;
}
}


}

获取AccessToken成功后,通过token去获取资源。

  • 具体流程:

Oauth2权限认证系统使用文档_html5_04


资源服务器与授权服务器本质上是一个服务,只是一部分服务资源被保护起来了。

权限系统功能展示

  • 用户管理
    用户添加或注册的用户进行管理
  • 资源管理
    资源管理页面管理接口权限,按钮,菜单级别的资源配置,开发结束后需要添加资源,并赋值给用户所拥有的角色才可以拥有访问权限
  • 角色管理
    角色管理页面可以管理角色信息,并给角色绑定资源
  • 用户授权
    用户授权页面是专门为用户绑定角色的页面
  • 项目管理
    项目管理页面是添加接入权限平台项目信息的页面,只有添加了项目才可以使用权限平台。
  • 字典管理

Oauth2权限认证系统使用文档_restful_05

  • 系统公告

接入使用

  • 引入依赖模块oauth2-client
<dependency>
<groupId>org.lht.boot.security</groupId>
<artifactId>oauth2-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
  • 添加配置
boot:
security:
oauth2:
client:
serverUri: http://localhost:8080/ #授权服务接口
clientUri: http://localhost:8081/cloud_rbac/ #客户端接口
clientId: boot-oauth2 #项目标识
clientSecret: oauth2 #项目密钥
grantType: authorization_code #授权模式
spring:
main:
allow-bean-definition-overriding: true
  • 在权限平台添加项目信息
  • 前端配置及登录
    1,前端通过登录接口auth/login登录
    2,请求/oauth2/authorize接口去完成认证和客户端系统登录
    3, 重定向到客户端系统页面
    具体流程查询上面时序图。

注意:

客户端系统:客户端系统即接入权限的系统
授权服务器:权限管理平台