91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Boot Security OAuth2 實現支持JWT令牌的授權服務器

發布時間:2020-07-22 07:59:11 來源:網絡 閱讀:913 作者:程序員果果 欄目:編程語言

概要

之前的兩篇文章,講述了Spring Security 結合 OAuth3 、JWT 的使用,這一節要求對 OAuth3、JWT 有了解,若不清楚,先移步到下面兩篇提前了解下。

Spring Boot Security 整合 OAuth3 設計安全API接口服務

Spring Boot Security 整合 JWT 實現 無狀態的分布式API接口

這一篇我們來實現 支持 JWT令牌 的授權服務器

優點

使用 OAuth3 是向認證服務器申請令牌,客戶端拿這令牌訪問資源服務服務器,資源服務器校驗了令牌無誤后,如果資源的訪問用到用戶的相關信息,那么資源服務器還需要根據令牌關聯查詢用戶的信息。

使用 JWT 是客戶端通過用戶名、密碼 請求服務器獲取 JWT,服務器判斷用戶名和密碼無誤之后,可以將用戶信息和權限信息經過加密成 JWT 的形式返回給客戶端。在之后的請求中,客戶端攜帶 JWT 請求需要訪問的資源,如果資源的訪問用到用戶的相關信息,那么就直接從JWT中獲取到。

所以,如果我們在使用 OAuth3 時結合JWT ,就能節省集中式令牌校驗開銷,實現無狀態授權認證。

快速上手

項目說明

工程名 端口 作用
jwt-authserver 8080 授權服務器
jwt-resourceserver 8081 資源服務器

授權服務器

pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth3-resource-server</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth3-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security.oauth.boot</groupId>
    <artifactId>spring-security-oauth3-autoconfigure</artifactId>
    <version>2.1.3.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-jwt</artifactId>
    <version>1.0.10.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
WebSecurityConfig
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.
             authorizeRequests().antMatchers("/**").permitAll();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
            .withUser("user").password("123456").roles("USER");
    }

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new PasswordEncoder() {
            @Override
            public String encode(CharSequence charSequence) {
                return charSequence.toString();
            }

            @Override
            public boolean matches(CharSequence charSequence, String s) {
                return Objects.equals(charSequence.toString(),s);
            }
        };
    }

}

為了方便,使用內存模式,在內存中創建一個用戶 user 密碼 123456。

OAuth3AuthorizationServer
/**
 * 授權服務器
 */
@Configuration
@EnableAuthorizationServer
public class OAuth3AuthorizationServer extends AuthorizationServerConfigurerAdapter {

    /**
     * 注入AuthenticationManager ,密碼模式用到
     */
    @Autowired
    private AuthenticationManager authenticationManager;

    /**
     * 對Jwt簽名時,增加一個密鑰
     * JwtAccessTokenConverter:對Jwt來進行編碼以及解碼的類
     */
    @Bean
    public JwtAccessTokenConverter accessTokenConverter() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        converter.setSigningKey("test-secret");
        return converter;
    }

    /**
     * 設置token 由Jwt產生,不使用默認的透明令牌
     */
    @Bean
    public JwtTokenStore jwtTokenStore() {
        return new JwtTokenStore(accessTokenConverter());
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints
                .authenticationManager(authenticationManager)
                .tokenStore(jwtTokenStore())
                .accessTokenConverter(accessTokenConverter());
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("clientapp")
                .secret("123")
                .scopes("read")
                //設置支持[密碼模式、授權碼模式、token刷新]
                .authorizedGrantTypes(
                        "password",
                        "authorization_code",
                        "refresh_token");
    }

}

資源服務器

pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth3-resource-server</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth3-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security.oauth.boot</groupId>
    <artifactId>spring-security-oauth3-autoconfigure</artifactId>
    <version>2.1.3.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-jwt</artifactId>
    <version>1.0.10.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
HelloController
@RestController("/api")
public class HelloController {

    @PostMapping("/api/hi")
    public String say(String name) {
        return "hi , " + name;
    }

}
OAuth3ResourceServer
/**
 * 資源服務器
 */
