spring security实战 5-使用密码模式(password grant type)保护资源

写在开篇

本改编课程基于《OAuth 2.0 Cookbook_Protect Your Web Applications using Spring Security-Packt Publishing(2017)》。这本书侧重通过一个个精简的小例子来学习,如何使用spring security和oauth2.0来保护你的资源。

课程从第二章开始,在Chaptor2,我们将学习以下内容:

  1. 使用授权码模式(Authorization Code grant)保护资源

  2. 支持隐式授权模式(Implicit grant)
  3. 使用密码模式(Resource Owner Password Credentials grant type )
  4. 配置客户端证书授权模式(Client Credentials grant)
  5. 支持refresh tokens
  6. 使用一个关系数据库来保存tokens和客户信息
  7. 使用redis保存token
  8. 实现客户端注册过程
  9. 中途破坏Oauth 2.0 Provider
  10. 使用Gatling,通过共享数据库测试token的验证过程

​ 本例我们将学习如何配置密码模式,在实践中应该避免使用这种模式,因为这种模式客户端将拿到用户凭证,而这正是应该由Oauth 2.0通过access 代理来解决的事情。从用户凭证共享模式迁移到Oauth 2.0模式时,我们可以选择这种策略。当客户端与Oauth 2.0授权中心在同一solution下(充分信任客户端的情况下)时使用会较为安全。

Getting ready

Java8+maven
可以从https://github.com/PacktPubli... 下载项目源码,这个是书籍官方例子,亲自做过跑过,所以可以放心下载使用。

How to do it…

以下步骤将指导你,使用Spring Security OAuth2 配置一个授权中心和一个资源服务器:

1.使用Spring Initializr 新建一个Springboot工程,加入web,security依赖。
2.打开pom.xml,加入以下依赖:

<dependency>
    <groupId>org.springframework.security.oauth</groupId>
    <artifactId>spring-security-oauth2</artifactId> 
</dependency>

3.打开application.properties文件,输入:

security.user.name = adolfo

security.user.password = 123

4.新建UserProfile类与UserController类,内容与《学习3》中一致
5.新建OAuth2ResourceServer类,内容与《学习3》中一致
6.新建OAuth2AuthorizationServer类:

@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServer extends AuthorizationServerConfigurerAdapter {
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
            .withClient("clientapp")
            .secret("123456") 
            .redirectUris("http://localhost:9000/callback")
            .authorizedGrantTypes("password") 
            .scopes("read_profile", "read_contacts"); 
    }
}

7.与《学习3》唯一不同的就是authorizedGrantType的设置,看上去和前两种模式的设置差不多,但是当你直接运行应用时就会报错:

{ 
    "error": "unsupported_grant_type",
     "error_description": "Unsupported grant type: password"
}

8.那是因为,密码模式需要在OAuth2AuthorizationServer 中配置AuthenticationManager

这是完整的OAuth2AuthorizationServer 类:


@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServer extends
        AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints)
            throws Exception {
        endpoints.authenticationManager(authenticationManager);
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients)
            throws Exception {
        clients.inMemory()
            .withClient("clientapp")
            .secret("123456")
            .authorizedGrantTypes("password")
            .scopes("read_profile", "read_contacts");
    }

}

现在,我们可以启动项目了

How it works…

当我们使用@EnableAuthorizationServer@EnableResourceServer这两个注解时,已经通过spring security配置上oauth2.0的所有支持,正如前几个课程所示。最大的不同,是我们在OAuth2AuthorizationServer中注入了authenticationManager 实例。我们之所以要使用这个实例是因为,授权中心在对第三方,携带access token的请求做出回应时,需要验证资源所有者的证书。

处理配置上的不同,在验证流程上也有所不同。在使用密码模式时,用户(或者称为资源所有者)必须发送凭证(用户名,密码),而这些操作将会在客户端的掌控下。因此,在使用这种模式与客户端和服务端交互时,需要资源所有者必须十分信任客户端。例如,你作为资源所有者与facebook的官方客户端交互,之后有转为与facebook的服务端做交互。

现在,我们来看看,如何使用密码模式来获取资源:

1.首先发送以下请求:

curl -X POST --user clientapp:123456 <http://localhost:8080/oauth/token> -H "accept: application/json" -H "content-type: application/x-www-formurlencoded" -d "grant_type=password&username=adolfo&password=123&scope=read_profile"

或者使用postman:
图片描述

图片描述

图片描述

2.在上一步,我们拿到了access token,现在我们就可以使用这个token来获取资源了,注意,我们在之前没有设置token的过期时间,Spring Security OAuth2默认是43200s。我们应该根据授权模式的不同,设置不同的过期时间,例如隐式模式就应该使用短一些的过期时间。好了,现在我们来请求资源:
图片描述

curl -X GET <http://localhost:8080/api/profile> -H "authorization: Bearer 28405009-b53d-4e52-bfc3-c8889a477675"

There's more…

​ 尽管我们建议尽量不要使用密码模式,但是如果当你交互的客户端与服务端(验证中心)都在一个范围内(公司/部门/名下)的时候,可以大胆使用。需要注意的是,客户端不应保留用户的用户名和密码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Security的OAuth2支持四种授权模式,其中一种是密码模式password grant type)。密码模式是指客户端(也就是应用程序)使用用户的用户名和密码直接向OAuth2服务器请求访问令牌(access token)。 密码模式使用场景比较特殊,因为它需要客户端直接持有用户凭据。通常情况下,OAuth2更多地是用于第三方应用程序访问受保护资源,而不是直接访问用户的凭据。因此,在使用密码模式时,需要特别注意安全问题。 以下是使用Spring Security实现密码模式的简要步骤: 1. 配置OAuth2客户端信息:在Spring Security配置文件中,使用`ClientDetailsServiceConfigurer`配置客户端信息,包括客户端ID、客户端密码等。 2. 配置OAuth2授权服务器:使用`AuthorizationServerConfigurer`配置OAuth2授权服务器,包括令牌存储、授权类型等。 3. 配置资源服务器:使用`ResourceServerConfigurer`配置资源服务器,包括受保护资源、访问规则等。 4. 在客户端中请求访问令牌:客户端通过向授权服务器发送POST请求,包括用户名、密码等信息,请求访问令牌。 5. 使用访问令牌访问受保护资源:客户端使用访问令牌访问受保护资源。 以上是使用Spring Security实现密码模式的一般步骤,具体实现可能会因为不同的业务需求而有所不同。需要注意的是,密码模式需要客户端直接持有用户凭据,因此需要特别注意安全问题,确保用户的凭据不会被泄露。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值