(6)Spring Security Oauth2 学习-下

gitee地址:https://gitee.com/GuoRanHao/spring-security-oauth2

 README.md

spring-security-oauth2 授权与认证 (授权码模式,基于内存和jdbc存储token 客户端详情 用户信息两种存储方案)---简易学习版

oauth2 授权码模式
(一)oauth2-server 基于内存的用户认证和客户端授权配置

演示:
(1)get 请求: localhost:8090/oauth/authorized?client_id=client&response_type=code
(2)跳转到登录界面:输入用户名密码 admin 123456(基于内存设置死的)
(3)弹出授权界面:选择approve 点击 authorized 授权
(4)浏览器跳转我们设置的回调地址 baidu.com 并携带授权码:code--> https://www.baidu.com/?code=7QbbQo
(5)我们携带code码,再去请求获取token,postman测试:post请求:http://client:secret@localhost:8090/oauth/token body设置x-www-form-urlencoded 参数 grant_type=authorization_code、code=7QbbQo
返回结果:
{
    "access_token": "d24ba68d-e83e-40ea-b0e7-5a918d955f3c",
    "token_type": "bearer",
    "expires_in": 43199,
    "scope": "app"
}
(6)拿到这个access_token 去请求资源就行了
注意:这里的授权码获取token一次后,就会失效。再次请求获取token的url
{
    "error": "invalid_grant",
    "error_description": "Invalid authorization code: 7QbbQo"
}
(二)oauth2-server2 基于jdbc的用户认证配置和客户端授权配置

演示:

(1)创建数据库oauth2,先导入spring-security-oauth2官方数据库地址: https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/test/resources/schema.sql 注意它的是hsql,如果我们用mysql 所以有些字段类型长度需修改。 下面就是mysql的建表语句:
create table oauth_client_details (
  client_id VARCHAR(128) PRIMARY KEY,
  resource_ids VARCHAR(256),
  client_secret VARCHAR(256),
  scope VARCHAR(256),
  authorized_grant_types VARCHAR(256),
  web_server_redirect_uri VARCHAR(256),
  authorities VARCHAR(256),
  access_token_validity INTEGER,
  refresh_token_validity INTEGER,
  additional_information VARCHAR(4096),
  autoapprove VARCHAR(256)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

create table oauth_client_token (
  token_id VARCHAR(256),
  token BLOB,
  authentication_id VARCHAR(128) not null,
  user_name VARCHAR(256) DEFAULT NULL,
  client_id VARCHAR(256) DEFAULT NULL,
	PRIMARY KEY(authentication_id)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

create table oauth_access_token (
  token_id VARCHAR(256) DEFAULT NULL,
  token BLOB,
  authentication_id VARCHAR(128) NOT NULL PRIMARY KEY,
  user_name VARCHAR(256) DEFAULT NULL,
  client_id VARCHAR(256) DEFAULT NULL,
  authentication BLOB,
  refresh_token VARCHAR(256)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

create table oauth_refresh_token (
  token_id VARCHAR(256) DEFAULT NULL,
  token BLOB,
  authentication BLOB
)ENGINE=INNODB DEFAULT CHARSET=utf8;

create table oauth_code (
  code VARCHAR(256) DEFAULT NULL, authentication BLOB
)ENGINE=INNODB DEFAULT CHARSET=utf8;

create table oauth_approvals (
	userId VARCHAR(256) DEFAULT NULL,
	clientId VARCHAR(256) DEFAULT NULL,
	scope VARCHAR(256) DEFAULT NULL,
	status VARCHAR(10) DEFAULT NULL,
	expiresAt TIMESTAMP,
	lastModifiedAt TIMESTAMP
)ENGINE=INNODB DEFAULT CHARSET=utf8;


-- customized oauth_client_details table
create table ClientDetails (
  appId VARCHAR(128) NOT NULL PRIMARY KEY,
  resourceIds VARCHAR(256) DEFAULT NULL,
  appSecret VARCHAR(256) DEFAULT NULL,
  scope VARCHAR(256) DEFAULT NULL,
  grantTypes VARCHAR(256) DEFAULT NULL,
  redirectUrl VARCHAR(256) DEFAULT NULL,
  authorities VARCHAR(256) DEFAULT NULL,
  access_token_validity int(11) DEFAULT NULL,
  refresh_token_validity int(11) DEFAULT NULL,
  additionalInformation VARCHAR(4096) DEFAULT NULL,
  autoApproveScopes VARCHAR(256) DEFAULT NULL
)ENGINE=INNODB DEFAULT CHARSET=utf8;
(2)、我们手动在oauth_client_details表 添加client信息,并且client_secret 是加密的,不能是明文(测试类对明文secret加密)
(3)、修改AuthorizationServerConfiguration 相关的tokenstore的配置和客户端详情jdbc的配置,以及新增数据源相关依赖和yml配置
(4)、新增基本的rbac权限模型数据库表(用户 角色 权限 两两关系表),并自己新增数据测试查询,以及用户密码加密(测试类执行获取密文)。
(5)、修改WebSecurityConfiguration配置类,将内存模式的用户设置改为jdbc配置,并编写重写相关校验方法。
(5)、使用MybatisCodeHelperPro 插件自动生成用户和权限实体以及相关业务类和mapper 配置mybatis,添加相关pom依赖,并在业务类添加方法
(4)、按照上边的演示进行演示。 (可以看到token 存入表中 oauth_access_token)
(三)、创建资源服务器模块:oauth2-resource

配置资源服务器config,并配置具体权限资源接口url(权限代码 对应数据库权限表和认证服务器中登录用户的拥有权限信息都要对应)

代码自动生成,创建 mvc 分层,访问接口资源(默认使用本地的数据库qd-mall 中的cms-help表作为实体案例)

根据上面的演示 获取token

拿着token 去调用资源请求 :localhost:8091/contents/user?access_token=sjfiahsi783ehqwjdh8sds

如果用户没有对应资源权限,会返回无权信息,有权限并且token正确,就会返回结果。

这里的资源服务器和认证服务器是分开的。其实也可以放在以前。

(四)、资源服务器中 增加了thymeleaf 模版引擎的学习和vue相关的语法学习和axios通信学习

vue 语法学习: if条件 、for循环 、axios通信 、v-on:click 点击事件 v-bind:xxx 绑定属性 、 v-model 数据双向绑定
vue 组件化component: 自定义组件和组件之间传值
vue 计算属性computed:(类似于缓存的作用,提高性能,cpu计算过的存在内存,下次直接取)
方法:计算密集型(cpu) 属性:属性密集型(内存)
vue 插槽slot (内容分发、自定义事件)
发布了116 篇原创文章 · 获赞 14 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/allensandy/article/details/104393535