SpringSecurity的Oauth2的授权码模式配置

Oauth2流程

  1. 用户进入网站的登录页面,点击微信的图标以微信账号登录系统,用户是自己在微信里信息的资源拥有者
  2. 资源拥有者同意给客户端授权
    资源拥有者扫描二维码表示资源拥有者同意给客户端授权,微信会对资源拥有者的身份进行验证,验证通过后,微
    信会询问用户是否给授权网站访问自己的微信数据,用户点击“确认登录”表示同意授权,微信认证服务器会颁发一个
    授权码,并重定向到网站。
  3. . 客户端获取到授权码,请求认证服务器申请令牌
    此过程用户看不到,客户端应用程序请求认证服务器,请求携带授权码。
  4. 认证服务器向客户端响应令牌
    认证服务器验证了客户端请求的授权码,如果合法则给客户端颁发令牌,令牌是客户端访问资源的通行证。此交互
    过程用户看不到,当客户端拿到令牌后,用户在网站看到已经登录成功。
  5. 客户端请求资源服务器的资源
    客户端携带令牌访问资源服务器的资源。网站携带令牌请求访问微信服务器获取用户的基本信息。
  6. 资源服务器返回受保护资源
    资源服务器校验令牌的合法性,如果合法则向用户响应资源信息内容。
    注意:资源服务器和认证服务器可以是一个服务也可以分开的服务,如果是分开的服务资源服务器通常要请求认证服
    务器来校验令牌的合法性。

代码配置

依赖

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

security的配置

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .authorizeRequests()
                .antMatchers("/oauth/**","/login/**","/logout/**")
                .permitAll()
                .anyRequest()
                .authenticated()
                .and()
                .formLogin()
                .permitAll();
    }
}

资源服务器的配置

@Configuration
@EnableResourceServer
public class ResourceConfig extends ResourceServerConfigurerAdapter {
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .requestMatchers()
                .antMatchers("/user/**");
    }
}

授权服务器的配置

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
    @Autowired
    private PasswordEncoder passwordEncoder;
    @Autowired
    @Qualifier("redisTokenStore")
    private TokenStore tokenStore;

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {

    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                //配置client_id
                .withClient("admin")
                //配置client_secret
                .secret(passwordEncoder.encode("112233"))
                //配置令牌有效期
                .accessTokenValiditySeconds(3600)
                //配置成功跳转路径
                .redirectUris("http://www.baidu.com")
                //申请权限范围
                .scopes("all")
                //模式类型
                .authorizedGrantTypes("authorization_code");

    }
}

  1. 获取授权码url
    http://localhost:8080/oauth/authorize?response_type=code&client_id=admin&redirect_uri=http://www.baidu.
    com&scope=all

  2. 重定向到baidu获取授权码在这里插入图片描述

  3. 然后SpringSecurity的Oauth2的授权码模式配置_第1张图片SpringSecurity的Oauth2的授权码模式配置_第2张图片

  4. 访问资源接口并带上token
    SpringSecurity的Oauth2的授权码模式配置_第3张图片

你可能感兴趣的:(Java,spring,cloud)