spring全家桶已经实现了OAuth2.0的全部功能(spring-cloud-starter-security、spring-security-oauth2-autoconfigure),我们只要引用对应库就可以了。
表结构
无论哪种认证方式,总要把数据存储起来(无论是在缓存还是DB),OAuth2.0依赖的数据一般是存放在DB中的,全部表结构可以参考这里
其中不能省的表就这一个:oauth_client_details(客户端信息配置,当然了表名可以自己随便改)
字段 | |
---|---|
client_id | 客户端唯一标识,有的场景叫AppKey,一个东西 |
resource_ids | 客户端能访问的资源ID集合,一般不用 |
client_secret | 客户端秘钥,这个很重要,不能泄露;有的场景叫AppSecret |
scope | 客户端申请的权限范围,完全自定义的字符串 |
authorized_grant_types | OAuth2.0支持的授权类型,可选值包括 authorization_code,password,refresh_token,implicit,client_credentials,支持多个 grant_type 用英文逗号分隔 |
web_server_redirect_uri | 客户端的重定向URI, 可为空。用来验证发起请求的参数与数据库中的配置是否一致 |
authorities | 客户端所拥有的 Spring Security 的权限,一般不用 |
access_token_validity | 客户端的 access_token 的有效时间值 (单位:秒), 可选,若不设定值则使用默认的有效时间值 (60 * 60 * 12, 12 小时) |
refresh_token_validity | 客户端的 refresh_token 的有效时间值 (单位:秒), 可选,若不设定值则使用默认的有效时间值 (60 * 60 * 24 * 30, 30 天) |
additional_information | 预留的字段,在 Oauth 的流程中没有实际的使用 |
autoapprove | 是否自动 Approval 操作,默认值为 false。只适用于 grant_type=“authorization_code” 的情况,当用户登录成功后,若该值为 true 或支持的 scope 值,则会跳过用户 Approve 的页面,直接授权 |
其它用户表、角色权限表、token存储表等等都可以用我们自己的业务表来做,token可以存放在redis中。
数据结构
用户信息
org.springframework.security.core.userdetails.User
private String password;
private final String username;
private final Set<GrantedAuthority> authorities;
private final boolean accountNonExpired;
private final boolean accountNonLocked;
private final boolean credentialsNonExpired;
private final boolean enabled;
这个类可以自定义,继承User就好了,一般都是用项目中的用户类。
权限信息
可以是菜单权限,也可以数据权限,这个完全根据业务来自定义。
比如使用业务系统的角色+权限关系表,就可以知道当前用户能操作哪些菜单/数据(Set authorities)。
加密方式(针对password模式)
认证过程中提交的密码不能是明文,如果不用默认的加密方式,可以自定义(必须与数据库中存储密码的加密方式匹配)。
@Bean
public PasswordEncoder passwordEncoder() {
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
自定义授权服务器配置
@Configuration
@AllArgsConstructor
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
private final DataSource data