当前位置:   article > 正文

oauth2 的基本使用 spring security + oauth 服务端的基本配置 (oauth2学习第一天)_springsecurity 集成oauth2.0 详细配置

springsecurity 集成oauth2.0 详细配置

说明:本文采用JDK1.8,springboot 采用2.0.6.RELEASE,我这里采用的内存用户配置

pom.xml配置信息如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.0.6.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.test</groupId>
  12. <artifactId>Oauth2-mem-test</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>Oauth2-mem-test</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. <spring-cloud.version>Finchley.SR2</spring-cloud.version>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-web</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.cloud</groupId>
  27. <artifactId>spring-cloud-starter-oauth2</artifactId>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-test</artifactId>
  32. <scope>test</scope>
  33. <exclusions>
  34. <exclusion>
  35. <groupId>org.junit.vintage</groupId>
  36. <artifactId>junit-vintage-engine</artifactId>
  37. </exclusion>
  38. </exclusions>
  39. </dependency>
  40. </dependencies>
  41. <dependencyManagement>
  42. <dependencies>
  43. <dependency>
  44. <groupId>org.springframework.cloud</groupId>
  45. <artifactId>spring-cloud-dependencies</artifactId>
  46. <version>${spring-cloud.version}</version>
  47. <type>pom</type>
  48. <scope>import</scope>
  49. </dependency>
  50. </dependencies>
  51. </dependencyManagement>
  52. <build>
  53. <plugins>
  54. <plugin>
  55. <groupId>org.springframework.boot</groupId>
  56. <artifactId>spring-boot-maven-plugin</artifactId>
  57. </plugin>
  58. </plugins>
  59. </build>
  60. </project>

现在开始进行OAuth2.0的服务端配置

第一步:配置登录用户信息

新建SecurityConfigService类继承WebSecurityConfigurerAdapter。这里的配置为spring security配置,如果对这里不太熟悉的小伙伴可以先了解一个spring security相关的资料。我在下面的代码中配置了一个用户admin,密码为123456,角色为admin

  1. package com.client;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
  5. import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
  6. import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  7. import org.springframework.security.crypto.password.PasswordEncoder;
  8. @Configuration
  9. public class SecurityConfigService extends WebSecurityConfigurerAdapter {
  10. @Bean
  11. public PasswordEncoder passwordEncoder() {
  12. return new BCryptPasswordEncoder();
  13. }
  14. @Override
  15. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  16. auth.inMemoryAuthentication().withUser("admin").password(new BCryptPasswordEncoder().encode("123456")).roles("admin");
  17. }
  18. }

第二步:配置OAuth2信息

新建一个类继承AuthorizationServerConfigurerAdapter。

  1. package com.client;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  4. import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
  5. import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
  6. import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
  7. @Configuration
  8. @EnableAuthorizationServer
  9. public class OAuthSecurityService extends AuthorizationServerConfigurerAdapter{
  10. @Override
  11. public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
  12. clients
  13. // 使用内存设置
  14. .inMemory()
  15. // client_id
  16. .withClient("client")
  17. .secret(new BCryptPasswordEncoder().encode("123456"))
  18. .authorizedGrantTypes("authorization_code")
  19. // 授权范围 允许权限
  20. .scopes("app")
  21. // 注册回调地址
  22. .redirectUris("http://www.baidu.com");
  23. }
  24. }

配置完成后,就可以启动项目;访问http://localhost:8080/oauth/authorize?client_id=client&response_type=code

然后弹出如下界面:

输入用户名密码后进入 下一个界面:在这个界面中选择Approve,并点击Authorze后,跳转到我们配置好的回调地方。我这里的回调地方为https://www.baidu.com/?code=Vd7BI4 其中code就是Oauth返回的授权码。

 

 

在URL http://localhost:8080/oauth/authorize?client_id=client&response_type=code 中client_id为客户的ID,这个信息是通过withClient这个方法指定的,而response_type参数则是通过authorizedGrantTypes指定。

第三步:取得access_token信息

