token处理之一基本参数配置

处理token时间、存储策略,客户端配置等

以前的都是spring security oauth默认的token生成策略,token默认在org.springframework.security.oauth2.provider.token.DefaultTokenServices 类里生成的,感兴趣可以看看

/**
* 认证服务器
* ClassName: ImoocAuthenticationServerConfig
* @Description: TODO
* @author lihaoyang
* @date 2018年3月12日
*/
@Configuration
@EnableAuthorizationServer //这个注解就是实现了一个认证服务器
public class ImoocAuthenticationServerConfig { }

是uuid,现在做自定义token,token是在认证服务器里生成的,需要在认证服务器也就是ImoocAuthenticationServerConfig 里写代码。

认证服务器配置:

/**
* 认证服务器
* ClassName: ImoocAuthenticationServerConfig
* @Description:
* extends AuthorizationServerConfigurerAdapter 自定义token生成
* @author lihaoyang
* @date 2018年3月12日
*/
@Configuration
@EnableAuthorizationServer //这个注解就是实现了一个认证服务器
public class ImoocAuthenticationServerConfig extends AuthorizationServerConfigurerAdapter{ /*
* 不继承AuthorizationServerConfigurerAdapter,这些bean会自己找,配了,就要自己实现
*/ @Autowired
private AuthenticationManager authenticationManager; @Autowired
private UserDetailsService userDetailsService; //配置文件
@Autowired
private SecurityProperties securityProperties; //token存在redis,默认是在内存
@Autowired
private TokenStore tokenStore; /**
* 配置TokenEndpoint 是 /oauth/token处理的入口点
*/
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.tokenStore(tokenStore)
.authenticationManager(authenticationManager)
.userDetailsService(userDetailsService);
} /**
* 功能:认证服务器会给哪些第三方应用发令牌
* 覆盖了该方法,application.properties里配置的
* security.oauth2.client.clientId = imooc
* security.oauth2.client.clientSecret = imoocsecret
* 就失效了
*/
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
//1,写死
// clients.jdbc(dataSource)就是qq场景用的,有第三方公司注册过来,目前场景是给自己的应用提供接口,所以用内存就行
// clients.inMemory()
// //~========================== 在这里配置和写配置文件一样================
// .withClient("imooc") //第三方应用用户名
// .secret("imoocsecret") //密码
// .accessTokenValiditySeconds(7200)//token有效期
// .authorizedGrantTypes("password","refresh_token") //支持的授权模式
// .scopes("all","read","write") //相当于oauth的权限,这里配置了,请求里的必须和这里匹配
// //~=======如果有多个client,这里继续配置
// .and()
// .withClient("xxxxx"); //2,读取配置文件
InMemoryClientDetailsServiceBuilder builder = clients.inMemory();
//判断是否配置了客户端
if(ArrayUtils.isNotEmpty(securityProperties.getOauth2().getClients())){
for (OAuth2ClientProperties config : securityProperties.getOauth2().getClients()) {
builder.withClient(config.getClientId())
.secret(config.getClientSecret())
.accessTokenValiditySeconds(config.getAccessTokenValiditySeconds())
.authorizedGrantTypes("password","refresh_token") //这些也可以配置也可以写死,看心情
.scopes("all","read","write");
}
} }
}

Token默认是存在内存的,这样服务器重启后,就需要重新登录,所以存在redis,(先有个redis,我是装了个windows版的)比存在数据库好,需要配置:

/**
* token存储到redis,默认是在内存不行
* ClassName: TokenStoreConfig
* @Description: token存储策略
* @author lihaoyang
* @date 2018年3月15日
*/
@Configuration
public class TokenStoreConfig { @Autowired
private RedisConnectionFactory redisConnectionFactory; @Bean
public TokenStore redisTokenStore(){
return new RedisTokenStore(redisConnectionFactory);
} }

OAuth相关配置类:

package com.imooc.security.core.properties;

