Spring Security + OAuth2 - 黑马程序员(3. 服务器配置)学习笔记

上一篇:Spring Security + OAuth2(2. 环境搭建)

下一篇:Spring Security + OAuth2(4. OAuth 的四种模式)

1. 授权服务器配置

  • 当前操作都是针对 distributed-security-uaa 模块的
  • 先上目录结构,省的懵逼
    在这里插入图片描述

1.1 EnableAuthorizationServer

  • 可以用 @EnableAuthorizationServer 注解并继承AuthorizationServerConfigurerAdapter 来配置OAuth2.0 授权 服务器。

简单说明部分(完整代码在下面):

  1. 在Config包下创建AuthorizationServer,并且需要继承 AuthorizationServerConfigurerAdapter

    @Configuration 
    @EnableAuthorizationServer 
    public class AuthorizationServer extends AuthorizationServerConfigurerAdapter { 
    	public AuthorizationServerConfigurerAdapter() {} 
    	public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {} 
    	public void configure(ClientDetailsServiceConfigurer clients) throws Exception {} 
    	public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {}
    }
    
  2. 继承后,需要实现三个方法,上面也体现出来了,分别是

    • ClientDetailsServiceConfigurer:用来配置客户端详情服务(ClientDetailsService),客户端详情信息在 这里进行初始化,你能够把客户端详情信息写死在这里或者是通过数据库来存储调取详情信息。
      该方法也就是配置支持哪些客户端来请求
    • AuthorizationServerEndpointsConfigurer:用来配置令牌(token)的访问端点(来申请令牌的 URL)和令牌服务(token services)(令牌的生成发放规则)。
    • AuthorizationServerSecurityConfigurer:用来配置令牌端点的安全约束

1.2 配置客户端详细信息

  • 在 1.1 创建的方法中编写
    这里暂时使用内存的方式配置
    //客户端详情服务
    @Override
    public void configure(ClientDetailsServiceConfigurer clients)
            throws Exception {
        /*clients.withClientDetails(clientDetailsService);*/
        clients.inMemory()// 使用in-memory存储
                .withClient("c1")// client_id
                .secret(new BCryptPasswordEncoder().encode("secret"))//客户端密钥
                .resourceIds("res1")//资源列表
                .authorizedGrantTypes("authorization_code", "password","client_credentials","implicit","refresh_token")// 该client允许的授权类型authorization_code,password,refresh_token,implicit,client_credentials
                .scopes("all")// 允许的授权范围
                .autoApprove(false)//false跳转到授权页面
                //加上验证回调地址
                .redirectUris("http://www.baidu.com")
                ;
    }
    

简单说明:

  1. ClientDetailsServiceConfigurer 能够使用内存或者JDBC来实现客户端详情服务(ClientDetailsService)

  2. ClientDetailsService负责查找ClientDetails,而ClientDetails有几个重要的属性如下列表:

    • clientId:(必须的)用来标识客户的Id。
    • secret:(需要值得信任的客户端)客户端的安全码 / 密钥,如果有的话。
    • scope:用来限制客户端的访问范围,如果为空(默认)的话,那么客户端拥有全部的访问范围。
    • authorizedGrantTypes:此客户端可以使用的授权类型,默认为空。
    • authorities:此客户端可以使用的权限(基于Spring Security authorities)。
  3. 客户端详情(Client Details)能够在应用程序运行的时候进行更新,可以通过访问底层的存储服务(例如将客户 端详情存储在一个关系数据库的表中,就可以使用 JdbcClientDetailsService)或者通过自己实现 ClientRegistrationService接口(同时你也可以实现 ClientDetailsService 接口)来进行管理

1.3 管理令牌

  • AuthorizationServerTokenServices 接口定义了一些操作使得你可以对令牌进行一些必要的管理,令牌可以被用来 加载身份信息,里面包含了这个令牌的相关权限。
  • 令牌的管理有三种方式:
    1. InMemoryTokenStore:使用内存的方式
    2. JdbcTokenStore:使用数据库的方式
    3. JwtTokenStore:使用 JWT 的方式(后面再说)
  1. 定义TokenConfig
    在config包下定义 TokenConfig ,暂时先使用InMemoryTokenStore,生成一个普通的令牌。

    @Configuration 
    public class TokenConfig { 
    	@Bean 
    	public TokenStore tokenStore() {
    		return new InMemoryTokenStore(); 
    	} 
    }
    
  2. 定义AuthorizationServerTokenServices
    AuthorizationServer 中定义AuthorizationServerTokenServices

    @Autowired 
    private TokenStore tokenStore; 
    @Autowired 
    private ClientDetailsService clientDetailsService; 
    @Bean 
    public AuthorizationServerTokenServices tokenService() { 
    	DefaultTokenServices service=new DefaultTokenServices();
        service.setClientDetailsService(clientDetailsService);//客户端详情服务
        service.setSupportRefreshToken(true);//支持刷新令牌
        service.setTokenStore(tokenStore);//令牌存储策略
        
        service.setAccessTokenValiditySeconds(7200); // 令牌默认有效期2小时
        service.setRefreshTokenValiditySeconds(259200); // 刷新令牌默认有效期3天
        return service;
    }
    