在我们的回调地方中已经取得了对应的code,这时我们可以通过这个code来取得access_token信息;首先在postman中输入取得access_token接口的地址http://localhost:8080/oauth/token。请求方式为post

 postman的Authorization栏目中的username中输入我们指定client_Id;从上面代码可知我这里配置的是client。password栏目输入指定的密码,我这里配置的密码为123456;

切换到body栏目,在这个栏目中,加上这个接口的参数信息,这个接口需要两个参数,分别是grant_type指定认证方案。code指定系统返回的code码。

配置完成后选择发送即得到access_token信息(code使用过一次后失效)。如下:

  1. {
  2. "access_token": "12bfc3db-9a94-4a82-815b-45b6c454f68c",
  3. "token_type": "bearer",
  4. "expires_in": 43129,
  5. "scope": "app"
  6. }

 

附:授权码说明

在OAuth中有四种认证方案,分别是authorization_code(授权码),implicit(隐藏式),password(密码式),client credentials(客户端凭证)。

  1. @Override
  2. public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
  3. clients
  4. // 使用内存设置
  5. .inMemory()
  6. // client_id
  7. .withClient("client")
  8. .secret(new BCryptPasswordEncoder().encode("123456"))
  9. //开放四种授权方案
  10. .authorizedGrantTypes("authorization_code","implicit","password","client_credentials")
  11. .scopes("read","app");
  12. }

authorization_code 方式(response_type=code)

批第三方应用首先申请一个授权码,然后再用该码获得令牌。如上面的URLhttp://localhost:8080/oauth/authorize?client_id=client&response_type=code中。client_id为我们通过withClient("client")指定,即client_Id。这个参数用于让服务端知道哪个用户请求服务。response_type为请求认证方案,authorization_code 方式固定为code,另外我们还可以指定redirect_uri参数和scope参数,其中redirect_uri用于指定认证成功后回调哪个接口,scope用于指定允许的权限,即授权范围。由于我们在上面代码中已经指定了,所以我的URL中没有配置,如果改成如下代码,则需要在URL中进行配置redirect_uri参数和scope参数了。

  1. package com.client;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  4. import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
  5. import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
  6. import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
  7. @Configuration
  8. @EnableAuthorizationServer
  9. public class OAuthSecurityService extends AuthorizationServerConfigurerAdapter{
  10. @Override
  11. public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
  12. clients
  13. // 使用内存设置
  14. .inMemory()
  15. // client_id
  16. .withClient("client")
  17. .secret(new BCryptPasswordEncoder().encode("123456"))
  18. .authorizedGrantTypes("authorization_code")
  19. .scopes("read","app");
  20. }
  21. }

这时我们的调用地方就成了http://localhost:8080/oauth/authorize?client_id=client&response_type=code&redirect_uri=http://www.baidu.com&scope=read

简单来说这个方式一共分为三步

第一步,客户端-调用/oauth/authorize接口

第二步,服务端-通过调用/oauth/authorize接口时redirect_uri指定的路径进行回调,并加入code参数,即http://redirect_uri?code=xxxxxx

第三步,客户端-通过回调时返回的code授权码调用/oauth/token接口,这里必需要指定:grant_type=authorization_code参数和code参数。如果在代码中没有指定redirect_uri,则调用这个接口的时候一定要指定redirect_uri。这里服务器会返回一个json,这个Json中的access_token就是令牌了。

implicit 隐藏式(response_type=token)

有些web是纯前端应用,没有后端,这时就不能用授权码方式了。而这种方式没有授权码这个中间步骤。允许直接向前端发送令牌。所以称为隐藏式,隐藏式需要指定response_type为token,其他参数不做修改。如http://localhost:8080/oauth/authorize?client_id=client&response_type=token&redirect_uri=http://www.baidu.com&scope=read

password 密码式 (response_type=password)

如果高度信任某个应用,也可以把用户名密码直接告诉相关的应用。通过用户名和密码来申请令牌。

client credentials 凭证式(response_type=client_credentials)

凭证式是通过应用直接向服务发送命令行请求令牌。

 

 

 

代码下载地址:https://download.csdn.net/download/tianlong1569/12800380

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/84342
推荐阅读
相关标签