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版本依賴
ApiBoot
在整合SpringSecurity
、Oauth2
時把配置參數進行了分離,配置列表以下所示:mysql
配置名稱 | 介紹 | 默認值 | 生效方式 |
---|---|---|---|
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
存放到數據庫
,固然反過來也是能夠的,相互不影響!!!git
ApiBoot
在整合Spring Security
的內存方式時,僅僅須要配置api.boot.security.users
用戶列表參數便可,就是這麼的簡單,github
配置用戶示例以下所示:web
api: boot: security: # Spring Security 內存方式用戶列表示例 users: - username: hengboy password: 123456 - username: apiboot password: abc321
api.boot.security.users
是一個List<SecurityUser>
類型的集合,因此這裏能夠配置多個用戶。sql
若是所有使用默認值的狀況話不須要作任何配置!!!數據庫
前提:項目須要添加數據源依賴。
默認用戶表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
簽名建議進行更換。
本章源碼地址:https://github.com/hengboy/api-boot/tree/master/api-boot-samples/api-boot-sample-security-oauth-jwt