Spring Security OAuth2.0(20):完善环境配置

文章目录

本章代码已提交至Gitee: https://gitee.com/lengcz/distributed-security01.git

环境配置

目前客户端信息和授权码仍然存储在内存中,生产环境中通过会存储在数据库中,下面完善环境的配置:

创建表

(1) 创建表

sql 复制代码
DROP TABLE IF EXISTS `oauth_client_details`;
CREATE TABLE `oauth_client_details` (
  `client_id` varchar(255) NOT NULL,
  `resource_ids` varchar(255) DEFAULT NULL,
  `client_secret` varchar(255) DEFAULT NULL,
  `scope` varchar(255) DEFAULT NULL,
  `authorized_grant_types` varchar(255) DEFAULT NULL,
  `web_server_redirect_uri` varchar(255) DEFAULT NULL,
  `authorities` varchar(255) DEFAULT NULL,
  `access_token_validity` int(11) DEFAULT NULL,
  `refresh_token_validity` int(11) DEFAULT NULL,
  `additional_information` varchar(255) DEFAULT NULL,
  `create_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  `archived` tinyint(4) DEFAULT NULL,
  `trusted` tinyint(4) DEFAULT NULL,
  `autoapprove` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`client_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of oauth_client_details
-- ----------------------------
INSERT INTO `oauth_client_details` VALUES ('c1', 'res1', '$2a$10$iL3DjyR4rTVdYwfp/jDtEurY7cLS7ZVZpShB72L5IFRkR/e9PiiWW', 'ROLE_ADMIN,ROLE_USER,ROLE_API', 'authorization_code,password,client_credentials,implicit,refresh_token', 'https://www.baidu.com/', 'ROLE_ADMIN,ROLE_USER,ROLE_API', '7200', '2592000', null, '2026-07-12 00:24:15', '0', '0', 'false');

DROP TABLE IF EXISTS `oauth_code`;
CREATE TABLE `oauth_code` (
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `code` varchar(255) NOT NULL,
  `authentication` blob NOT NULL,
  PRIMARY KEY (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

(2)修改UAA的AuthorizationServer,引入passwordEncoder,增加clientDetailsService

java 复制代码
@Autowired
    private PasswordEncoder passwordEncoder;

    @Bean
    public ClientDetailsService clientDetailsService(DataSource dataSource){
        ClientDetailsService clientDetailsService = new JdbcClientDetailsService(dataSource);//配置数据源
        ((JdbcClientDetailsService)clientDetailsService).setPasswordEncoder(passwordEncoder);//配置密码器
        return clientDetailsService;
    }

(3) 使用clientDetailsService

java 复制代码
 public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.withClientDetails(clientDetailsService); //使用自己的service
    }

(4)原来授权码存储在内存中,现在将授权码存储到数据库中

java 复制代码
//    @Bean
//    public AuthorizationCodeServices authorizationCodeServices(){
//        return new InMemoryAuthorizationCodeServices();//设置授权码模式的使用(授权码存在内存中),
//    }

    @Bean
    public AuthorizationCodeServices authorizationCodeServices(DataSource dataSource){
        return new JdbcAuthorizationCodeServices(dataSource);//设置授权码模式的使用(存储到数据库),
    }

(5) 启动UAA ,测试一下。

调用一下/uaa/oauth/token通过密码模式获取令牌

使用/uaa/oauth/check_token 查看令牌,校验令牌合法性。

比较内容是否和数据库一致

授权码测试,打开授权码的连接(注意配置的值需要和数据库中的值保持一致,或者在数据库中存在)

http://localhost:53020/uaa/oauth/authorize?client_id=c1\&response_type=code\&scope=ROLE_ADMIN\&redirect_uri=https://www.baidu.com

打开链接,登录后,提示授权,选择Approve ,并点击按钮。

然后查看oauth_code表,发现这个授权码存在数据库中。

遇到的问题

提示 Bad client credentials 认证错误

请检查 BCrypt格式的密码是否正确

java 复制代码
boolean eq = BCrypt.checkpw("明文","密文");//BCrypt比较
java 复制代码
System.out.println(BCrypt.hashpw("secret",BCrypt.gensalt()));//加密
相关推荐
Wang's Blog6 分钟前
Java框架 SpringCloud 快速入门: 服务拆分案例 Demo
java·开发语言·spring cloud
DongQiShanRen1 小时前
裁决台账双向互校(上):名册与实物的第一道对账
java·linux·运维·数据库·人工智能·自然语言处理·数据挖掘
cpolar技术支持1 小时前
Spring Boot 接口本地正常,异地前端却报跨域?用 cpolar 跑通 CORS 预检与白名单
java·springboot·cpolar·前后端分离·cors
高频因子挖掘机1 小时前
批量行情返回后,怎样把请求失败的股票单独挑出来?
后端·github·api
wuminyu1 小时前
Virtual Thread重投递至ForkJoinPool任务队列过程解析
java·linux·c语言·jvm·c++
小蒜学长1 小时前
在线保险服务与管理平台的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·服务平台·在线保险
掉进电商坑三年没爬出来的东叔2 小时前
青龙面板进阶:一个面板聚合多平台签到,所有积分自动领
java·开发语言
殷色玫瑰2 小时前
C++ STL:stack、queue、priority_queue 与容器适配器详解
java·开发语言·数据结构·c++·算法·visualstudio
IT方大同3 小时前
java输入输出+方法
java·开发语言·python
Yyyyyy~3 小时前
【Java】String
java