以下对spring-oauth-server项目中的 oauth.ddl initial_db.ddl文件(位于/others/database目录)中的表字及段进行说明, 内容包括字段说明与使用场景等

表名 字段名 字段类型 字段说明
oauth2_registered_client id varchar 主键,系统自动生成
archived tinyint 用于标识客户端是否已存档(即实现逻辑删除),默认值为'0'(即未存档).
对该字段的具体使用请参考CustomJdbcClientDetailsService.java,在该类中,扩展了在查询client_details的SQL加上archived = 0条件 (扩展字段)
create_time datetime 数据的创建时间,精确到秒,由数据库在插入数据时取当前系统时间自动生成(扩展字段)
updated_time timestamp 数据的最后更新时间,由数据库自行更新维护
client_id varchar 唯一,不能为空.
用于唯一标识每一个客户端(client); 在注册时必须填写(也可由服务端自动生成).
对于不同的grant_type,该字段都是必须的. 在实际应用中的另一个名称叫appKey,与client_id是同一个概念.
client_id_issued_at timestamp client_id的签发时间, 默认为数据创建时间
client_secret varchar 用于指定客户端(client)的访问密匙; 在注册时必须填写(也可由服务端自动生成),加密保存.
对于不同的grant_type,该字段都是必须的. 在实际应用中的另一个名称叫appSecret,与client_secret是同一个概念.
client_secret_expires_at datetime client_secret的过期时间,null表示永不过期
client_name varchar 客户端(client)的名称,一般是一个有业务意义的名称
client_authentication_methods varchar 认证支持的方式,多个由逗号分隔; 如: client_secret_basic,client_secret_post; 一般指认证时传递client_secret支持哪些方式
authorization_grant_types varchar 指定客户端支持的grant_type,可选值包括authorization_code,urn:ietf:params:oauth:grant-type:device_code,refresh_token, urn:ietf:params:oauth:grant-type:jwt-bearer,client_credentials, 若支持多个grant_type用逗号(,)分隔,如: "authorization_code,refresh_token".
在实际应用中,当注册时,该字段是一般由服务器端指定的,而不是由申请者去选择的,最常用的grant_type组合有: "authorization_code,refresh_token"(针对通过浏览器访问的客户端); "client_credentials"(针对另一个服务端的场景,不需要用户参与).
urn:ietf:params:oauth:grant-type:device_codeurn:ietf:params:oauth:grant-type:jwt-bearer是OAuth2.1中新增.
redirect_uris varchar OAuth2 认证后回调uri, 一般传递code, 多个由逗号分隔; 可为空, 当grant_type为authorization_code时, 在OAuth的流程中会使用并检查与注册时填写的redirect_uri是否一致. 下面分别说明:
  • 当grant_type=authorization_code时, 第一步 从 spring-oauth-server获取 'code'时客户端发起请求时必须有redirect_uri参数, 该参数的值必须与 web_server_redirect_uri的值一致. 第二步 用 'code' 换取 'access_token' 时客户也必须传递相同的redirect_uri.
    在实际应用中, redirect_uris在注册时是必须填写的, 一般用来处理服务器返回的code, 验证state是否合法与通过code去换取access_token值.
    spring-oauth-client项目中, 可具体参考AuthorizationCodeController.java中的authorizationCodeCallback方法.
post_logout_redirect_uris varchar OAuth2 退出时 post 的客户端重定向 uri; 可选 多个由逗号分隔, 一般在client注册时可填写
scopes varchar 指定客户端申请的权限范围,可选值在OIDC协议中定义, 包括openid,profile,email,address,phone;若有多个值用逗号(,)分隔,如: "openid,email".
openid是必须有的,其他值若有则在获取的id_token中会包含对应的值.
在实际应该中, 该值一般由服务端指定, 常用的值为openid.
client_settings varchar 客户端的各类设置, 如是否支持PKCE,用户授权(consent)确认是否必须等; 详见代码ClientSettings.java; 此字段存储JSON格式的数据值.
token_settings varchar 对token的各类设置; 如 token有效期, refresh_token有效期等; 详见代码TokenSettings.java; 此字段存储JSON格式的数据值.

