29.OAuth2.0-Spring Cloud Security OAuth2-授权服务配置

授权服务器配置

EnableAuthorizationServer

  • 可以用@EnableAuthorizationServer注解并继承AuthorizationServerConfigurationAdapter来配置OAuth2.0授权服务器。
  • 在Config包下创建AuthorizationServer:
@Configuration
@EnableAuthorizationServer
public class AuthorizationServer extends AuthorizationServerConfigurerAdapter {
    //略
}
  • AuthorizationServerConfigurationAdapter要求配置以下几个类,这个几个是由Spring创建的独立的配置对象,它们会被Spring传入AuthorizationServerConfiguration中进行配置。
public class AuthorizationServerConfigurerAdapter implements AuthorizationServerConfigurer {
    public AuthorizationServerConfigurerAdapter() {
    }

    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
    }

    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
    }

    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
    }
}
  • ClientDetailsServiceConfiguration:用来配置客户端详情服务(ClientDetailsService),客户端详情信息在这里进行初始化,你能够把客户端详情信息写死在这里或者通过数据来存储调取详情信息。
  • AuthorizationServerEndpointsConfiguration:用来配置令牌(token)的访问端点和令牌服务(token services)。
  • AuthorizationServerSecurityConfiguration:用来配置令牌端点的安全约束。

配置客户端详情信息

  • ClientDetailsServiceConfiguration能够使用内存或者JDBC来实现客户端详情服务(ClientDetailsService),ClientDetailsSevice负责查找ClientDetails,而ClientDetails有几个重要的属性如下列表:
    • clientId:(必须的)用来标识客户的Id。
    • secret:(需要值得信任的客户端)客户端安全码,如果有的话。
    • scope:用来限制客户端的访问范围,如果为空(默认)的话,那么客户端拥有全部的访问范围。
    • authorizationGrantTypes:此客户端可以使用的授权类型,默认为空。
    • authorities:此客户端可以使用权限(基于Spring Security authorities)。
  • 客户端详情(Client Details)能够在应用程序运行的时候进行更新,可以通过访问底层的存储服务(例如将客户端详情存储在一个关系数据库的表中,就可以使用JdbcClientDetailsService)或者通过自己实现clientRegistrationService接口(同时你也可以实现ClientDetailsService接口)来进行管理。
  • 我们暂时使用内存方式存储客户端详情信息,配置如下:
 @Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
    //暂时使用内存方式
    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允许的授权的类型
            .scopes("all")//允许范围
            .autoApprove(false)//false跳转到授权页面
            .redirectUris("http://www.baidu.com");//加上验证回调地址
}

管理令牌

  • AuthorizationServerTokenServices接口定义了一些操作使得你可以对令牌进行一些必要的管理,令牌可以被用来加载身份信息,里面包含了这个令牌得相关权限。
  • 自己客可以创建AuthorizationSeerverTokenService这个接口的实现,则需要继承DefaultTokenServices这个类,里面包含了一些有用实现,你可使用它来修改令牌的格式和令牌的存储。默认的,当它尝试创建一个令牌的时候,是使用随机值来进行填充的,除了持久化令牌是委托一个TokenStore接口来实现以外,这个类几乎帮你做了所有的事情。并且TokenStore这个接口有一个默认的实现,它就是InMemoryTokenStore,如其名,所有的令牌是被保存在了内存中。除了使用这个类以外,你还可以使用一些其他的预定义实现,下面有几个版本,它们都实现了TokenStore接口:
    • InMemoryTokenStore:这个版本的实现是被默认采用的,它可以完美的工作在单服务器上(即访问并发量压力不大的情况下,并且它在失败的时候不会进行备份),大多数的项目都可以使用这个版本的实现来进行尝试,你可以在开发的时候使用它来进行管理,因为不会被保存到磁盘中,所以更易于调式。
    • JdbcTokenStore:这是个基于JDBC的实现版本,令牌会被保存进关系型数据库。使用这个版本的实现时,你可以在不同的服务器之间共享令牌信息,使用这个版本的时候请注意把“spring-jdbc”这个依赖加入到你的classpath当中。
    • JwtTokenStore:这个版本的全程是JSON Web Token(JWT),它可以把令牌相关的数据库进行编码(因此对于后端服务来说,它不需要进行存储,这将是一个重大优势),但是它有一个缺点,那就是撤销一个已经授权令牌将会非常困难,所以它通常用来处理一个生命周期较短的令牌以及撤销刷新令牌(refresh_token)。另外一个缺点就是这个令牌占用的空间会比较大,如果你加入了比较多用户凭证信息。JwtTokenStore不会保存任何数据,但是它在转换令牌值以及授权信息方面与DefaultTokenServices所扮演的角色是一样的。
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 tokenServices(){
    DefaultTokenServices service=new DefaultTokenServices();
    service.setClientDetailsService(clientDetailsService);//客户端信信息的服务
    service.setSupportRefreshToken(true);//是否产生刷新令牌
    service.setTokenStore(tokenStore);//令牌存储策略
    service.setAccessTokenValiditySeconds(7200);//令牌默认有效期2小时
    service.setRefreshTokenValiditySeconds(259200);//刷新令牌默认有效期3天
    return service;
}