@Configuration
@EnableResourceServer
public class OAuth3ResourceServer extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .anyRequest().authenticated().and()
            .requestMatchers().antMatchers("/api/**");
    }
}
application.yml
server:
  port: 8081

security:
  oauth3:
    resource:
      jwt:
        key-value: test-secret

參數說明:

  • security.oauth3.resource.jwt.key-value:設置簽名key 保持和授權服務器一致。
  • security.oauth3.resource.jwt:項目啟動過程中,檢查到配置文件中有
    security.oauth3.resource.jwt 的配置,就會生成 jwtTokenStore 的 bean,對令牌的校驗就會使用 jwtTokenStore 。

驗證

請求令牌

curl -X POST --user 'clientapp:123' -d 'grant_type=password&username=user&password=123456' http://localhost:8080/oauth/token

返回JWT令牌

{
    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NTQ0MzExMDgsInVzZXJfbmFtZSI6InVzZXIiLCJhdXRob3JpdGllcyI6WyJST0xFX1VTRVIiXSwianRpIjoiOGM0YWMyOTYtMDQwYS00Y2UzLTg5MTAtMWJmNjZkYTQwOTk3IiwiY2xpZW50X2lkIjoiY2xpZW50YXBwIiwic2NvcGUiOlsicmVhZCJdfQ.YAaSRN0iftmlR6Khz9UxNNEpHHn8zhZwlQrCUCPUmsU",
    "token_type": "bearer",
    "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJ1c2VyIiwic2NvcGUiOlsicmVhZCJdLCJhdGkiOiI4YzRhYzI5Ni0wNDBhLTRjZTMtODkxMC0xYmY2NmRhNDA5OTciLCJleHAiOjE1NTY5Nzk5MDgsImF1dGhvcml0aWVzIjpbIlJPTEVfVVNFUiJdLCJqdGkiOiI0ZjA5M2ZjYS04NmM0LTQxZWUtODcxZS1kZTY2ZjFhOTI0NTAiLCJjbGllbnRfaWQiOiJjbGllbnRhcHAifQ.vvAE2LcqggBv8pxuqU6RKPX65bl7Zl9dfcoIbIQBLf4",
    "expires_in": 43199,
    "scope": "read",
    "jti": "8c4ac296-040a-4ce3-8910-1bf66da40997"
}

攜帶JWT令牌請求資源

curl -X POST -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NTQ0MzExMDgsInVzZXJfbmFtZSI6InVzZXIiLCJhdXRob3JpdGllcyI6WyJST0xFX1VTRVIiXSwianRpIjoiOGM0YWMyOTYtMDQwYS00Y2UzLTg5MTAtMWJmNjZkYTQwOTk3IiwiY2xpZW50X2lkIjoiY2xpZW50YXBwIiwic2NvcGUiOlsicmVhZCJdfQ.YAaSRN0iftmlR6Khz9UxNNEpHHn8zhZwlQrCUCPUmsU" -d 'name=zhangsan' http://localhost:8081/api/hi

返回

hi , zhangsan

源碼

https://github.com/gf-huanchupk/SpringBootLearning/tree/master/springboot-security-oauth3-jwt

歡迎關注我的公眾號《程序員果果》,關注有驚喜~~
Spring Boot Security OAuth2 實現支持JWT令牌的授權服務器

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

象州县| 合阳县| 塘沽区| 许昌市| 项城市| 衢州市| 封开县| 舒城县| 屏东县| 渝中区| 蒙山县| 邢台县| 应城市| 临猗县| 永兴县| 泾川县| 股票| 灵璧县| 惠州市| 大厂| 得荣县| 黄骅市| 苏尼特左旗| 浦县| 安阳县| 永福县| 泌阳县| 永泰县| 郓城县| 闵行区| 凌源市| 微博| 广汉市| 吉安县| 宣汉县| 十堰市| 兰考县| 军事| 江永县| 肥乡县| 全州县|