" />

最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot使用Security實現(xiàn)OAuth2授權(quán)驗證完整過程

 更新時間:2022年12月12日 10:57:52   作者:LO嘉嘉VE  
安全管理是軟件系統(tǒng)必不可少的的功能。根據(jù)經(jīng)典的“墨菲定律”——凡是可能,總會發(fā)生。如果系統(tǒng)存在安全隱患,最終必然會出現(xiàn)問題,這篇文章主要介紹了SpringBoot使用Security實現(xiàn)OAuth2授權(quán)驗證完整過程

OAuth2獲取授權(quán)令牌(token)通常有四種方式:授權(quán)碼模式,簡化模式,客戶端模式,和密碼模式。針對自己系統(tǒng)內(nèi)用戶的登錄,通常使用密碼模式進行授權(quán)。

我們利用Spring Security OAuth2來制作一個授權(quán)服務(wù)器。

第一步-添加依賴

pom文件中添加如下依賴,引入oauth2相關(guān)框架

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-oauth2</artifactId>
        </dependency>

我還是用到了數(shù)據(jù)庫進行存儲,我用的jpa連接數(shù)據(jù)庫,使用其他持久層框架(MyBatis)也可以。

引入數(shù)據(jù)庫依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!--數(shù)據(jù)庫鏈接驅(qū)動-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

第二步-添加代碼

1 實現(xiàn)UserDetailsService,獲取用戶

@Service
public class MyUserDetailsService implements UserDetailsService {
    @Resource
    private UserService userService;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //根據(jù)用戶名獲取用戶,并驗證用戶是否有效及權(quán)限
        //從數(shù)據(jù)庫中獲取用戶
        TUser user = userService.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("用戶不存在");
        }
        Set<GrantedAuthority> grantedAuthorities = new HashSet<>();
        boolean enabled = user.getStatus() == 1; // 可用性 :true:可用 false:不可用
        boolean accountNonExpired = true; // 過期性 :true:沒過期 false:過期
        boolean credentialsNonExpired = true; // 有效性 :true:憑證有效 false:憑證無效
        boolean accountNonLocked = true; // 鎖定性 :true:未鎖定 false:已鎖定
        //配置權(quán)限
        GrantedAuthority grantedAuthority = new SimpleGrantedAuthority("ADMIN");
        grantedAuthorities.add(grantedAuthority);
        //將用戶名和密碼及其他配置返還個spring security 進行驗證
        return new User(username, user.getPassword(),
                enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, grantedAuthorities);
    }
}

2 添加WebSecurityConfigurerAdapter

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}

3 添加AuthorizationServerConfigurerAdapter

@Configuration
@EnableAuthorizationServer
public class Oauth2ServerConfig extends AuthorizationServerConfigurerAdapter {
    //驗證管理器
    @Resource
    private AuthenticationManager authenticationManager;
    //獲取用戶,自己實現(xiàn)獲取用戶的相關(guān)功能
    @Resource
    private MyUserDetailsService userService;
    //數(shù)據(jù)庫配置
    @Resource
    private DataSource dataSource;
    /**
     * 自定義授權(quán)服務(wù)配置
     */
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
        endpoints.authenticationManager(authenticationManager)
                .userDetailsService(userService)
                .tokenStore(new JdbcTokenStore(dataSource));
        // 配置TokenServices參數(shù)
        DefaultTokenServices tokenServices = new DefaultTokenServices();
        tokenServices.setTokenStore(endpoints.getTokenStore());
        tokenServices.setSupportRefreshToken(true);
        tokenServices.setClientDetailsService(endpoints.getClientDetailsService());
        tokenServices.setTokenEnhancer(endpoints.getTokenEnhancer());
        tokenServices.setAccessTokenValiditySeconds((int) TimeUnit.HOURS.toSeconds(12)); // 12小時
        tokenServices.setRefreshTokenValiditySeconds((int) TimeUnit.DAYS.toSeconds(30));// 30天
        endpoints.tokenServices(tokenServices);
    }
    /**
     * 配置認證客戶端
     * @param clients
     * @throws Exception
     */
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        //自定義客戶端配置
        clients.withClientDetails(clientDetails());
    }
    //從數(shù)據(jù)庫中獲取客戶端的配置
    public ClientDetailsService clientDetails() {
        return new JdbcClientDetailsService(dataSource);
    }
    /**
     * 自定義授權(quán)令牌端點的安全約束
     * @param security
     */
    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) {
        //自定義安全約束
        security.allowFormAuthenticationForClients();
    }
}

第三步-初始化數(shù)據(jù)庫

在數(shù)據(jù)庫中創(chuàng)建三個表 oauth_access_token (存儲token),oauth_client_details(允許請求授權(quán)的客戶端),oauth_refresh_token(存儲refreshToken)

為了測試,我還建了一個t_user的用戶表,這個表可以不導入

