ApiBoot是一款基於SpringBoot1.x,2.x的接口服務集成基礎框架, 內部提供了框架的封裝集成、使用擴展、自動化完成配置,讓接口開發者能夠選着性完成開箱即用, 再也不爲搭建接口框架而犯愁,從而極大的提升開發效率。html
在pom.xml
配置文件內添加以下:java
<!--ApiBoot Security Oauth-->
<dependency>
<groupId>org.minbox.framework</groupId>
<artifactId>api-boot-starter-security-oauth-jwt</artifactId>
</dependency>
複製代碼
ApiBoot
所提供的依賴都不須要添加版本號,可是須要添加版本依賴,具體查看ApiBoot版本依賴mysql
ApiBoot
在整合SpringSecurity
、Oauth2
時把配置參數進行了分離,配置列表以下所示:git
配置名稱 | 介紹 | 默認值 | 生效方式 |
---|---|---|---|
api.boot.security.away |
SpringSecurity讀取用戶的方式,默認爲內存方式 | memory | all |
api.boot.security.auth-prefix |
攔截的接口路徑前綴,如:/api/users就會被默認攔截 | /api/** | memory/jdbc |
api.boot.security.users |
配置用戶列表,具體使用查看內存方式介紹 | 無 | memory |
api.boot.security.ignoring-urls |
Spring Security 所排除的路徑,默認排除Swagger、Actuator相關路徑前綴 |
/v2/api-docs /swagger-ui.html /swagger-resources/configuration/security /META-INF/resources/webjars/ /swagger-resources /swagger-resources/configuration/ui /actuator/ |
memory/jdbc |
api.boot.security.enable-default-store-delegate |
僅在Jdbc方式生效 | true | jdbc |
配置名稱 | 介紹 | 默認值 | 綁定away |
---|---|---|---|
api.boot.oauth.away |
Oauth存儲Token、讀取Client信息方式 | memory | all |
api.boot.oauth.cleint-id |
Oauth2 Client ID | ApiBoot | memory |
api.boot.oauth.client-secret |
Oauth2 Client Secret | ApiBootSecret | memory |
api.boot.oauth.grant-types |
客戶端受權方式 | Srtring[]{"password"} | memory |
api.boot.oauth.scopes |
客戶端做用域 | String[]{"api"} | memory |
api.boot.oauth.jwt.enable |
是否啓用JWT格式化AccessToken | false | memory/jdbc |
api.boot.oauth.jwt.sign-key |
使用JWT格式化AccessToken時的簽名 | ApiBoot | memory/jdbc |
ApiBoot
在整合SpringSecurity
、Oauth2
時配置進行了分離,也就意味着咱們可讓SpringSecurity
讀取內存用戶、Oauth2
將生成的AccessToken
存放到數據庫
,固然反過來也是能夠的,相互不影響!!!github
ApiBoot
在整合Spring Security
的內存方式時,僅僅須要配置api.boot.security.users
用戶列表參數便可,就是這麼的簡單,web
配置用戶示例以下所示:sql
api:
boot:
security:
# Spring Security 內存方式用戶列表示例
users:
- username: hengboy
password: 123456
- username: apiboot
password: abc321
複製代碼
api.boot.security.users
是一個List<SecurityUser>
類型的集合,因此這裏能夠配置多個用戶。數據庫
若是所有使用默認值的狀況話不須要作任何配置!!!api
前提:項目須要添加數據源依賴。框架
默認用戶表
ApiBoot
在整合Spring Security
的Jdbc方式時,在使用ApiBoot
提供的默認結構用戶表時只須要修改api.boot.security.away: jdbc
便可,ApiBoot
提供的用戶表結構以下所示:
CREATE TABLE `api_boot_user_info` (
`UI_ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '用戶編號,主鍵自增',
`UI_USER_NAME` varchar(30) DEFAULT NULL COMMENT '用戶名',
`UI_NICK_NAME` varchar(50) DEFAULT NULL COMMENT '用戶暱稱',
`UI_PASSWORD` varchar(255) DEFAULT NULL COMMENT '用戶密碼',
`UI_EMAIL` varchar(30) DEFAULT NULL COMMENT '用戶郵箱地址',
`UI_AGE` int(11) DEFAULT NULL COMMENT '用戶年齡',
`UI_ADDRESS` varchar(200) DEFAULT NULL COMMENT '用戶地址',
`UI_IS_LOCKED` char(1) DEFAULT 'N' COMMENT '是否鎖定',
`UI_IS_ENABLED` char(1) DEFAULT 'Y' COMMENT '是否啓用',
`UI_STATUS` char(1) DEFAULT 'O' COMMENT 'O:正常,D:已刪除',
`UI_CREATE_TIME` timestamp NULL DEFAULT current_timestamp() COMMENT '用戶建立時間',
PRIMARY KEY (`UI_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='ApiBoot默認的用戶信息表';
複製代碼
自定義用戶表
若是你的系統已經存在了自定義用戶表結構,ApiBoot
是支持的,並且很簡單就能夠完成整合,咱們須要先修改api.boot.security.enable-default-store-delegate
參數爲false
,以下所示:
api:
boot:
security:
# Spring Security jdbc方式用戶列表示例
enable-default-store-delegate: false
away: jdbc
複製代碼
添加ApiBootStoreDelegate
接口實現類,以下所示:
@Component
public class DisableDefaultUserTableStoreDelegate implements ApiBootStoreDelegate {
@Autowired
private PasswordEncoder passwordEncoder;
/** * 用戶列表示例 * 從該集合內讀取用戶信息 * 可使用集合內的用戶獲取access_token */
static List<String> users = new ArrayList() {
{
add("api-boot");
add("hengboy");
add("yuqiyu");
}
};
/** * 根據用戶名查詢用戶信息 * * @param username 用戶名 * @return * @throws UsernameNotFoundException */
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
if (!users.contains(username)) {
throw new UsernameNotFoundException("用戶:" + username + "不存在");
}
return new DisableDefaultUserDetails(username);
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class DisableDefaultUserDetails implements UserDetails {
private String username;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return new ArrayList() {
{
add((GrantedAuthority) () -> "ROLE_USER");
}
};
}
/** * 示例密碼使用123456 * * @return */
@Override
public String getPassword() {
return passwordEncoder.encode("123456");
}
@Override
public String getUsername() {
return username;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
}
複製代碼
根據上面代碼示例,咱們能夠經過users
用戶列表進行訪問獲取access_token
。
建立Oauth所需表結構
Oauth2
若是使用Jdbc
方式進行存儲access_token
、client_details
時,須要在數據庫內初始化Oauth2
所需相關表結構,oauth-mysql.sql
添加客戶端數據
初始化Oauth2
表結構後,須要向oauth_client_details
表內添加一個客戶端信息,下面是對應ApiBoot Security Oauth
配置信息的數據初始化,以下所示:
INSERT INTO `oauth_client_details` VALUES ('ApiBoot','api','$2a$10$M5t8t1fHatAj949RCHHB/.j1mrNAbxIz.mOYJQbMCcSPwnBMJLmMK','api','password',NULL,NULL,7200,7200,NULL,NULL);
複製代碼
AppSecret
加密方式統一使用BCryptPasswordEncoder
,數據初始化時須要注意。
在上面memory/jdbc
兩種方式已經配置完成,接下來咱們就能夠獲取access_token
。
➜ ~ curl ApiBoot:ApiBootSecret@localhost:8080/oauth/token -d "grant_type=password&username=api-boot&password=123456"
{"access_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NTMxMDk1MjMsInVzZXJfbmFtZSI6ImFwaS1ib290IiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9VU0VSIl0sImp0aSI6IjBmZTUyY2RlLTBhZjctNDI1YS04Njc2LTFkYTUyZTA0YzUxYiIsImNsaWVudF9pZCI6IkFwaUJvb3QiLCJzY29wZSI6WyJhcGkiXX0.ImqGZssbDEOmpf2lQZjLQsch4ukE0C4SCYJsutfwfx0","token_type":"bearer","expires_in":42821,"scope":"api","jti":"0fe52cde-0af7-425a-8676-1da52e04c51b"}
複製代碼
ApiBoot Security Oauth
在使用JWT
格式化access_token
時很是簡單的,配置以下所示:
api:
boot:
oauth:
jwt:
# 開啓Jwt轉換AccessToken
enable: true
# 轉換Jwt時所需加密key,默認爲ApiBoot
sign-key: 恆宇少年 - 於起宇
複製代碼
默認不啓用JWT
,sign-key
簽名建議進行更換。
本章源碼地址:github.com/hengboy/api…