# spring-security-oauth2-zuul
**Repository Path**: OOloveXX/spring-security-oauth2-zuul
## Basic Information
- **Project Name**: spring-security-oauth2-zuul
- **Description**: 项目搭建使用zull网关+security+oauth2
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 3
- **Created**: 2021-05-16
- **Last Updated**: 2021-05-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# kim-security-oauth
* [1 启动项目](#1)
* [2 项目简介](#2)
#
1 启动项目
* 项目启动需要环境`JDK1.8` `Mysql 5.6+` `Redis` `Maven`
* 导入项目根目录下security_oauth2.sql文件到mysql
* 全局搜索yml配置文件替换 mysql redis 连接属性
* mysql配置
```yaml
datasource:
url: jdbc:mysql://127.0.0.1:3306/security_oauth2?characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghai
password: root
username: root
```
* redis配置
```yaml
redis:
#数据库索引
database: 15
host: 127.0.0.1
port: 6379
password: 123456
```
* 体验测试时`eureka-server`与`authorization-server` 认证服务 需要先启动
> `eureka-server` 注册中心 `authorization-server` 认证服务
> `user-oauth-service` 用户认证服务 包括**密码模式、授权码模式、密码模式扩展认证方式、刷新令牌、用户注册、退出登录等**
_实际开发时不建议对外暴露认证服务,获取及刷新token,包括获取以及修改用户认证信息建议在这里进行_
>> `user-info-service` 用户信息服务(操作那个用户信息的具体服务)目前只提供用户注册时初始化用户信息的接口
> `resource-client` 与 `resource-client-test` 两个项目为资源服务(测试时需要启动)
> 同时封装两个公共的starter 可控测试服务使用(搭建自己的认证服务时也推荐公共的starter)
***
# 2 项目简介
* 版本`SpringCloud(Hoxton.RELEASE)` `SpringBoot(2.2.2.RELEASE)`
* 主要基于`spring-cloud-starter-oauth2`实现了OAuth2.0 的四种授权模式,以及基于密码模式的扩展模式
* 授权码模式
* 密码模式
* 手机号/用户名 密码
* 手机号/用户名 密码 图形验证码(_因为一个妹子想要这个功能后加的_)
* 手机号 短信验证码
* 可扩展多种登录(微信授权登录、苹果授权登录 ...)
* 隐式模式
* 凭证模式(客户端模式)
* 同时支持**jwt**(非对称加密方式)、**redis**、**redis-custom**(自定义redis)三种token存储方式,可选用任意一种使用灵活切换
> redis、redis-custom(自定义redis)两种方式轮换实验时记得redis清库
> 使用jwt非对称加密方式时如果不会生成钥匙对可参照[获取jks文档](./jdk的keytool生成jks和获取jks的信息与公匙.md)操作
* 重要配置
```yaml
surge:
oauth2:
token-store:
# token 存储方式 jwt redis redis-custom
type: redis
```
* 代码片段(缩减版)
```java
@Slf4j
@Configuration
public class TokenStoreConfig {
@Bean
@ConditionalOnProperty(prefix = "surge.oauth2.token-store", name = "type", havingValue = "redis", matchIfMissing = true)
public RedisTokenStore redisTokenStore() {
log.info("使用 ---> RedisTokenStore 存储token");
return new RedisTokenStore(redisTemplate.getConnectionFactory());
}
@Bean
@ConditionalOnProperty(prefix = "surge.oauth2.token-store", name = "type", havingValue = "redis-custom")
public CustomRedisTokenStore customRedisTokenStore() {
log.info("使用 ---> CustomRedisTokenStore 存储token");
CustomRedisTokenStore customRedisTokenStore = new CustomRedisTokenStore();
customRedisTokenStore.setRedisTemplate(redisTemplate);
return customRedisTokenStore;
}
@Configuration
@ConditionalOnProperty(prefix = "surge.oauth2.token-store", name = "type", havingValue = "jwt")
@EnableConfigurationProperties(JwtSecretProperties.class)
public static class JwtTokenConfig {
// 配置TokenStore
// 配置jwt转换器
// 自定义token增强器
}
}
```
* 实现了基于OAuth2.0 的SSO(单点登录)
> 基于授权码模式
* 重要配置
```yaml
security:
oauth2:
client:
access-token-uri: http://localhost:18031/oauth/token
user-authorization-uri: http://localhost:18031/oauth/authorize
client-id: cy
client-secret: secret
client-authentication-scheme: form
#use-current-uri: false # 定义false表示默认跳转路径(/login)不生效
#pre-established-redirect-uri: http://localhost:18036/login #使用自定义跳转路径 前提是use-current-uri必须为false
grant-type: authorization_code
resource:
user-info-uri: http://localhost:18033/user1
prefer-token-info: false #true表示使用token,false表示使用user
```
* 权限控制与资源保护方面提供 `配置文件方式`、`注解方式`、`动态权限`、`scope校验`
> `动态权限`、`scope校验` 暂时与配置文件方式冲突,后续再进行完善(可分别使用)
* 配置文件方式
> 项目中推荐使用此种方式对接口进行权限控制
```yaml
surge:
oauth2:
antMatchers:
# 需要 ADMIN角色才可以访问
role2ADMIN:
- /user5
# 需要 ALL权限才可以访问
auth2ALL:
- /user6
# 公开路径无需授权即可访问
unAuthenticated:
- /**/unAuthenticated/**
- /favicon.ico
```
* 注解方式
> 项目中可以使用此种方式对接口进行权限控制
```
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true, jsr250Enabled = true)
```
* 动态权限、scope校验
>只是实现了功能可以开启但开启后配置文件以及配置类中设置得认证授权规则失效
* 重要配置
```yaml
surge:
oauth2:
token-store:
# 是否开启动态权限
enable-dynamic-auth: false
# 是否开启Scope校验
enable-dynamic-scope-auth: false
```
* 实现参考
`ResourceServerConfig`、`UrlRolesFilterHandler` 配置自定义权限拦截
`ClientScopeVoter` scope投票实现(没有使用官方提供得)
`UrlRoleAuthVoter` 角色权限投票实现
* 没有过多引入微服务相关组件,仅使用`eureka`注册中心方便测试服务远程调用
> 考虑加入更多组件但担心会增加项目依赖,影响体验!
* IDEA上使用项目 、OAuth2.0认证如何测试 在[HELP.md](./HELP.md) 文件中,需要自行查阅!