令牌访问端点配置

  • AuthorizationServerEndpointsConfiguration这个对象的实例可以完成令牌服务以及令牌endpoint配置。
配置授权类型(Rant Types)
  • AuthorizationServerEndpointsConfiguration通过设定以下属性决定支持的授权类型(Grant Types):
    • authorizationManager:认证管理器,当你选择了资源所有者密码(password)授权类型的时候,请设置这个属性注入一个AuthorizationManager对象。
    • userDetailsService:如果你设置了这个属性的话,那说明你有一个自己的UserDetailsService接口的实现,或者你可以把这个定西设置到全局域上面去(例如GlobalAuthenticationManagerConfiguration这个配置对象),当你确保这个账号是否仍然有效,假如你说禁用了这个账户的话。
    • authorizationCodeServices:这个属性是用来设置授权码服务的(即AuthorizationCodeService的实例对象),主要用于”authorization_code“授权码类型模式。
    • implicitGrantService:这个属性用于设置隐式授权模式,用来管理隐式授权模式的状态。
    • tokenGranter:当你设置这个东西(即TokenGranter接口实现),那么授权将会交由你来完成掌握,并且会忽略掉上面几个属性,这个属性一般是用作拓展用途的,即标准的四种授权模式已经满足不了你的需求的时候,才会考虑使用这个。
配置授权端点的URL(Endpoint URLs):
  • AuthorizationServerEndpsConfiguration这个配置对象有一个叫做pathMapping()方法用来配置端点URL链接,它有两个参数:
    • 第一个参数:String类型的,这个端点URL的默认链接。
    • 第二个参数:String类型的,你要进行替代的URL链接。
  • 以上的参数都将以”/“字符为开始的字符串,框架的默认URL链接如下列表,可以作为这个pathMapping()方法的第一个参数:
    • /oauth/auothoriza:授权端点。
    • /oauth/token:令牌端点。
    • /oauth/confirm_access:用户确认授权提交端点。
    • /oauth/error:授权服务错误信息端点。
    • /oauth/token_key:提交公有密钥的端点,如果你使用JWT令牌的话。
  • 需要注意的是授权端点这个URL应该被Spring Security保存起来只供授权用户访问。
  • 在AuthorizationServer配置令牌访问端点
/**
 * 令牌管理服务
 * @return
 */
@Bean
public AuthorizationServerTokenServices tokenServices(){
    DefaultTokenServices service=new DefaultTokenServices();
    service.setClientDetailsService(clientDetailsService);//客户端信信息的服务
    service.setSupportRefreshToken(true);//是否产生刷新令牌
    service.setTokenStore(tokenStore);//令牌存储策略
    service.setAccessTokenValiditySeconds(7200);//令牌默认有效期2小时
    service.setRefreshTokenValiditySeconds(259200);//刷新令牌默认有效期3天
    return service;
}

令牌端点的安全约束

  • AuthorizationServerSecurityConfigure:用来配置令牌端点(Token Endpoint)的安全约束,在AuthorizationServer中配置如下。
/**
 * 令牌访问端点安全策略
 * @param security
 * @throws Exception
 */
@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
    security
            .tokenKeyAccess("permitAll()")//oauth/token_key公开
            .checkTokenAccess("permitAll()")///oauth/check_token公开
            .allowFormAuthenticationForClients();//表单认证,申请令牌
}
  • (1)tokenKey这个endpoint当使用JwtToken且使用非对称加密时,资源服务用于获取公钥而开发的,这里指这个endpoint完全公开
  • (2)checkToken这个endpoint完全公开
  • (3)允许表单认证

web安全配置

  • 将Spring-Boot工程中的WebSecurityConfig拷贝到UAA工程中。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容