启动类
@SpringBootApplication@EnableDiscoveryClientpublic class ServiceOauthHw9900Application {public static void main(String[] args) {SpringApplication.run(ServiceOauthHw9900Application.class, args);}}
config自定义一个 OauthServerConfiger 。当前类为Oauth2 server的配置类(需要继承特定的父类
AuthorizationServerConfigurerAdapter)
@Configuration@EnableAuthorizationServer//开启认证服务器功能public class OauthServerConfiger extends AuthorizationServerConfigurerAdapter {@Autowiredprivate AuthenticationManager authenticationManager;/*** 客户端详情配置,*比如client_id,secret*当前这个服务就如同QQ平台,拉勾网作为客户端需要qq平台进行登录授权认证等,提前需要到QQ平台注册,QQ平台会给拉勾网*颁发client_id等必要参数,表明客户端是谁* @param clients* @throws Exception*/@Overridepublic void configure(ClientDetailsServiceConfigurer clients) throws Exception {super.configure(clients);// 客户端信息存储在什么地方,可以在内存中,可以在数据库里clients.inMemory()// 添加一个client配置,指定其client_id.withClient("quellanan")//指定客户端的密码/安全码.secret("abcdefg")//指定客户端所能访问资源id清单,此处的资源id是需要在具体的资源服务器上也配置一样.redirectUris("*")//认证类型/令牌颁发模式,可以配置多个在这里,但是不一定都用,具体使用哪种方式颁发token,需要客户端调用的时候传递参数指定.authorizedGrantTypes("password","refresh_token")//客户端的权限范围,此处配置为all全部即可.scopes("all");}/*** 认证服务器最终是以api接口的方式对外提供服务(校验合法性并生成令牌、校验令牌等)* 那么,以api接口方式对外的话,就涉及到接口的访问权限,我们需要在这里进行必要的配置* @param security* @throws Exception*/@Overridepublic void configure(AuthorizationServerSecurityConfigurer security) throws Exception {super.configure(security);// 相当于打开endpoints 访问接口的开关,这样的话后期我们能够访问该接口security// 允许客户端表单认证.allowFormAuthenticationForClients()// 开启端口/oauth/token_key的访问权限(允许).tokenKeyAccess("permitAll()")// 开启端口/oauth/check_token的访问权限(允许).checkTokenAccess("permitAll()");}@Overridepublic void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {super.configure(endpoints);endpoints// 指定token的存储方法.tokenStore(tokenStore())// token服务的一个描述,可以认为是token生成细节的描述,比如有效时间多少等.tokenServices(authorizationServerTokenServices())// 指定认证管理器,随后注入一个到当前类使用即可.authenticationManager(authenticationManager).allowedTokenEndpointRequestMethods(HttpMethod.GET,HttpMethod.POST);}/*该方法用于创建tokenStore对象(令牌存储对象)token以什么形式存储*/public TokenStore tokenStore(){return new InMemoryTokenStore();// 使用jwt令牌//return new JwtTokenStore(jwtAccessTokenConverter());}/*** 该方法用户获取一个token服务对象(该对象描述了token有效期等信息)*/public AuthorizationServerTokenServices authorizationServerTokenServices() {// 使用默认实现DefaultTokenServices defaultTokenServices = new DefaultTokenServices();defaultTokenServices.setSupportRefreshToken(true); // 是否开启令牌刷新defaultTokenServices.setTokenStore(tokenStore());// 针对jwt令牌的添加//defaultTokenServices.setTokenEnhancer(jwtAccessTokenConverter());// 设置令牌有效时间(一般设置为2个小时)defaultTokenServices.setAccessTokenValiditySeconds(20); // access_token就是我们请求资源需要携带的令牌// 设置刷新令牌的有效时间defaultTokenServices.setRefreshTokenValiditySeconds(259200); // 3天return defaultTokenServices;}}
关于三个 configure ?法configure(
ClientDetailsServiceConfifigurer clients):?来配置客户端详情服务(ClientDetailsService),客户端详情信息在 这?进?初始化,你能够把客户端详情信息写死在这?或者是通过数据库来存储调取详情信息
confifigure(
AuthorizationServerEndpointsConfifigurer endpoints):?来配置令牌(token)的访问端点和令牌服务(token services)
confifigure(
AuthorizationServerSecurityConfifigurer oauthServer):?来配置令牌端点的安全约束.
关于 TokenStoreInMemoryTokenStore默认采?,它可以完美的?作在单服务器上(即访问并发量 压?不?的情况下,并且它在失败的时候不会进?备份),?多数的项?都可以使?这个版本的实现来进? 尝试,你可以在开发的时候使?它来进?管理,因为不会被保存到磁盘中,所以更易于调试 。
JdbcTokenStore这是?个基于JDBC的实现版本,令牌会被保存进关系型数据库 。使?这个版本的实现时,你可以在不同的服务器之间共享令牌信息,使?这个版本的时候请注意把"springjdbc"这个依赖加?到你的 classpath当中 。JwtTokenStore 这个版本的全称是 JSON Web Token(JWT),它可以把令牌相关的数据进?编码(因此对于后端服务来说,它不需要进?存储,这将是?个重?优势),缺点就是这个令牌占?的空间会?较?,如果你加?了?较多?户凭证信息,JwtTokenStore 不会保存任何数据 。
推荐阅读
- 不爱跳槽的程序员集中在8-17k,揭晓中国开发者的真实现状
- 堆和二叉堆的实现和特性
- 芯片加密技术是什么?如何实现芯片加密
- 开发人员如何快速定制化实现一个基于Solr的搜索引擎
- Sa-Token - 功能最全的 Java 权限认证框架
- 你的摄像头可能被入侵!教你用Python实现窃取摄像头照片
- 干货!如何实现一个分布式定时器
- 玛雅人预言2020年世界末日为什么没有实现 玛雅预言的世界末日为什么没有实现
- 三种实现VLAN间通信的方式,实现VLAN间通信
- C语言实现MD5加密,竟如此简单