/**
* 接口授权客户端配置 ClassName: OAuth2ClientProperties
*
* @Description: 接口授权客户端配置
* @author lihaoyang
* @date 2018年3月15日
*/
public class OAuth2ClientProperties { private String clientId; private String clientSecret; private int accessTokenValiditySeconds = 3600; //没配置就用默认值 // xxxxx在这里扩展配置 public String getClientId() {
return clientId;
} public void setClientId(String clientId) {
this.clientId = clientId;
} public String getClientSecret() {
return clientSecret;
} public void setClientSecret(String clientSecret) {
this.clientSecret = clientSecret;
} public int getAccessTokenValiditySeconds() {
return accessTokenValiditySeconds;
} public void setAccessTokenValiditySeconds(int accessTokenValiditySeconds) {
this.accessTokenValiditySeconds = accessTokenValiditySeconds;
} }
package com.imooc.security.core.properties;

/**
* 多个接口客户端,是数组,只有一个的话就不用这个了
* ClassName: OAuth2Properties
* @Description: TODO
* @author lihaoyang
* @date 2018年3月15日
*/
public class OAuth2Properties { private OAuth2ClientProperties[] clients = {}; public OAuth2ClientProperties[] getClients() {
return clients;
} public void setClients(OAuth2ClientProperties[] clients) {
this.clients = clients;
} }

这样只需要在application.properties里配置客户端,可以配置fuo

#第三方应用client_id

imooc.security.oauth2.clients[0].clientId = imooc
imooc.security.oauth2.clients[0].clientSecret = imoocsecret
#token失效时间
imooc.security.oauth2.clients[0].accessTokenValiditySeconds = 3600

imooc.security.oauth2.clients[1].clientId = test
imooc.security.oauth2.clients[1].clientSecret = test

启动demo项目,测试:

redis是空的:

1,模拟获取手机验证码

2,手机验证码登录

响应:

{
"access_token": "ca7417ef-2792-4c81-b441-519f29046cae",
"token_type": "bearer",
"refresh_token": "f32a845b-5b2b-4761-ab0e-ec076c6c0280",
"expires_in": 3599,
"scope": "all read write"
}

redis中存了很多key:

拿token访问用户信息:

响应

总结:

1,认证服务器 ImoocAuthenticationServerConfig 需要继承 AuthorizationServerConfigurerAdapter ,来自定义token的存储、客户端的配置。

2,自定义TokenStoreConfig配置类,存储token在redis中。

2,token默认存在内存中,这样不行,一般存在redis中,所以需要一个redis

存在问题,token失效的时候,redis中的key还存在,怎么给删除了呢?

具体代码在github:https://github.com/lhy1234/spring-security

下一步自定义token的生成策略,用JWT

