`
rensanning
  • 浏览: 3513529 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
Efef1dba-f7dd-3931-8a61-8e1c76c3e39f
使用Titanium Mo...
浏览量:37470
Bbab2146-6e1d-3c50-acd6-c8bae29e307d
Cordova 3.x入门...
浏览量:604277
C08766e7-8a33-3f9b-9155-654af05c3484
常用Java开源Libra...
浏览量:677980
77063fb3-0ee7-3bfa-9c72-2a0234ebf83e
搭建 CentOS 6 服...
浏览量:87228
E40e5e76-1f3b-398e-b6a6-dc9cfbb38156
Spring Boot 入...
浏览量:399796
Abe39461-b089-344f-99fa-cdfbddea0e18
基于Spring Secu...
浏览量:69057
66a41a70-fdf0-3dc9-aa31-19b7e8b24672
MQTT入门
浏览量:90457
社区版块
存档分类
最新评论

Spring Security OAuth2 Provider 之 数据库存储

 
阅读更多
默认配置都是InMemory的,比如授权码,令牌,客户端信息等,实际应用时,应该是存入数据库里的。这里以PostgreSQL为例。

相关文章:
Spring Security OAuth2 Provider 之 最小实现
Spring Security OAuth2 Provider 之 数据库存储
Spring Security OAuth2 Provider 之 第三方登录简单演示
Spring Security OAuth2 Provider 之 自定义开发
Spring Security OAuth2 Provider 之 整合JWT

(1)修改代码
基于前一篇最小化实现,需要改动以下代码:

pom.xml
<dependency>  
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <scope>runtime</scope>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-jdbc</artifactId>
</dependency>


application.properties
spring.datasource.url=jdbc:postgresql://localhost:5432/oauth2
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.username=user
spring.datasource.password=pass


@Configuration
@EnableAuthorizationServer
static class OAuthAuthorizationConfig extends AuthorizationServerConfigurerAdapter {
    @Autowired
    private Environment env;
    
    @Bean
    public DataSource dataSource() {
        final DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
        dataSource.setUrl(env.getProperty("spring.datasource.url"));
        dataSource.setUsername(env.getProperty("spring.datasource.username"));
        dataSource.setPassword(env.getProperty("spring.datasource.password"));
        return dataSource;
    }
    
    @Bean
    public ApprovalStore approvalStore() {
        return new JdbcApprovalStore(dataSource());
    }
    @Bean
    protected AuthorizationCodeServices authorizationCodeServices() {
        return new JdbcAuthorizationCodeServices(dataSource());
    }
    @Bean
    public TokenStore tokenStore() {
        return new JdbcTokenStore(dataSource());
    }
    
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.jdbc(dataSource()); // oauth_client_details
    }
    
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
		endpoints.approvalStore(approvalStore()) 							// oauth_approvals
		         .authorizationCodeServices(authorizationCodeServices()) 	// oauth_code
				 .tokenStore(tokenStore()); 								// oauth_access_token & oauth_refresh_token
    }
}


(2)数据库表

总共有5张表:
  • oauth_access_token:访问令牌
  • oauth_refresh_token:更新令牌
  • oauth_client_details:客户端信息
  • oauth_code:授权码
  • oauth_approvals:授权记录
*** oauth_client_token表比较特殊不用于Provider,是客户端用的

CREATE TABLE oauth_access_token
(
  token_id character varying(256), -- MD5加密的access_token的值
  token bytea, -- OAuth2AccessToken.java对象序列化后的二进制数据
  authentication_id character varying(256), -- MD5加密过的username,client_id,scope
  user_name character varying(256), -- 登录的用户名
  client_id character varying(256), -- 客户端ID
  authentication bytea, -- OAuth2Authentication.java对象序列化后的二进制数据
  refresh_token character varying(256) -- MD5加密果的refresh_token的值
);
COMMENT ON COLUMN oauth_access_token.token_id IS 'MD5加密的access_token的值';
COMMENT ON COLUMN oauth_access_token.token IS 'OAuth2AccessToken.java对象序列化后的二进制数据';
COMMENT ON COLUMN oauth_access_token.authentication_id IS 'MD5加密过的username,client_id,scope';
COMMENT ON COLUMN oauth_access_token.user_name IS '登录的用户名';
COMMENT ON COLUMN oauth_access_token.client_id IS '客户端ID';
COMMENT ON COLUMN oauth_access_token.authentication IS 'OAuth2Authentication.java对象序列化后的二进制数据';
COMMENT ON COLUMN oauth_access_token.refresh_token IS 'MD5加密果的refresh_token的值';

CREATE TABLE oauth_approvals
(
  userid character varying(256), -- 登录的用户名
  clientid character varying(256), -- 客户端ID
  scope character varying(256), -- 申请的权限
  status character varying(10), -- 状态(Approve或Deny)
  expiresat timestamp without time zone, -- 过期时间
  lastmodifiedat timestamp without time zone -- 最终修改时间
);
COMMENT ON COLUMN oauth_approvals.userid IS '登录的用户名';
COMMENT ON COLUMN oauth_approvals.clientid IS '客户端ID';
COMMENT ON COLUMN oauth_approvals.scope IS '申请的权限';
COMMENT ON COLUMN oauth_approvals.status IS '状态(Approve或Deny)';
COMMENT ON COLUMN oauth_approvals.expiresat IS '过期时间';
COMMENT ON COLUMN oauth_approvals.lastmodifiedat IS '最终修改时间';

CREATE TABLE oauth_client_details
(
  client_id character varying(256) NOT NULL, -- 客户端ID
  resource_ids character varying(256), -- 资源ID集合,多个资源时用逗号(,)分隔
  client_secret character varying(256), -- 客户端密匙
  scope character varying(256), -- 客户端申请的权限范围
  authorized_grant_types character varying(256), -- 客户端支持的grant_type
  web_server_redirect_uri character varying(256), -- 重定向URI
  authorities character varying(256), -- 客户端所拥有的Spring Security的权限值,多个用逗号(,)分隔
  access_token_validity integer, -- 访问令牌有效时间值(单位:秒)
  refresh_token_validity integer, -- 更新令牌有效时间值(单位:秒)
  additional_information character varying(4096), -- 预留字段
  autoapprove character varying(256), -- 用户是否自动Approval操作
  CONSTRAINT oauth_client_details_pkey PRIMARY KEY (client_id)
);
COMMENT ON COLUMN oauth_client_details.client_id IS '客户端ID';
COMMENT ON COLUMN oauth_client_details.resource_ids IS '资源ID集合,多个资源时用逗号(,)分隔';
COMMENT ON COLUMN oauth_client_details.client_secret IS '客户端密匙';
COMMENT ON COLUMN oauth_client_details.scope IS '客户端申请的权限范围';
COMMENT ON COLUMN oauth_client_details.authorized_grant_types IS '客户端支持的grant_type';
COMMENT ON COLUMN oauth_client_details.web_server_redirect_uri IS '重定向URI';
COMMENT ON COLUMN oauth_client_details.authorities IS '客户端所拥有的Spring Security的权限值,多个用逗号(,)分隔';
COMMENT ON COLUMN oauth_client_details.access_token_validity IS '访问令牌有效时间值(单位:秒)';
COMMENT ON COLUMN oauth_client_details.refresh_token_validity IS '更新令牌有效时间值(单位:秒)';
COMMENT ON COLUMN oauth_client_details.additional_information IS '预留字段';
COMMENT ON COLUMN oauth_client_details.autoapprove IS '用户是否自动Approval操作';

CREATE TABLE oauth_client_token
(
  token_id character varying(256), -- MD5加密的access_token值
  token bytea, -- OAuth2AccessToken.java对象序列化后的二进制数据
  authentication_id character varying(256), -- MD5加密过的username,client_id,scope
  user_name character varying(256), -- 登录的用户名
  client_id character varying(256) -- 客户端ID
);
COMMENT ON COLUMN oauth_client_token.token_id IS 'MD5加密的access_token值';
COMMENT ON COLUMN oauth_client_token.token IS 'OAuth2AccessToken.java对象序列化后的二进制数据';
COMMENT ON COLUMN oauth_client_token.authentication_id IS 'MD5加密过的username,client_id,scope';
COMMENT ON COLUMN oauth_client_token.user_name IS '登录的用户名';
COMMENT ON COLUMN oauth_client_token.client_id IS '客户端ID';

CREATE TABLE oauth_code
(
  code character varying(256), -- 授权码(未加密)
  authentication bytea -- AuthorizationRequestHolder.java对象序列化后的二进制数据
);
COMMENT ON COLUMN oauth_code.code IS '授权码(未加密)';
COMMENT ON COLUMN oauth_code.authentication IS 'AuthorizationRequestHolder.java对象序列化后的二进制数据';

CREATE TABLE oauth_refresh_token
(
  token_id character varying(256), -- MD5加密过的refresh_token的值
  token bytea, -- OAuth2RefreshToken.java对象序列化后的二进制数据
  authentication bytea -- OAuth2Authentication.java对象序列化后的二进制数据
);
COMMENT ON COLUMN oauth_refresh_token.token_id IS 'MD5加密过的refresh_token的值';
COMMENT ON COLUMN oauth_refresh_token.token IS 'OAuth2RefreshToken.java对象序列化后的二进制数据';
COMMENT ON COLUMN oauth_refresh_token.authentication IS 'OAuth2Authentication.java对象序列化后的二进制数据';


手动插入一条客户端信息:
INSERT INTO oauth_client_details(client_id, resource_ids, client_secret, scope, authorized_grant_types, web_server_redirect_uri, authorities, access_token_validity, refresh_token_validity, additional_information, autoapprove)
    VALUES ('oauth_client', null, 'oauth_client_secret', 'read,write', 'authorization_code,refresh_token', 'http://default-oauth-callback.com', 'ROLE_USER', 1800, 86400, null, false);


以上DDL文修改自官方提供的测试版本:
https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/test/resources/schema.sql

测试确认的过程和上一篇完全一样。每执行完一步,可以到数据库对应的表中查看确认值。
2
0
分享到:
评论
3 楼 cbn_1992 2019-04-03  
博主,采用jdbctoken也就是数据库形式之后,反复点击获取token的接口,就会报duplicate key value violates unique constraint "oauth_access_token_pkey" 博主遇到过吗
2 楼 安静听歌 2018-04-02  
IT小新 写道
您好啊博主,就是为什么是这样的五张表呢,名字就是这样叫的,在哪里可以找到相关根据啊

在源码里边,可以通过工具搜索出来
1 楼 IT小新 2017-10-27  
您好啊博主,就是为什么是这样的五张表呢,名字就是这样叫的,在哪里可以找到相关根据啊

相关推荐

    Spring Security OAuth2 Provider 之 第三方登录简单演示

    NULL 博文链接:https://rensanning.iteye.com/blog/2386309

    oauth2-family-barrel:OAuth2全家桶项目。本项目演示了如何使用spring-boot,spring-security以及spring-security-oauth快速构建OAuth2服务框架体系

    oauth2-family-barrel OAuth2全家桶 什么是oauth2-family-barrel oauth2-family-barrel项目,即OAuth2全家桶项目。 本项演示了如何使用 以及 快速整合一套基于OAuth2协议的鉴权,授权服务中心,客户端以及遵循...

    授权服务器:Spring Boot OAuth 2.0和OpenID Connect身份提供者授权服务器

    授权服务器兼容OAuth 2.0和OpenID Connect(OIDC)的授权服务器,仅用于演示目的,可用作OAuth2 / OIDC研讨会的一部分。目标此授权服务器应... 作为开源免费提供支持学习OAuth2 / OpenID Connect的努力(自学或作为...

    xmljava系统源码-simple-oauth2:一个简单oauth2应用服务,为第三方应用提供用户登录和授权

    2. 为什么有这个项目 OAuth 2.0作为一个业界的授权代理模式,已经有广泛的应用。其在业界有很多较好的实现,无论是spring security/shiro,还是keycloak/gravitee/mitreid connect等等,都是非常不错并值得借鉴的...

    cxf+spring webservice jar包

    oauth-provider-20100527.jar opensaml-2.5.1-1.jar openws-1.4.2-1.jar relaxngDatatype-20020414.jar saaj-api-1.3.4.jar saaj-impl-1.3.19.jar serializer-2.7.1.jar slf4j-api-1.6.2.jar slf4j-jdk14-1.6.2.jar ...

    play-framework-reactivemongo-oauth2.0:这是示例应用程序,我们在其中使用了 Play-Framework 2.3.x、Scala 2.11.x、ReactiveMongo-Extensions、Cake-Patter 和 Scala Oauth 2.0

    使用 Play-Framework 2.3.x 的 Scala Oauth 2.0 在这个示例应用程序中,我们使用Oauth2.0创建带有Play-Framework 2.3.x 、 ReactiveMongo-Extensions 、 Cake-Pattern和Scala-Oauth2-Provider 的API。 我们使用 ...

    cxf(jax-ws)+spring+hibernate整合包

    1.1.jar,log4j-1.2.14.jar,mina-core-2.0.7.jar,mssqlserver2.jar,msv-core-2011.1.jar,neethi-3.0.2.jar,oauth-20100527.jar,oauth-provider-20100527.jar,opensaml-2.5.1-1.jar,openws-1.4.2-1.jar,...

    java开源包2

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包1

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包11

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包3

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包6

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包5

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包10

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包4

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包8

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包7

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包9

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包101

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    Java资源包01

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

Global site tag (gtag.js) - Google Analytics