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

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 之 第三方登录简单演示

    Spring Security OAuth2 Provider 是一个强大的安全框架,用于构建安全的Web应用和服务。在这个主题中,我们将探讨如何使用Spring Security作为OAuth2提供者,实现第三方登录的简单演示。OAuth2是一种授权框架,允许...

    spring-security-oauth2.rar

    本篇将深入探讨Spring Security OAuth2如何实现基于密码模式的用户登录以及如何使用数据库和Redis进行Token的存储与管理。 首先,OAuth2是一种授权协议,它允许第三方应用在用户授权的情况下访问受保护的资源。...

    SpringSecurity+oauth2+jwt.docx

    《Spring Security + OAuth2 + JWT 实现Web安全认证》 在现代Web开发中,安全认证是不可或缺的一部分。Spring Security作为Java领域中强大的安全框架,配合OAuth2和JWT(JSON Web Token),可以构建出高效且安全的...

    springboot与security oauth2整合例子

    当我们谈论"springboot与security oauth2整合例子",实际上是在讨论如何将OAuth2协议集成到Spring Boot和Spring Security中,以实现基于令牌(Token)的身份验证和授权机制。OAuth2是一种开放标准,用于授权第三方...

    SpringSecurity3.x源码工程

    2. **Authentication Provider**: 这是处理认证请求的组件,例如`DaoAuthenticationProvider`用于从数据库验证用户凭据。你可以根据需求自定义实现,如连接不同的身份验证服务。 3. **UserDetailsService**: 这是...

    Spring Security 学习总结1_3

    "springsecurity-namespace"可能指的是Spring Security的XML命名空间配置。在Spring Security的早期版本中,使用XML配置是最常见的实践。例如,你可能会看到以下片段: ```xml **" access="hasRole('ROLE_ADMIN')...

    springboot+security+cas集成demo

    2. **配置Spring Security**:在Spring Security的配置类中,设置安全策略,例如开启CAS认证,并指定CasAuthenticationFilter和CasAuthenticationEntryPoint。 3. **定义Service Provider**:在CAS服务器上,为...

    狂神spring-security静态资源.zip

    Spring Security 提供了多种认证方式,如表单登录、HTTP基本认证、OAuth2等。 - **授权**:定义了哪些认证过的用户可以访问哪些资源。Spring Security 使用访问决策管理器(Access Decision Manager)和访问决策...

    SpringSecurity权限管理

    4. **UserDetailsService**:这是SpringSecurity获取用户信息的接口,通常与数据库或其他持久化存储配合,用于加载用户及其角色。 5. **Role-Based Access Control (RBAC)**:RBAC是一种常用的权限模型,Spring...

    spring security 4.0.1

    Spring Security是Spring框架的一个核心组件,专注于提供全面的安全解决方案,包括认证、授权和访问控制。在Spring Security 4.0.1版本中,这个框架引入了一些重要的改进和更新,以增强其性能和安全性。 首先,...

    Spring Security 新手入门级maven实例

    **Spring Security新手入门级Maven实例...随着对Spring Security的深入学习,你将能够实现更复杂的场景,如OAuth2集成、记住我功能、CSRF防护、基于URL的访问控制等。不断实践和探索,你将成为Spring Security的专家。

    OAuth2-server-master.zip

    - **OAuth2 Provider**: 使用Spring Security OAuth2模块,我们可以轻松创建一个OAuth2授权服务器。 - **Authorization Code Grant Flow**: OAuth2中最常见的授权类型,用户通过浏览器重定向到授权服务器进行身份...

    Oauth2-mem-test.rar

    为了实现这些功能,开发者可能需要配置Spring Security的OAuth2 Resource Server,以处理来自OAuth2 Provider的令牌。同时,还需要设置Authorization Server来处理用户的登录、授权请求,生成访问令牌。这些令牌可以...

    spring-oauth2-login

    Spring OAuth2 Login是一个基于Spring Security框架的实现,用于在Web应用程序中集成OAuth2登录功能。这个项目的核心目标是提供一种安全、便捷的方式来让用户通过第三方身份验证服务(如Google、Facebook或GitHub)...

    SPRING SECURITY配置

    Spring Security还支持OAuth2,可以与其他服务进行安全交互,如Google、Facebook登录。 ### 8. 实战案例 - **防止CSRF攻击**:Spring Security默认开启CSRF保护,可通过配置禁用或调整策略。 - **RESTful API安全*...

    详解Spring Boot Oauth2缓存UserDetails到Ehcache

    import org.springframework.security.oauth2.provider.userDetailsService; import org.springframework.stereotype.Component; import javax.annotation.Resource; import org.springframework.cache.ehcache....

    详解spring security 配置多个AuthenticationProvider

    Spring Security 配置多个 AuthenticationProvider 详解 Spring Security 是一个功能强大且灵活的安全框架,提供了多种身份验证机制和访问控制机制。在实际开发中,我们经常需要配置多个身份验证提供程序...

    Spring Security认证权限管理

    Spring Security也支持OAuth2,可以实现第三方登录功能,如Google、Facebook登录。通过OAuth2,Spring Security可以帮助应用保护API,只允许经过授权的客户端访问。 **源码分析** 深入理解Spring Security需要研究...

    spring-security3 入门篇

    - **OAuth2集成**: 如何使用Spring Security与OAuth2结合,实现第三方登录功能。 - **CORS支持**: 设置跨域请求的安全策略,允许不同源的Web应用进行交互。 - **国际化的错误处理**: 如何定制Spring Security的...

    SpringSecurity3框架

    - **AuthenticationProvider**:处理用户认证,Spring Security内置了多种Provider,如`DaoAuthenticationProvider`用于数据库认证。 - **AccessDecisionManager**:处理访问决策,根据用户的权限判断是否允许访问...

Global site tag (gtag.js) - Google Analytics