1.4 令牌访问端点配置

  • AuthorizationServerEndpointsConfigurer 通过设定以下属性决定支持的授权类型(Grant Types):
  1. authenticationManager:认证管理器,当你选择了资源所有者密码(password)授权类型的时候,请设置 这个属性注入一个 AuthenticationManager 对象。
  2. userDetailsService:如果你设置了这个属性的话,那说明你有一个自己的 UserDetailsService 接口的实现, 或者你可以把这个东西设置到全局域上面去(例如 GlobalAuthenticationManagerConfigurer 这个配置对 象),当你设置了这个之后,那么 “refresh_token” 即刷新令牌授权类型模式的流程中就会包含一个检查,用 来确保这个账号是否仍然有效,假如说你禁用了这个账户的话。
  3. authorizationCodeServices:这个属性是用来设置授权码服务的(即 AuthorizationCodeServices 的实例对 象),主要用于 “authorization_code” 授权码类型模式。
  4. implicitGrantService:这个属性用于设置隐式授权模式,用来管理隐式授权模式的状态。
  5. tokenGranter:当你设置了这个东西(即 TokenGranter 接口实现),那么授权将会交由你来完全掌控,并 且会忽略掉上面的这几个属性,这个属性一般是用作拓展用途的,即标准的四种授权模式已经满足不了你的 需求的时候,才会考虑使用这个
  • AuthorizationServer 配置令牌访问端点

    
    @Autowired
    private AuthorizationCodeServices authorizationCodeServices;
    
    @Autowired
    private AuthenticationManager authenticationManager;
    
    //设置授权码模式的授权码如何存取,暂时采用内存方式
    @Bean
    public AuthorizationCodeServices authorizationCodeServices() {
        return new InMemoryAuthorizationCodeServices();
    }
    
    // 令牌访问端点的配置
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
        endpoints
                .authenticationManager(authenticationManager)//认证管理器
                .authorizationCodeServices(authorizationCodeServices)//授权码服务
                .tokenServices(tokenService())//令牌管理服务
                .allowedTokenEndpointRequestMethods(HttpMethod.POST);
    }
    
    

1.5 令牌端点的安全约束

  • AuthorizationServerSecurityConfigurer:用来配置令牌端点(Token Endpoint)的安全约束

  • AuthorizationServer 中配置如下

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security){
        security
                .tokenKeyAccess("permitAll()")                    //oauth/token_key是公开
                .checkTokenAccess("permitAll()")                  //oauth/check_token公开
                .allowFormAuthenticationForClients()				//表单认证(申请令牌)
        ;
    }
    

配置授权端点的URL(Endpoint URLs)

  • AuthorizationServerEndpointsConfigurer 这个配置对象有一个叫做 pathMapping() 的方法用来配置端点URL链接,它有两个参数:

    1. 第一个参数:String 类型的,这个端点URL的默认链接。
    2. 第二个参数:String 类型的,你要进行替代的URL链接。
  • 以上的参数都将以 “/” 字符为开始的字符串,框架的默认URL链接如下列表,就是上述的第一个参数:

    1. /oauth/authorize:授权端点。
    2. /oauth/token:令牌端点。
    3. /oauth/confirm_access:用户确认授权提交端点。
    4. /oauth/error:授权服务错误信息端点。
    5. /oauth/check_token:用于资源服务访问的令牌解析端点。
    6. /oauth/token_key:提供公有密匙的端点,如果你使用JWT令牌的话。
  • 需要注意的是授权端点这个URL应该被Spring Security保护起来只供授权用户访问