CREATE TABLE `oauth_access_token`  (
  `token_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `token` blob NULL,
  `authentication_id` varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `user_name` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `client_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `authentication` blob NULL,
  `refresh_token` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`authentication_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
CREATE TABLE `oauth_client_details`  (
  `client_id` varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `resource_ids` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `client_secret` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `scope` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `authorized_grant_types` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `web_server_redirect_uri` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `authorities` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `access_token_validity` int(11) NULL DEFAULT NULL,
  `refresh_token_validity` int(11) NULL DEFAULT NULL,
  `additional_information` varchar(4096) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `autoapprove` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`client_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- 初始化了一個客戶端的數(shù)據(jù)
INSERT INTO `oauth_client_details` VALUES ('client', '', '$2a$10$My8G.sWJs/WQN8hdYS862.BsUuoL4p51xyfTIJu2NMMrIQ/JXRc2a', 'web', 'authorization_code,password,refresh_token,client_credentials', NULL, NULL, NULL, NULL, '{\"code\":\"test\"}', NULL);
DROP TABLE IF EXISTS `oauth_refresh_token`;
CREATE TABLE `oauth_refresh_token`  (
  `token_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `token` blob NULL,
  `authentication` blob NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- 我自己測試用的用戶表,這個可以不導入,使用自己系統(tǒng)的用戶表
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主鍵',
  `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用戶名',
  `nickname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '昵稱',
  `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密碼',
  `status` int(11) NULL DEFAULT NULL COMMENT '狀態(tài) 1正常 2停用',
  `e_mail` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '電子郵箱',
  `phone` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手機號',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `t_user` VALUES (1, 'admin', '管理員', '$2a$10$gD1u5uXEmCFmlvg.hgN7P.zv.sbCOEmX1sFNRHEBRIx6Ad.qydceu', 1, 'admin@admin.com', '15812345678');

在application中配置數(shù)據(jù)庫信息

spring:
  application:
    name: HelloSecurity
  #數(shù)據(jù)庫配置連接
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/hello_security?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: "123456"
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    show-sql: true
server:
  port: 8080

完成以上步驟后,一個簡單的OAuth2授權(quán)驗證服務(wù)器就搭建完成了,我們啟動項目,進行測試。

獲取token的接口是http://127.0.0.1:8080/oauth/token

源碼地址:https://gitee.com/xiaobailovejiajia/hello-security

到此這篇關(guān)于Springboot使用Security實現(xiàn)OAuth2授權(quán)驗證完整過程的文章就介紹到這了,更多相關(guān)Springboot Security內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java枚舉類型在switch語句正確使用方法詳解

    Java枚舉類型在switch語句正確使用方法詳解

    這篇文章主要介紹了Java枚舉類型在switch語句正確使用方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • 淺析java中stringBuilder的用法

    淺析java中stringBuilder的用法

    下面小編就為大家?guī)硪黄獪\析java中stringBuilder的用法。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考,一起跟隨小編過來看看吧
    2016-05-05
  • startJVM錯誤Unable to load native library: libjvm.so解決方法

    startJVM錯誤Unable to load native library: libjvm.so解決方法

    這篇文章主要介紹了startJVM錯誤Unable to load native library: libjvm.so解決方法,需要的朋友可以參考下
    2014-07-07
  • 解決Java導入excel大量數(shù)據(jù)出現(xiàn)內(nèi)存溢出的問題

    解決Java導入excel大量數(shù)據(jù)出現(xiàn)內(nèi)存溢出的問題

    今天小編就為大家分享一篇解決Java導入excel大量數(shù)據(jù)出現(xiàn)內(nèi)存溢出的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • 深入剖析Spring如何解決循環(huán)依賴

    深入剖析Spring如何解決循環(huán)依賴

    循環(huán)依賴(Circular?Dependency)是指兩個或多個Bean相互依賴,形成一個閉環(huán)的情況,本文將和大家深入探討一下Spring如何解決循環(huán)依賴,需要的可以參考下
    2025-04-04
  • Intellj Idea中的maven工程Java文件顏色不對,未被識別的解決

    Intellj Idea中的maven工程Java文件顏色不對,未被識別的解決

    這篇文章主要介紹了Intellj Idea中的maven工程Java文件顏色不對,未被識別的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • java中thread線程start和run的區(qū)別

    java中thread線程start和run的區(qū)別

    這篇文章主要介紹了java中thread線程start和run的區(qū)別,run()是Runnable接口中定義的一個方法,是為了讓客戶程序員在這個方法里寫自己的功能代碼的。直接調(diào)用和普通的類調(diào)用自己的成員方法是沒有任何區(qū)別的
    2014-03-03
  • classloader類加載器_基于java類的加載方式詳解

    classloader類加載器_基于java類的加載方式詳解

    下面小編就為大家?guī)硪黄猚lassloader類加載器_基于java類的加載方式詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Java實現(xiàn)小程序簡單五子棋

    Java實現(xiàn)小程序簡單五子棋

    這篇文章主要介紹了利用Java實現(xiàn)小程序簡單五子棋,本程序適用于java初學者鞏固類與對象、事件響應(yīng)、awt包中各種工具的相關(guān)概念以及對邏輯能力的鍛煉,下面來看具體實現(xiàn)吧
    2021-12-12
  • Spring Shell應(yīng)用程序開發(fā)流程解析

    Spring Shell應(yīng)用程序開發(fā)流程解析

    這篇文章主要介紹了Spring Shell應(yīng)用程序開發(fā)流程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10

最新評論

尚义县| 仪陇县| 庆云县| 盐城市| 长沙市| 迭部县| 白玉县| 合川市| 汉中市| 稻城县| 黄冈市| 滨海县| 西城区| 洛川县| 驻马店市| 宽甸| 乡城县| 高密市| 乌拉特前旗| 周口市| 阜南县| 涿鹿县| 十堰市| 高雄市| 漳州市| 措勤县| 丹东市| 犍为县| 铁岭县| 日土县| 阿拉善盟| 耒阳市| 通河县| 荆门市| 江达县| 辽源市| 周宁县| 襄城县| 田阳县| 同心县| 西和县|