然后我们就可以去进行OAuth2.0的相关配置了,方法很简单,只要在配置类上添加@EnableAuthorizationServer注解并让其继承自AuthorizationServerConfigurerAdapter 。最后重写其中的三个configure()方法即可 。
@Configuration@EnableAuthorizationServerpublic class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {@Autowiredprivate AuthenticationManager authenticationManager;//从WebSecurityConfig中获取的@Autowiredprivate AuthorizationCodeServices authorizationCodeServices;//本类中的,授权码模式需要@Autowiredprivate TokenStore tokenStore;//TokenConfig中的@Autowiredprivate PasswordEncoder passwordEncoder;//从WebSecurityConfig中获取的@Autowiredprivate ClientDetailsService clientDetailsService;//本类中的@Autowiredprivate JwtAccessTokenConverter jwtAccessTokenConverter;//TokenConfig中的//用来配置令牌端点的安全约束@Overridepublic void configure(AuthorizationServerSecurityConfigurer security) throws Exception {security.tokenKeyAccess("permitAll")// /oauth/token_key 提供公有密匙的端点 允许任何人访问.checkTokenAccess("permitAll")// /oauth/check_token :用于资源服务访问的令牌解析端点 允许任何人访问.allowFormAuthenticationForClients();//表单认证(申请令牌)}//用来配置客户端详情服务,客户端详情信息在这里进行初始化,//你能够把客户端详情信息写死在这里或者是通过数据库来存储调取详情信息@Overridepublic void configure(ClientDetailsServiceConfigurer clients) throws Exception {clients.withClientDetails(clientDetailsService);}//用来配置令牌(token)的访问端点(url)和令牌服务(token services)@Overridepublic void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {endpoints.authenticationManager(authenticationManager)//认证管理器,密码模式需要.authorizationCodeServices(authorizationCodeServices)//授权码服务,授权码模式需要.tokenServices(tokenService()).allowedTokenEndpointRequestMethods(HttpMethod.POST);//允许post提交}@Beanpublic AuthorizationCodeServices authorizationCodeServices(DataSource dataSource) {//设置授权码模式的授权码存取到数据中return new JdbcAuthorizationCodeServices(dataSource);}//客户端详情服务,从数据库中获取@Beanpublic ClientDetailsService clientDetailsService(DataSource dataSource) {ClientDetailsService clientDetailsService = new JdbcClientDetailsService(dataSource);((JdbcClientDetailsService)clientDetailsService).setPasswordEncoder(passwordEncoder);return clientDetailsService;}//令牌管理服务@Beanpublic AuthorizationServerTokenServices tokenService() {DefaultTokenServices service = new DefaultTokenServices();service.setClientDetailsService(clientDetailsService);//客户端信息服务service.setSupportRefreshToken(true);//支持自动刷新service.setTokenStore(tokenStore);//令牌增强TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();tokenEnhancerChain.setTokenEnhancers(Arrays.asList(jwtAccessTokenConverter));service.setTokenEnhancer(tokenEnhancerChain);service.setAccessTokenValiditySeconds(7200);//令牌默认有效期2小时service.setRefreshTokenValiditySeconds(259200);//刷新令牌默认有效期3天return service;}}
现在来解释一下上面代码中的内容
- ClientDetailsService我们配置了从数据库中获取客户端配置 。但是是怎么从数据库中获取的呢,这里用到了一个JdbcClientDetailsService,点击源码里看看
文章插图
可以看到,它是从 oauth_client_details 这张表里查出来的,所以我们的数据库中只要创建出这张表,表里再添加这些字段即可 。
- JdbcAuthorizationCodeServices原理和JdbcClientDetailsService差不多,都是创建出指定的表 。
- TokenStore 和 JwtAccessTokenConverter为了方便管理,我们使用TokenConfig这个类去配置Token相关的内容 。添加了@Bean注解将其添加到Spring容器后就可以在其它的类中去注入使用了 。@Configuration public class TokenConfig { private String SIGNING_KEY = "robod_hahaha"; //对称加密的密钥 @Bean public TokenStore tokenStore() { //JWT令牌方案 return new JwtTokenStore(jwtAccessTokenConverter()); } @Bean public JwtAccessTokenConverter jwtAccessTokenConverter() { JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); converter.setSigningKey(SIGNING_KEY); //对称秘钥,资源服务器使用该秘钥来验证 return converter; } } 采用了JWT令牌管理方式,然后使用了对称密钥去进行加密 。还有另外几种令牌管理方式:InMemoryTokenStore:在内存中存储令牌(默认)JdbcTokenStore:令牌存储在数据库中redisTokenStore:令牌存储在Redis中
- AuthorizationServerTokenServices这个是用来配置令牌管理服务的,我们配置了客户端详情服务,令牌增强等内容 。
推荐阅读
- BIOS 和UEFI 启动系统的区别
- 系统架构设计工具—SystemArchitect
- 金融级分布式交易的技术路径
- 怎么做仓库管理系统?
- Linux操作系统:文件的逻辑组织
- 2 「系统架构」如何使用Dockerfile制作Docker容器?
- 电脑装系统的原理知识介绍,想学电脑装系统,这些知识必须要懂
- 几十年前的操作系统用到现在,下一代操作系统会是什么样的?
- 购物系统需求分析
- 基于无线传感器网络的智能交通系统