java权限统一认证中心_微服务权限终极解决方案,Spring Cloud Gateway + Oauth2 实现统一认证和鉴权!...

本文介绍了如何使用Spring Cloud Gateway、Oauth2和JWT实现微服务权限统一认证和鉴权的解决方案。通过认证服务进行认证,网关进行校验,其他API服务专注于业务逻辑。详细步骤包括搭建认证服务、网关服务和API服务的配置,如依赖、配置文件、认证服务的UserDetailsService、Oauth2ServerConfig、JWT内容增强器等。此外,还展示了资源服务如何将资源与角色匹配关系缓存到Redis中,以及网关服务的安全配置和全局过滤器,确保鉴权和用户信息传递。
摘要由CSDN通过智能技术生成

SpringBoot实战电商项目mall(35k+star)地址:github.com/macrozheng/…

摘要

最近发现了一个很好的微服务权限解决方案,可以通过认证服务进行统一认证,然后通过网关来统一校验认证和鉴权。此方案为目前最新方案,仅支持Spring Boot 2.2.0、Spring Cloud Hoxton 以上版本,本文将详细介绍该方案的实现,希望对大家有所帮助!

前置知识

我们将采用Nacos作为注册中心,Gateway作为网关,使用nimbus-jose-jwtJWT库操作JWT令牌,对这些技术不了解的朋友可以看下下面的文章。

应用架构

我们理想的解决方案应该是这样的,认证服务负责认证,网关负责校验认证和鉴权,其他API服务负责处理自己的业务逻辑。安全相关的逻辑只存在于认证服务和网关服务中,其他服务只是单纯地提供服务而没有任何安全相关逻辑。

相关服务划分:

micro-oauth2-gateway:网关服务,负责请求转发和鉴权功能,整合Spring Security+Oauth2;

micro-oauth2-auth:Oauth2认证服务,负责对登录用户进行认证,整合Spring Security+Oauth2;

micro-oauth2-api:受保护的API服务,用户鉴权通过后可以访问该服务,不整合Spring Security+Oauth2。

方案实现

下面介绍下这套解决方案的具体实现,依次搭建认证服务、网关服务和API服务。

micro-oauth2-auth

我们首先来搭建认证服务,它将作为Oauth2的认证服务使用,并且网关服务的鉴权功能也需要依赖它。

在pom.xml中添加相关依赖,主要是Spring Security、Oauth2、JWT、Redis相关依赖;

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-security

org.springframework.cloud

spring-cloud-starter-oauth2

com.nimbusds

nimbus-jose-jwt

8.16

org.springframework.boot

spring-boot-starter-data-redis

在application.yml中添加相关配置,主要是Nacos和Redis相关配置;

server:

port: 9401

spring:

profiles:

active: dev

application:

name: micro-oauth2-auth

cloud:

nacos:

discovery:

server-addr: localhost:8848

jackson:

date-format: yyyy-MM-dd HH:mm:ss

redis:

database: 0

port: 6379

host: localhost

password:

management:

endpoints:

web:

exposure:

include: "*"

使用keytool生成RSA证书jwt.jks,复制到resource目录下,在JDK的bin目录下使用如下命令即可;

keytool -genkey -alias jwt -keyalg RSA -keystore jwt.jks

创建UserServiceImpl类实现Spring Security的UserDetailsService接口,用于加载用户信息;

/**

* 用户管理业务类

* Created by macro on 2020/6/19.

*/

@Service

public class UserServiceImpl implements UserDetailsService{

private List userList;

@Autowired

private PasswordEncoder passwordEncoder;

@PostConstruct

public void initData(){

String password = passwordEncoder.encode("123456");

userList = new ArrayList<>();

userList.add(new UserDTO(1L,"macro", password,1, CollUtil.toList("ADMIN")));

userList.add(new UserDTO(2L,"andy", password,1, CollUtil.toList("TEST")));

}

@Override

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException{

List findUserList = userList.stream().filter(item -> item.getUsername().equals(username)).collect(Collectors.toList());

if (CollUtil.isEmpty(findUserList)) {

throw new UsernameNotFoundException(MessageConstant.USERNAME_PASSWORD_ERROR);

}

SecurityUser securityUser = new SecurityUser(findUserList.get(0));

if (!securityUser.isEnabled()) {

throw new DisabledException(MessageConstant.ACCOUNT_DISABLED);

} else if (!securityUser.isAccountNonLocked()) {

throw new LockedException(MessageConstant.ACCOUNT_LOCKED);

} else if (!securityUser.isAccountNonExpired()) {

throw new AccountExpiredException(MessageConstant.ACCOUNT_EXPIRED);

} else if (!securityUser.isCredentialsNonExpired()) {

throw new CredentialsExpiredException(MessageConstant.CREDENTIALS_EX

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringCloud是一个基于Spring Boot的开源微服务框架。SpringCloud GatewaySpringCloud生态中的一个组件,提供了一种基于路由的API网关解决方案。JWT是JSON WEB Token的缩写,是一种用于身份认证和授权的开放标准。OAuth2是一种授权框架,用于向用户授权第三方应用访问他们的资源。 在微服务架构中,每个服务都是独立的,网关作为服务的入口,可以实现对外的请求过滤和路由。SpringCloud Gateway使用HttpClient进行内部请求的调度和路由。同时,它还提供了一些高阶的路由和过滤功能,如重定向、URL重写、限流、熔断、重试等。 JWT是一种轻量级的认证方案,通过在HTTP请求中添加一个JSON WEB Token,实现对用户进行身份认证和授权。JWT的使用极大地简化了认证过程,前后端可以通过JWT判断用户的身份和权限OAuth2为开发者提供了一种授权框架,可以授权第三方应用获取用户访问他们的资源。OAuth2支持多种授权类型,如授权码模式、密码模式、客户端模式和隐式模式。使用OAuth2,可以更好地保护用户的隐私和安全。 综上所述,SpringCloud Gateway、JWT和OAuth2都是现代化的解决方案,对于设计和开发微服务架构的应用程序来说,它们都是必不可少的组件。有了它们,开发人员可以更好的搭建分布式架构,确保数据安全性、隐私安全性和服务的可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值