当前位置:   article > 正文

使用Spring Security实现OAuth2授权认证_spring-security-oauth2-autoconfigure

spring-security-oauth2-autoconfigure

介绍

OAuth 2 标准中定义了以下几种角色:

  • 资源所有者(Resource Owner):即代表授权客户端访问本身资源信息的用户,客户端访问用户帐户的权限仅限于用户授权的“范围”。
  • 客户端(Client):即代表意图访问受限资源的第三方应用。在访问实现之前,它必须先经过用户者授权,并且获得的授权凭证将进一步由授权服务器进行验证。
  • 授权服务器(Authorization Server):授权服务器用来验证用户提供的信息是否正确,并返回一个令牌给第三方应用。
  • 资源服务器(Resource Server):资源服务器是提供给用户资源的服务器,例如头像、照片、视频等。

OAuth 协议的授权模式共分为 4 种,分别说明如下:

  • 授权码模式:授权码模式(authorization code)是功能最完整、流程最严谨的授权模式。它的特点就是通过客户端的服务器与授权服务器进行交互,国内常见的第三方平台登录功能基本 都是使用这种模式。
  • 简化模式:简化模式不需要客户端服务器参与,直接在浏览器中向授权服务器中请令牌,一般若网站是纯静态页面,则可以采用这种方式。
  • 密码模式:密码模式是用户把用户名密码直接告诉客户端,客户端使用这些信息向授权服务器中请令牌。这需要用户对客户端高度信任,例如客户端应用和服务提供商是同一家公司。
  • 客户端模式:客户端模式是指客户端使用自己的名义而不是用户的名义向服务提供者申请授权。严格来说,客户端模式并不能算作 OAuth 协议要解决的问题的一种解决方案,但是,对于开发者而言,在一些前后端分离应用或者为移动端提供的认证授权服务器上使用这种模式还是非常方便的。

使用

1,添加依赖

    由于 Spring Boot 中的 OAuth 协议是在 Spring Security 基础上完成的。因此首先编辑 pom.xml,添加 Spring Security 以及 OAuth 依赖。

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-security</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.security.oauth</groupId>
  7. <artifactId>spring-security-oauth2</artifactId>
  8. <version>2.3.3.RELEASE</version>
  9. </dependency>

2,配置授权服务器

授权服务器和资源服务器可以是同一台服务器,也可以是不同服务器,本案例中假设是同一台服务器,通过不同的配置开启授权服务器和资源服务器。

 

 下面是授权服务器配置代码。创建一个自定义类继承自 AuthorizationServerConfigurerAdapter,完成对授权服务器的配置,然后通过 @EnableAuthorizationServer 注解开启授权服务器:

  1. @Configuration
  2. @EnableAuthorizationServer
  3. public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
  4. // 该对象用来支持 password 模式
  5. @Autowired
  6. AuthenticationManager authenticationManager;
  7. // 该对象用来将令牌信息存储到内存中
  8. @Autowired(required = false)
  9. TokenStore inMemoryTokenStore;
  10. // 该对象将为刷新token提供支持
  11. @Autowired
  12. UserDetailsService userDetailsService;
  13. // 指定密码的加密方式
  14. @Bean
  15. PasswordEncoder passwordEncoder() {
  16. // 使用BCrypt强哈希函数加密方案(密钥迭代次数默认为10)
  17. return new BCryptPasswordEncoder();
  18. }
  19. // 配置 password 授权模式
  20. @Override
  21. public void configure(ClientDetailsServiceConfigurer clients)
  22. throws Exception {
  23. clients.inMemory()
  24. .withClient("password")
  25. .authorizedGrantTypes("password", "refresh_token") //授权模式为password和refresh_token两种
  26. .accessTokenValiditySeconds(1800) // 配置access_token的过期时间
  27. .resourceIds("rid") //配置资源id
  28. .scopes("all")
  29. .secret("$2a$10$RMuFXGQ5AtH4wOvkUqyvuecpqUSeoxZYqilXzbz50dceRsga.WYiq"); //123加密后的密码
  30. }
  31. @Override
  32. public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
  33. endpoints.tokenStore(inMemoryTokenStore) //配置令牌的存储(这里存放在内存中)
  34. .authenticationManager(authenticationManager)
  35. .userDetailsService(userDetailsService);
  36. }
  37. @Override
  38. public void configure(AuthorizationServerSecurityConfigurer security) {
  39. // 表示支持 client_id 和 client_secret 做登录认证
  40. security.allowFormAuthenticationForClients();
  41. }
  42. }

3,配置资源服务器

  接下来配置资源服务器。自定义类继承自 ResourceServerConfigurerAdapter,并添加 @EnableResourceServer 注解开启资源服务器配置。

  1. @Configuration
  2. @EnableResourceServer
  3. public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
  4. @Override
  5. public void configure(ResourceServerSecurityConfigurer resources) {
  6. resources.resourceId("rid") // 配置资源id,这里的资源id和授权服务器中的资源id一致
  7. .stateless(true); // 设置这些资源仅基于令牌认证
  8. }
  9. // 配置 URL 访问权限
  10. @Override
  11. public void configure(HttpSecurity http) throws Exception {
  12. http.authorizeRequests()
  13. .antMatchers("/admin/**").hasRole("admin")
  14. .antMatchers("/user/**").hasRole("user")
  15. .anyRequest().authenticated();
  16. }
  17. }

4,配置 Security

这里 Spring Security 的配置与传统的 Security 大体相同,不同在于:

  • 这里多了两个 Bean,这两个 Bean 将注入授权服务器配置类中使用。
  • 另外,这里的 HttpSecurity 配置主要是配置“oauth/**”模式的 URL,这一类的请求直接放行。
  1. @Configuration
  2. public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
  3. @Bean
  4. @Override
  5. public AuthenticationManager authenticationManagerBean() throws Exception {
  6. return super.authenticationManagerBean();
  7. }
  8. @Bean
  9. @Override
  10. protected UserDetailsService userDetailsService() {
  11. return super.userDetailsService();
  12. }
  13. @Override
  14. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  15. auth.inMemoryAuthentication()
  16. .withUser("admin")
  17. .password("$2a$10$RMuFXGQ5AtH4wOvkUqyvuecpqUSeoxZYqilXzbz50dceRsga.WYiq") //123
  18. .roles("admin")
  19. .and()
  20. .withUser("sang")
  21. .password("$2a$10$RMuFXGQ5AtH4wOvkUqyvuecpqUSeoxZYqilXzbz50dceRsga.WYiq") //123
  22. .roles("user");
  23. }
  24. @Override
  25. protected void configure(HttpSecurity http) throws Exception {
  26. http.antMatcher("/oauth/**").authorizeRequests()
  27. .antMatchers("/oauth/**").permitAll()
  28. .and().csrf().disable();
  29. }
  30. }

 

 

 

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

闽ICP备14008679号