1.6 web安全配置

  • 在 Config 包下进行编写

    @Configuration
    @EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled = true)
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
        //认证管理器
        @Bean
        public AuthenticationManager authenticationManagerBean() throws Exception {
            return super.authenticationManagerBean();
        }
        //密码编码器
        @Bean
        public PasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }
    
        //安全拦截机制(最重要)
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.csrf().disable()
                    .authorizeRequests()
                    .antMatchers("/r/r1").hasAnyAuthority("p1")
                    .antMatchers("/login*").permitAll()
                    .anyRequest().authenticated()
                    .and()
                    .formLogin()
            ;
    
        }
    }
    

1.7 AuthorizationServer 类的完整代码(可跳过)

@Configuration
@EnableAuthorizationServer
public class AuthorizationServer extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private TokenStore tokenStore;

    @Autowired
    private ClientDetailsService clientDetailsService;

    @Autowired
    private AuthorizationCodeServices authorizationCodeServices;

    @Autowired
    private AuthenticationManager authenticationManager;

    //客户端详情服务
    @Override
    public void configure(ClientDetailsServiceConfigurer clients)
            throws Exception {
       /*clients.withClientDetails(clientDetailsService);*/
       clients.inMemory()// 使用in-memory存储
                .withClient("c1")// client_id
                .secret(new BCryptPasswordEncoder().encode("secret"))//客户端密钥
                .resourceIds("res1")//资源列表
                .authorizedGrantTypes("authorization_code", "password","client_credentials","implicit","refresh_token")// 该client允许的授权类型authorization_code,password,refresh_token,implicit,client_credentials
                .scopes("all")// 允许的授权范围
                .autoApprove(false)//false跳转到授权页面
                //加上验证回调地址
                .redirectUris("http://www.baidu.com");
    }


    //令牌管理服务
    @Bean
    public AuthorizationServerTokenServices tokenService() {
        DefaultTokenServices service=new DefaultTokenServices();
        service.setClientDetailsService(clientDetailsService);//客户端详情服务
        service.setSupportRefreshToken(true);//支持刷新令牌
        service.setTokenStore(tokenStore);//令牌存储策略
        
        service.setAccessTokenValiditySeconds(7200); // 令牌默认有效期2小时
        service.setRefreshTokenValiditySeconds(259200); // 刷新令牌默认有效期3天
        return service;
    }

    //设置授权码模式的授权码如何存取,暂时采用内存方式
    @Bean
    public AuthorizationCodeServices authorizationCodeServices() {
        return new InMemoryAuthorizationCodeServices();
    }

    // 令牌访问端点的配置
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
        endpoints
                .authenticationManager(authenticationManager)//认证管理器
                .authorizationCodeServices(authorizationCodeServices)//授权码服务
                .tokenServices(tokenService())//令牌管理服务
                .allowedTokenEndpointRequestMethods(HttpMethod.POST);
    }

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security){
        security
                .tokenKeyAccess("permitAll()")                    //oauth/token_key是公开
                .checkTokenAccess("permitAll()")                  //oauth/check_token公开
                .allowFormAuthenticationForClients()				//表单认证(申请令牌)
        ;
    }

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
spring-security-oauth2-2.2.3.release.jar是一个用于实现基于OAuth 2.0协议的安全认证和授权的Java库。OAuth 2.0协议是一种用于授权的开放标准,它允许用户通过授权代理向第三方应用程序授权访问受保护的资源,而无需将用户的凭证(例如用户名和密码)透露给第三方。 spring-security-oauth2-2.2.3.release.jar提供了一套面向Spring应用程序的OAuth 2.0认证和授权解决方案。它可以轻松地将OAuth 2.0集成到现有的Spring应用程序中,并提供了一系列的API和类,使开发人员可以方便地实现OAuth 2.0认证和授权流程。 使用spring-security-oauth2-2.2.3.release.jar,开发人员可以通过配置和自定义一些核心组件(例如TokenStore、AuthorizationServer和ResourceServer)来实现OAuth 2.0的四种授权类型:授权码模式、密码模式、客户端模式和简化模式。通过这些授权类型,开发人员可以实现不同的应用场景和需求。 此外,spring-security-oauth2-2.2.3.release.jar支持使用不同的存储机制来存储和管理OAuth 2.0令牌,例如内存存储、数据库存储和Redis存储。开发人员可以根据自己的需求选择并配置合适的存储机制。 总的来说,spring-security-oauth2-2.2.3.release.jar提供了一种简单、可扩展且安全的方式来实现OAuth 2.0认证和授权。无论您是开发面向Web、移动还是其他类型应用程序,该库都能帮助您轻松地实现与第三方应用程序的安全集成。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yuan_404

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值