• spring-security-oauth2授权码模式


    完整pom

    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. <groupId>com.sdkj</groupId>
    6. <artifactId>security-oauth</artifactId>
    7. <version>0.0.1-SNAPSHOT</version>
    8. <name>security-oauth</name>
    9. <description>Demo project for Spring Boot</description>
    10. <properties>
    11. <java.version>1.8</java.version>
    12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    13. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    14. <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
    15. </properties>
    16. <dependencies>
    17. <dependency>
    18. <groupId>org.springframework.cloud</groupId>
    19. <artifactId>spring-cloud-starter-security</artifactId>
    20. </dependency>
    21. <!-- security-oauth2 -->
    22. <dependency>
    23. <groupId>org.springframework.cloud</groupId>
    24. <artifactId>spring-cloud-starter-oauth2</artifactId>
    25. </dependency>
    26. <dependency>
    27. <groupId>org.springframework.boot</groupId>
    28. <artifactId>spring-boot-starter-web</artifactId>
    29. </dependency>
    30. </dependencies>
    31. <dependencyManagement>
    32. <dependencies>
    33. <dependency>
    34. <groupId>org.springframework.cloud</groupId>
    35. <artifactId>spring-cloud-dependencies</artifactId>
    36. <version>Hoxton.SR3</version>
    37. <type>pom</type>
    38. <scope>import</scope>
    39. </dependency>
    40. <dependency>
    41. <groupId>org.springframework.boot</groupId>
    42. <artifactId>spring-boot-dependencies</artifactId>
    43. <version>${spring-boot.version}</version>
    44. <type>pom</type>
    45. <scope>import</scope>
    46. </dependency>
    47. </dependencies>
    48. </dependencyManagement>
    49. <build>
    50. <plugins>
    51. <plugin>
    52. <groupId>org.apache.maven.plugins</groupId>
    53. <artifactId>maven-compiler-plugin</artifactId>
    54. <version>3.8.1</version>
    55. <configuration>
    56. <source>1.8</source>
    57. <target>1.8</target>
    58. <encoding>UTF-8</encoding>
    59. </configuration>
    60. </plugin>
    61. <plugin>
    62. <groupId>org.springframework.boot</groupId>
    63. <artifactId>spring-boot-maven-plugin</artifactId>
    64. <version>2.3.7.RELEASE</version>
    65. <configuration>
    66. <mainClass>com.sdkj.security.oauth.SecurityOauthApplication</mainClass>
    67. </configuration>
    68. <executions>
    69. <execution>
    70. <id>repackage</id>
    71. <goals>
    72. <goal>repackage</goal>
    73. </goals>
    74. </execution>
    75. </executions>
    76. </plugin>
    77. </plugins>
    78. </build>
    79. </project>

    User:

    1. package com.sdkj.security.oauth.entity;
    2. import org.springframework.security.core.GrantedAuthority;
    3. import org.springframework.security.core.userdetails.UserDetails;
    4. import java.util.Collection;
    5. import java.util.List;
    6. /**
    7. * @author javachen
    8. * @description oauth2用户
    9. */
    10. public class User implements UserDetails
    11. {
    12. private static final long serialVersionUID = 1L;
    13. /**
    14. * 用户名称
    15. */
    16. private String userName;
    17. /**
    18. * 用户名称
    19. */
    20. private String password;
    21. /**
    22. * 用户名称
    23. */
    24. private List<GrantedAuthority> authorities;
    25. public User() {
    26. }
    27. public User(String userName, String password, List<GrantedAuthority> authorities) {
    28. this.userName = userName;
    29. this.password = password;
    30. this.authorities = authorities;
    31. }
    32. @Override
    33. public Collection<? extends GrantedAuthority> getAuthorities() {
    34. return this.authorities;
    35. }
    36. @Override
    37. public String getPassword() {
    38. return this.password;
    39. }
    40. @Override
    41. public String getUsername() {
    42. return this.userName;
    43. }
    44. @Override
    45. public boolean isAccountNonExpired() {
    46. return true;
    47. }
    48. @Override
    49. public boolean isAccountNonLocked() {
    50. return true;
    51. }
    52. @Override
    53. public boolean isCredentialsNonExpired() {
    54. return true;
    55. }
    56. @Override
    57. public boolean isEnabled() {
    58. return true;
    59. }
    60. }
    AuthorizationServerConfig:
    1. package com.sdkj.security.oauth.config;
    2. import org.springframework.beans.factory.annotation.Autowired;
    3. import org.springframework.context.annotation.Bean;
    4. import org.springframework.context.annotation.Configuration;
    5. import org.springframework.security.crypto.password.PasswordEncoder;
    6. import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
    7. import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
    8. import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
    9. @Configuration
    10. @EnableAuthorizationServer
    11. public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
    12. @Autowired
    13. public PasswordEncoder passwordEncoder;
    14. @Override
    15. public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
    16. clients.inMemory()
    17. //配置client_id
    18. .withClient("admin")
    19. //配置client_secret
    20. .secret(passwordEncoder.encode("112233"))
    21. //配置访问token的有效期
    22. .accessTokenValiditySeconds(3600)
    23. //配置redirect_url,用于回调的地址
    24. .redirectUris("http://www.baidu.com")
    25. //配置申请权限访问
    26. .scopes("all")
    27. //配置great_type,表示授权类型
    28. .authorizedGrantTypes("authorization_code");
    29. }
    30. }
    SecurityConfig:
    1. package com.sdkj.security.oauth.config;
    2. import com.sdkj.security.oauth.handle.MyAccessDeniedHandler;
    3. import com.sdkj.security.oauth.handle.MyAuthenticationFailureHandler;
    4. import com.sdkj.security.oauth.handle.MyAuthenticationSuccessHandler;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.context.annotation.Bean;
    7. import org.springframework.context.annotation.Configuration;
    8. import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    9. import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    10. import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    11. import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    12. import org.springframework.security.crypto.password.PasswordEncoder;
    13. @Configuration
    14. @EnableWebSecurity
    15. public class SecurityConfig extends WebSecurityConfigurerAdapter {
    16. @Bean
    17. public PasswordEncoder getPasswordEncoder(){
    18. return new BCryptPasswordEncoder();
    19. }
    20. @Autowired
    21. private MyAccessDeniedHandler myAccessDeniedHandler;
    22. @Override
    23. protected void configure(HttpSecurity http) throws Exception {
    24. http.csrf().disable()
    25. .authorizeRequests()
    26. .antMatchers("/oauth/**","/login/**","/logout/**")
    27. .permitAll()
    28. .anyRequest()
    29. .authenticated()
    30. .and()
    31. .formLogin()
    32. .permitAll();
    33. }
    34. }

    ResourceServerConfig:

    1. package com.sdkj.security.oauth.config;
    2. import org.springframework.context.annotation.Configuration;
    3. import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    4. import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
    5. import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
    6. @Configuration
    7. @EnableResourceServer
    8. public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
    9. @Override
    10. public void configure(HttpSecurity http) throws Exception {
    11. //配置所有请求均需要授权进行访问,唯独/user/**不需要进行认证
    12. http.authorizeRequests()
    13. .anyRequest()
    14. .authenticated()
    15. .and()
    16. .requestMatchers()
    17. .antMatchers("/user/**");
    18. }
    19. }

    UserDetailServiceImpl:

    1. package com.sdkj.security.oauth.service;
    2. import com.sdkj.security.oauth.entity.User;
    3. import org.springframework.beans.factory.annotation.Autowired;
    4. import org.springframework.security.core.authority.AuthorityUtils;
    5. import org.springframework.security.core.userdetails.UserDetails;
    6. import org.springframework.security.core.userdetails.UserDetailsService;
    7. import org.springframework.security.core.userdetails.UsernameNotFoundException;
    8. import org.springframework.security.crypto.password.PasswordEncoder;
    9. import org.springframework.stereotype.Service;
    10. @Service
    11. public class UserDetailServiceImpl implements UserDetailsService {
    12. @Autowired
    13. private PasswordEncoder passwordEncoder;
    14. @Override
    15. public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    16. String password = passwordEncoder.encode("123456");
    17. return new User(username,password, AuthorityUtils.commaSeparatedStringToAuthorityList("admin,normal"));
    18. }
    19. }

    UserController:

    1. package com.sdkj.security.oauth.controller;
    2. import com.sdkj.security.oauth.entity.User;
    3. import org.springframework.security.core.Authentication;
    4. import org.springframework.web.bind.annotation.RequestMapping;
    5. import org.springframework.web.bind.annotation.RestController;
    6. @RestController
    7. @RequestMapping("/user")
    8. public class UserController {
    9. @RequestMapping("/getCurrentUser")
    10. public void getCurrentUser(Authentication authentication)
    11. {
    12. User user = (User)authentication.getPrincipal();
    13. System.out.println(user.getUsername());
    14. }
    15. }

    项目结构:

    访问授权:

    1.获取code

    http://localhost:8080/oauth/authorize?client_id=admin&redirect_uri=http://www.baidu.com&response_type=code&scope=all

    2.根据code回去token

    http://localhost:8080/oauth/token?code=F3m7bt&grant_type=authorization_code&redirect_uri=http://www.baidu.com&scope=all

     

  • 相关阅读:
    【C++】STL—— unordered_map的介绍和使用、 unordered_map的构造函数和迭代器、 unordered_map的增删查改函数
    Nginx 快速入门
    AcWing 4273. 链表合并
    c++调用相机进行保存
    全网最详细:基于SpringMVC实现CRUD&文件上传下载
    【BUG解决】服务器没报警但是应用接口崩了....
    (续)SSM整合之springmvc笔记(@RequestMapping注解)(P124-130)还没完
    JSON概念
    SpringBoot中单元测试的使用
    HCNP Routing&Switching之组播技术PIM-SM 稀疏模式
  • 原文地址:https://blog.csdn.net/u013008898/article/details/124918355