OAuth2与 JWT 做认证授权服务
为了保证服务对外的安全性,往往都会在服务接口采用权限校验机制,为了防止客户端在发起请求中途被篡改数据等安全方面的考虑,还会有一些签名校验的机制。
在分布式微服务架构的系统中,我们把原本复杂的系统业务拆分成了若干个独立的微服务应用,我们不得不在每个微服务中都实现这样一套校验逻辑,这样就会有很多的代码和功能冗余,随着服务的扩大和业务需求的复杂度不断变化,修改校验逻辑变得相当麻烦,一处改,处处改。所以我们需要把认证授权服务单独出来,做成一个服务进行调用。
先新建springboot服务 myuaa.添加依赖
<!--rest接口依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--数据库依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<!--自定义配置依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--认证依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
application.yml
#服务器配置
server:
#端口
port: 9999
#服务器发现注册配置
eureka:
client:
serviceUrl:
#配置服务中心(可配置多个,用逗号隔开)
defaultZone: http://${
user.name}:${
user.password}@192.168.0.112:8761/eureka
#spring配置
spring:
#应用配置
application:
#名称: OAuth2认证授权服务
name: myuaa
#数据库配置
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:mysql://192.168.0.61:3307/myuaa?useUnicode=true&characterEncoding=utf8&useSSL=false
username: root
password: 123456
hikari:
auto-commit: false
data-source-properties:
cachePrepStmts: true
prepStmtCacheSize: 250
prepStmtCacheSqlLimit: 2048
useServerPrepStmts: true
user:
name: admin
password: admin_1
我这里用的是mysql 加 mybatis,这些都不是什么问题.数据库框架自己选择
主要是我将用户与角色持久化到数据库中,方便管理
user表
public class User {
private Long id;
private String login; //用户
private String password; //密码(因为OAuth2较新的版本都是需要密码加密的,存入时记得加密)
private String roles; //角色,多个角色以","分隔, 须臾springsecurity对应,
//"ROLE_ADMIN,ROLE_USER"
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRoles() {
return roles;
}
public void setRoles(String roles) {
this.roles = roles;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", login='" + login + '\'' +
", password='" + password + '\'' +
", roles='" + roles + '\'' +
'}';
}
}
密码加密存储,较新版本必须加密,在后面配置中必须加密,这里与后面一致
import org.springframework.security.crypto.password.PasswordEncoder;
@Autowired
private UserMapper userMapper;//dao层
@Autowired
private PasswordEncoder passwordEncod