摘要:基于实现数据库版文章代码地址链接描述可以下载直接运行,基于,版本实现该系列分为两个部分分为内存实现,数据库实现。其中数据库实现采用权限角色管理。创建的时候,需要使用数据源,从数据库查询。基于数据库的认证服务完成。
基于spring-security-oauth2实现oauth2数据库版
文章代码地址:链接描述可以下载直接运行,基于springboot2.1.5,springcloud Greenwich版本实现
该系列分为两个部分:分为内存实现,数据库实现。其中数据库实现采用RBAC权限角色管理。
上一篇,介绍了oauth2的内存实现,也就是认证服务把客户端和用户信息都存储在内存中,这样不利于拓展,不适合于生产环境。下面,我们开始基于mysql数据库的oauth2实现。
首先,我们创建oauth2数据库,注意编码选择utf-8mb4格式,utf-8是不规范的,mysql也没有进行更改。
好了,现在我们初始化表,sql如下:
Drop table if exists oauth_client_details;
create table oauth_client_details (
client_id VARCHAR(255) PRIMARY KEY,
resource_ids VARCHAR(255),
client_secret VARCHAR(255),
scope VARCHAR(255),
authorized_grant_types VARCHAR(255),
web_server_redirect_uri VARCHAR(255),
authorities VARCHAR(255),
access_token_validity INTEGER,
refresh_token_validity INTEGER,
additional_information TEXT,
autoapprove VARCHAR (255) default "false"
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Drop table if exists oauth_access_token;
create table oauth_access_token (
token_id VARCHAR(255),
token BLOB,
authentication_id VARCHAR(255),
user_name VARCHAR(255),
client_id VARCHAR(255),
authentication BLOB,
refresh_token VARCHAR(255)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Drop table if exists oauth_refresh_token;
create table oauth_refresh_token (
token_id VARCHAR(255),
token BLOB,
authentication BLOB
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Drop table if exists oauth_code;
create table oauth_code (
code VARCHAR(255),
authentication BLOB
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- Add indexes
create index token_id_index on oauth_access_token (token_id);
create index authentication_id_index on oauth_access_token (authentication_id);
create index user_name_index on oauth_access_token (user_name);
create index client_id_index on oauth_access_token (client_id);
create index refresh_token_index on oauth_access_token (refresh_token);
create index token_id_index on oauth_refresh_token (token_id);
create index code_index on oauth_code (code);
-- INSERT DEFAULT DATA
INSERT INTO oauth_client_details VALUES ("dev", "", "dev", "app", "authorization_code", "http://localhost:7777/", "", "3600", "3600", "{"country":"CN","country_code":"086"}", "TAIJI");
-- ----------------------------
-- Table structure for tb_user
-- ----------------------------
DROP TABLE IF EXISTS tb_user;
CREATE TABLE tb_user (
`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT "主键ID", `username` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT "用户名", `password` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT "密码", `gender` int(2) DEFAULT NULL COMMENT "性别(1男 2女)", `email` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT "邮箱", `create_time` datetime DEFAULT NULL COMMENT "用户创建时间", `update_time` datetime DEFAULT NULL COMMENT "更新时间", `removed` int(2) DEFAULT NULL COMMENT "是否删除(1删除0未删除)", PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
-- ----------------------------
-- Records of tb_user
-- ----------------------------
BEGIN;
INSERT INTO tb_user VALUES (1, "admin", "$2a$10$vWyL7fMGQRvVNn.i2bK40e3z30Nem4k.ElwuxdLBNzKFxRCcXCoqm", 1, NULL, "2019-05-30 15:53:45", "2019-05-30 15:53:51", 0);
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
-- ----------------------------
-- Table structure for tb_user_role
-- ----------------------------
DROP TABLE IF EXISTS tb_user_role;
CREATE TABLE tb_user_role (
`id` bigint(11) NOT NULL COMMENT "主键ID", `user_id` bigint(11) DEFAULT NULL COMMENT "用户主键", `role_id` bigint(11) DEFAULT NULL COMMENT "角色ID", PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
-- ----------------------------
-- Records of tb_user_role
-- ----------------------------
BEGIN;
INSERT INTO tb_user_role VALUES (1, 1, 1);
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
-- ----------------------------
-- Table structure for tb_role
-- ----------------------------
DROP TABLE IF EXISTS tb_role;
CREATE TABLE tb_role (
`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT "主键ID", `parent_id` bigint(20) DEFAULT NULL COMMENT "父类ID", `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT "角色名字", `ename` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT "角色名字", `description` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT "描述", `create_time` datetime DEFAULT NULL COMMENT "创建时间", `update_time` datetime DEFAULT NULL COMMENT "更新时间", PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
-- ----------------------------
-- Records of tb_role
-- ----------------------------
BEGIN;
INSERT INTO tb_role VALUES (1, 0, "超级管理员", "ADMIN", NULL, "2019-05-30 16:09:53", "2019-05-30 16:09:57");
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
-- ----------------------------
-- Table structure for tb_role_permission
-- ----------------------------
DROP TABLE IF EXISTS tb_role_permission;
CREATE TABLE tb_role_permission (
`id` bigint(11) NOT NULL COMMENT "主键ID", `role_id` bigint(11) DEFAULT NULL COMMENT "角色ID", `permission_id` bigint(11) DEFAULT NULL COMMENT "权限ID", PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
-- ----------------------------
-- Records of tb_role_permission
-- ----------------------------
BEGIN;
INSERT INTO tb_role_permission VALUES (1, 1, 1);
INSERT INTO tb_role_permission VALUES (2, 1, 2);
INSERT INTO tb_role_permission VALUES (3, 1, 3);
INSERT INTO tb_role_permission VALUES (4, 1, 4);
INSERT INTO tb_role_permission VALUES (5, 1, 5);
INSERT INTO tb_role_permission VALUES (6, 1, 6);
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
-- ----------------------------
-- Table structure for tb_permission
-- ----------------------------
DROP TABLE IF EXISTS tb_permission;
CREATE TABLE tb_permission (
`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT "主键ID", `parent_id` bigint(11) DEFAULT NULL COMMENT "用户ID", `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT "权限名字", `ename` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT "权限名字", `url` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT "请求路径", `description` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT "描述", `create_time` datetime DEFAULT NULL COMMENT "创建时间", `update_time` datetime DEFAULT NULL COMMENT "更新时间", PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
-- ----------------------------
-- Records of tb_permission
-- ----------------------------
BEGIN;
INSERT INTO tb_permission VALUES (1, 0, "系统管理", "System", "/", NULL, "2019-05-30 16:22:20", "2019-05-30 16:22:24");
INSERT INTO tb_permission VALUES (2, 0, "用户管理", "SystemUser", "/users", NULL, "2019-05-30 16:23:28", "2019-05-30 16:23:32");
INSERT INTO tb_permission VALUES (3, 0, "查看用户", "SystemUserView", NULL, NULL, "2019-05-30 16:24:29", "2019-05-30 16:24:33");
INSERT INTO tb_permission VALUES (4, 0, "新增用户", "SystemUserInsert", NULL, NULL, "2019-05-30 16:25:09", "2019-05-30 16:25:13");
INSERT INTO tb_permission VALUES (5, 0, "编辑用户", "SystemUserUpdate", NULL, NULL, "2019-05-30 16:25:53", "2019-05-30 16:25:57");
INSERT INTO tb_permission VALUES (6, 0, "删除用户", "SystemUserDelete", NULL, NULL, "2019-05-30 16:26:49", "2019-05-30 16:26:54");
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
我们看看表结构:
简单介绍,这是把客户端配置从内存中转移到oauth_client_details表中,字段意思请参考上一篇链接描述
oauth_access_token: access_token 表结构:
oauth_code表结构:
oauth_refresh_token表结构:
下面是用户信息表:
tb_user表:
tb_user_role表结构:
tb_role表结构:
tb_role_permission表结构:
tb_permission表结构:
(1)我们把之前的项目复制一份修改名字,添加依赖:
我们添加数据库的依赖,使用mybatis作为持久层框架。
(2)下面是项目结构:
这里介绍intellij的mybatis自动生成插件easycode,只要配置好数据库连接,可以自动生成domain,mapper,xml等文件。
首先,修改WebSecurityConfig文件如下:
这里将内存换到数据库,使用userDetailsService,因为,我们需要注入UserDetailsService,创建UserDetailsServiceImpl文件
这里实现UserDetailsService接口,实现loadUserByUsername方法,这个方法根据用户名查询用户信息,查询用户权限,返回认证用户import org.springframework.security.core.userdetails.User; userdetails包下的User对象。
这里重点介绍一下查询权限的sql:
通过连表用户,角色,权限等连表查询权限。
(3)用户验证完成,开始认证处理,修改AuthConfig如下:
这里我们将客户端client放到数据库,使用JdbcClientDetailsService。创建service的时候,需要使用DataSource数据源,从数据库查询。使用jdbcTokenStore存储token。
(4)创建OauthPasswordConfig配置注入BCrytpPasswordEncoder对象:
(5)实体类如下:
(6)应用配置文件:
(7)完成,现在我们使用9001端口启动应用:
(8)启动成功,我们访问地址:
http://localhost:9001/oauth/oauthorize?client_id=client&response_type=code/
如下:
输入账户:admin 密码: 123456 点击登录:
同意授权
跳转成功,我们使用code,访问这个地址,获取token
http://client:secret@http://localhost:9001/oauth/token
得到结果:
成功,得到access_token。
基于数据库的认证服务完成。未完待续,下一篇介绍单点登录
有问题,请留言。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/74728.html
摘要:基于实现资源服务器文章代码地址链接描述可以下载直接运行,基于,版本实现。资源服务器顾名思义就是提供资源的服务器。和认证服务器对接后,将受到资源的保护。基于的资源服务器实现完成,未完待续,下一篇将实现单点登录和网关的对接。 基于spring-security-oauth2实现资源服务器 文章代码地址:链接描述可以下载直接运行,基于springboot2.1.5,springcloud ...
摘要:认证服务器和浏览器控制台也没有报错信息。这里简单介绍下如何查阅源码,首先全局搜索自己的配置因为这个地址是认证服务器请求授权的,所以,请求认证的过滤器肯定包含他。未完待续,下一篇介绍资源服务器和认证服务器的集成。 基于spring-security-oauth2-实现单点登录 文章代码地址:链接描述可以下载直接运行,基于springboot2.1.5,springcloud Green...
阅读 963·2021-09-30 09:58
阅读 2785·2021-09-09 11:55
阅读 1930·2021-09-01 11:41
阅读 963·2019-08-30 15:55
阅读 3252·2019-08-30 12:50
阅读 3456·2019-08-29 18:37
阅读 3253·2019-08-29 16:37
阅读 1966·2019-08-29 13:00