在项目中,主要操作oauth2_registered_client表的类是ClientDetailsController.java, OauthClientDetails.java更多的细节请参考该类; 也可以根据实际的需要,去扩展或修改该类的实现.

oauth2_authorization id varchar 主键
registered_client_id varchar 外键, 关联oauth2_registered_client的id字段
principal_name varchar 认证名称, 一般指用户名或clientId; 对应OIDC中的sub字段
authorization_grant_type varchar OAuth2的 grant_type 类型
authorized_scopes varchar 此次授权的范围(scope)
attributes blob 进行认证授权的各类信息,JSON格式
state varchar 认证请求中传递的 state 值
authorization_code_value blob authorization_code流程中的code
authorization_code_issued_at datetime authorization_code流程中的code签发时间
authorization_code_expires_at datetime authorization_code流程中的code过期时间
authorization_code_metadata blob authorization_code流程中的code的属性设置, 如值是否有效
access_token_value blob access_token 值
access_token_issued_at datetime access_token 签发时间
access_token_expires_at datetime access_token 过期时间
access_token_metadata blob access_token 属性设置, 如各类claims中的属性与值
access_token_type varchar access_token 类型, 一般是Bearer
access_token_scopes varchar 此次授权的scope范围值,如: openid,profile
oidc_id_token_value blob OIDC中id_token 值
oidc_id_token_issued_at datetime id_token 签发时间
oidc_id_token_expires_at datetime id_token 过期时间
oidc_id_token_metadata blob id_token 属性设置, 如各类claims中的属性与值
refresh_token_value blob refresh_token 值
refresh_token_issued_at datetime refresh_token 签发时间
refresh_token_expires_at datetime refresh_token 过期时间
refresh_token_metadata blob refresh_token 属性设置, 如是否复用(reuse)
user_code_value blob device_code流程中的user_code值
user_code_issued_at datetime user_code 签发时间
user_code_expires_at datetime user_code 过期时间
user_code_metadata blob user_code 属性设置, 如是否已经验证
device_code_value blob device_code流程中的device_code值
device_code_issued_at datetime device_code 签发时间
device_code_expires_at datetime device_code 过期时间
device_code_metadata blob device_code 属性设置, 如是否已经验证
updated_time timestamp 数据的最后修改时间, 由数据库自动维护更新

该表用于存储在OAuth2.1授权过程中各类信息数据, 支持各类grant_type场景; 对oauth2_authorization表的主要操作在JdbcOAuth2AuthorizationService.java类中, 更多的细节请参考该类.
注意: 若对性能有要求, 此表的数据存储设计需要进行优化(如存redis或利用JWT特性简化一些不必要的存储字段).

oauth2_authorization_consent registered_client_id varchar 外键, 关联oauth2_registered_client表的id字段
principal_name varchar 认证名称, 一般指用户名或clientId; 对应OIDC中的sub字段
authorities varchar 授权确认过期中的属性, 如scope范围
updated_time timestamp 数据的最后修改时间, 由数据库自动维护更新

该表主要存储在授权过程中需要用户进行确认(consent)的信息; 在项目中,主要操作oauth2_authorization_consent表的对象是JdbcOAuth2AuthorizationConsentService.java. 更多的细节请参考该类.

user_ id int 主键, 自增长, 数据库自动生成
guid varchar 唯一, 业务id
create_time datetime 数据创建时间
updated_time timestamp 数据的最后修改时间, 由数据库自动维护更新
username varchar 用户名, 非空, 唯一
password varchar 密码, 加密存储, 非空
enabled tinyint 是否启用, 默认1(即启用)
phone varchar 手机号
email varchar 邮箱地址
address varchar 个人地址
nickname varchar 用户昵称, 别名
updated_at int 最后数据更新时间值
default_user tinyint 是否默认用户, 默认0(不是); 只用在初始化数据时使用
last_login_time datetime 最后登录时间

在项目中,主要使用user_表的对象是UserServiceImpl.java; 对应的实体是User.java; 在Spring Security中, 此表存储的数据对应UserDetails.java类.

user_privilege user_id int 外键, 关联user_的id字段
privilege varchar 权限值, 如: ROLE_USER

此表存储用户的权限值, 一个用户可以有多个权限值.


© 2013 - 2023 spring-oauth-server