Spring Security构建Rest服务-1204-Spring Security OAuth开发APP认证框架之Token处理的更多相关文章

  1. Spring Security构建Rest服务-1205-Spring Security OAuth开发APP认证框架之Token处理

    token处理之二使用JWT替换默认的token JWT(Json Web Token) 特点: 1,自包含:jwt token包含有意义的信息 spring security oauth默认生成的t ...

  2. Spring Security构建Rest服务-1300-Spring Security OAuth开发APP认证框架之JWT实现单点登录

    基于JWT实现SSO 在淘宝( https://www.taobao.com )上点击登录,已经跳到了 https://login.taobao.com,这是又一个服务器.只要在淘宝登录了,就能直接访 ...

  3. Spring Security构建Rest服务-1201-Spring Security OAuth开发APP认证框架之实现服务提供商

    实现服务提供商,就是要实现认证服务器.资源服务器. 现在做的都是app的东西,所以在app项目写代码  认证服务器: 新建 ImoocAuthenticationServerConfig 类,@Ena ...

  4. Spring Security构建Rest服务-1200-SpringSecurity OAuth开发APP认证框架

    基于服务器Session的认证方式: 前边说的用户名密码登录.短信登录.第三方登录,都是普通的登录,是基于服务器Session保存用户信息的登录方式.登录信息都是存在服务器的session(服务器的一 ...

  5. Spring Security构建Rest服务-1202-Spring Security OAuth开发APP认证框架之重构3种登录方式

    SpringSecurityOAuth核心源码解析 蓝色表示接口,绿色表示类 1,TokenEndpoint 整个入口点,相当于一个controller,不同的授权模式获取token的地址都是 /oa ...

  6. Spring Security构建Rest服务-1203-Spring Security OAuth开发APP认证框架之短信验证码登录

    浏览器模式下验证码存储策略 浏览器模式下,生成的短信验证码或者图形验证码是存在session里的,用户接收到验证码后携带过来做校验. APP模式下验证码存储策略 在app场景下里是没有cookie信息 ...

  7. Spring Cloud构建微服务架构(三)消息总线

     注:此文不适合0基础学习者直接阅读,请先完整的将作者关于微服务的博文全部阅读一遍,如果还有疑问,可以再来阅读此文,地址:http://blog.csdn.net/sosfnima/article/d ...

  8. 构建微服务:Spring boot

    构建微服务:Spring boot 在上篇文章构建微服务:Spring boot 提高篇中简单介绍了一下spring data jpa的基础性使用,这篇文章将更加全面的介绍spring data jp ...

  9. Spring Cloud构建微服务架构(二)服务消费者

    Netflix Ribbon is an Inter Process Communication (IPC) cloud library. Ribbon primarily provides clie ...

随机推荐

  1. gj10 python socket编程

    10.1 HTTP.Socket.TCP这几个概念 五层网络模型 socket 不属于任何协议,是一个API,通过socket 可以和传输层的打交道,然后在之上可以实现自己的功能和协议 10.2 cl ...

  2. POP介绍与使用实践(快速上手动画)[转]

    前言 动画在APP开发过程中 大家多多少少都会接触到 而且随着ios7的扁平化风格启用之后 越来越多的APP开始尝试加入各种绚丽的动画交互效果以增加APP的用户体验(当然 还是以国外的APP居多) 有 ...

  3. java对redis的基本操作(一)

    一.server端安装 1.下载 https://github.com/MSOpenTech/redis 可看到当前可下载版本:redis2.6

  4. Oracle定义DES加密解密及MD5加密函数

    http://blog.csdn.net/xdweleven/article/details/38319351   (1)DES加密函数create or replace functionencryp ...

  5. Delphi 动态链接库的动态和静态调用 (仔细读一下)

    http://blog.163.com/bxf_0011/blog/static/35420330200952075114318/ 为了让人能快速的理解 静态调用.动态调用,现在做一个函数封装在一个D ...

  6. [leetcode] 15. Plus One

    这道题其实让我意识到了我的英文水平还有待加强.... 题目如下: Given a non-negative number represented as an array of digits, plus ...

  7. ionic4 ios调试打包

    在ionic3的时候打包上架过ios的版本,等到今天,差不多一年左右过去.做了个ionic4的app要测试打包的时候,才发现以前的东西忘的差不多了.不得不从头再来一遍,所幸的是这次看见了很多好的文章, ...

  8. Spring Boot - Spring Data

    使用JPA 虽然JPA是一个标准,但spring中一般就是使用hibernate实现的 使用JPA(Java Persistence API,Java持久化API,是个规范,其实是借助Hibernat ...

  9. 错误:Parameter '0' not found.Available parameters are [arg1, arg0, param1, param2]的解决方法

    调用的方法: List<Card> temp = cardService.queryRepeat(Type,shop); xml: <select id="queryRep ...

  10. app开发技术调研

    l  面向消费者与公众的应用系统,主要分为3种主流的渠道: 1.   web应用 2.   基于腾讯微信开放api构建的微信app 3.   移动端app ll 在移动端app方面,通过调研,现主流的 ...