当前位置:   article > 正文

spring-security-oauth2(授权模式入门简单使用)_org.springframework.security.oauth

org.springframework.security.oauth

当前应用需要实现第三方登入,那么第三方是如何进行授权认证的?这就是oauth2协议。

模拟实现微信端是如何进行授权认证登入。

举例:豆瓣就是客户应用,授权服务器、资源服务器就是微信端持有。豆瓣需要向微信的授权服务器获取授权,获取到授权后再向资源服务器获取用户信息。

那么我们就需要

1.需要配置一个授权服务器(发放授权码)

2.配置一个资源服务器(获取用户信息接口需要令牌才能访问)

3.配置一个接口(获取返回用户信息)

4.还要实现模拟用户的登入(因为授权服务器需要向用户发起是否允许授权的请求)

在spring-security-oauth2中有这几个默认接口,按照以下接口访问顺序获取用户信息:

/oauth/authorize:获取授权码

/oauth/token:根据授权码获取令牌

/user/getUser:根据令牌获取user资源信息

整个项目结构

项目依赖的pom文件:

注意:spring-cloud和spring-boot的版本一定要兼容适配,否则会报错

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-web</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-test</artifactId>
  13. </dependency>
  14. <dependency>
  15. <groupId>org.springframework.cloud</groupId>
  16. <artifactId>spring-cloud-starter-security</artifactId>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.springframework.cloud</groupId>
  20. <artifactId>spring-cloud-starter-oauth2</artifactId>
  21. </dependency>
  22. </dependencies>
  23. <dependencyManagement>
  24. <dependencies>
  25. <!--springCloud的依赖-->
  26. <dependency>
  27. <groupId>org.springframework.cloud</groupId>
  28. <artifactId>spring-cloud-dependencies</artifactId>
  29. <version>Greenwich.SR2</version>
  30. <type>pom</type>
  31. <scope>import</scope>
  32. </dependency>
  33. </dependencies>
  34. </dependencyManagement>

 授权服务器

  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.security.crypto.password.PasswordEncoder;
  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. /**
  8. * 授权服务器配置,客服端向此请求获取授权码
  9. *
  10. * 访问以下地址获取授权码:以下地址就是获取授权码的配置
  11. * http://localhost:8080/oauth/authorize?client_id=admin&response_type=code
  12. *
  13. * /oauth/authorize:获取授权码接口
  14. * response type=code:响应类型为授权码
  15. * client_d=admin:访问的授权服务器id
  16. */
  17. @Configuration
  18. @EnableAuthorizationServer
  19. public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
  20. @Autowired
  21. private PasswordEncoder passwordEncoder;
  22. @Override
  23. public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
  24. clients.inMemory()
  25. .withClient("admin") // 配置client-id
  26. .secret(passwordEncoder.encode("12334")) // 授权服务器的密码
  27. .accessTokenValiditySeconds(3600) // 时间有效期
  28. .redirectUris("http://www.baidu.com") // 授权成功后跳转地址(并且会带上授权码code)
  29. .scopes("all") // 授权范围
  30. .authorizedGrantTypes("authorization_code"); // 授权码模式
  31. }
  32. }

 资源服务器

  1. import org.springframework.context.annotation.Configuration;
  2. import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  3. import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
  4. import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
  5. /**
  6. * 资源服务管理,配置某些接口需要携带令牌才能访问获取资源
  7. */
  8. @Configuration
  9. @EnableResourceServer
  10. public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
  11. @Override
  12. public void configure(HttpSecurity http) throws Exception {
  13. http.authorizeRequests()
  14. .anyRequest()
  15. .authenticated()
  16. .and()
  17. .requestMatchers()
  18. .antMatchers("/user/**");// 需要携带令牌才能访问获取资源
  19. }
  20. }

获取用户信息接口

  1. @RestController
  2. @RequestMapping("/user")
  3. public class UserController {
  4. @RequestMapping("/getUser")
  5. public Object getUser(){
  6. return "成功获取到资源";// 给第三方网站返回用户信息(三方登入)
  7. }
  8. }

配置用户登入信息

  1. @Service
  2. public class UserService implements UserDetailsService {
  3. @Autowired
  4. private PasswordEncoder passwordEncoder;
  5. @Override
  6. public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
  7. // 模拟根据username进行DB查询结果设置用户
  8. String password = passwordEncoder.encode("123");
  9. // 设置用户的账号、密码(security根据表单提交的登入信息进行比对)
  10. return new User("admin",password, AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
  11. }
  12. }

配置不需要登入认证才可访问的接口(如登入、退出登入接口) 

  1. @Configuration
  2. @EnableWebSecurity
  3. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  4. @Bean
  5. public PasswordEncoder passwordEncoder(){
  6. return new BCryptPasswordEncoder();
  7. }
  8. @Override
  9. protected void configure(HttpSecurity http) throws Exception {
  10. http.csrf().disable()
  11. .authorizeRequests()
  12. .antMatchers("/login/**","/logout/**")
  13. .permitAll() // 以上接口允许不用授权服务
  14. .anyRequest()
  15. .authenticated() // 其它接口需要授权
  16. .and()
  17. .formLogin()
  18. .permitAll();
  19. }
  20. }

配置好以上信息后就可以开始进行测试了

第一步:访问http://localhost:8080/oauth/authorize?client_id=admin&response_type=code获取授权码code,首次获取时我们需要先登入用户(就好比如果手机微信不登入怎么进行授权)

 登入成功后就会跳到这个页面(这个就是授权页面,就和微信询问你是否允许第三方应用登入一样)

选择允许授权后,跳到百度页面,并且携带了授权码code

接下来,我们就可以使用接口测试工具去获取令牌了(我使用的是Apifox)记得请求的端口要正确,下面截图中忘了写端口了。

 

 发送请求后的返回体,access_token就是返回的令牌

 接着携带令牌发送请求获取用户信息

 请求结果

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

闽ICP备14008679号