SpringBoot 通过token进行身份验证,存储redis
代码:
public interface TokenManager {
/**
* 创建token
* @param userInfo
* @return
*/
String getToken(UserInfo userInfo);
/**
* 刷新用户
* @param token
*/
void refreshUserToken(String token);
/**
* 用户退出登陆
* @param token
*/
void loginOff(String token);
/**
* 获取用户信息
* @param token
* @return
*/
UserInfo getUserInfoByToken(String token);
}
具体实现:
@Component
public class RedisTokenManager implements TokenManager { @Autowired
private RedisUtils redisUtils; @Autowired
private GlobalConfig globalConfig; /**
* 创建token
* @param userInfo
* @return
*/
public String getToken(UserInfo userInfo){
//使用uuid作为源token
String token = UUID.randomUUID().toString().replace("-", "");
String token_format=String.format(Constants.TOKEN_FORMAT,token);
redisUtils.set(token_format,userInfo,globalConfig.getTokenExpires());
return token;
} /**
* 刷新用户
* @param token
*/
public void refreshUserToken(String token){
token=String.format(Constants.TOKEN_FORMAT,token);
if(redisUtils.exists(token)){
redisUtils.setExpireTime(token, globalConfig.getTokenExpires());
}
} /**
* 用户退出登陆
* @param token
*/
public void loginOff(String token){
token=String.format(Constants.TOKEN_FORMAT,token);
redisUtils.remove(token);
} /**
* 获取用户信息
* @param token
* @return
*/
public UserInfo getUserInfoByToken(String token){
token=String.format(Constants.TOKEN_FORMAT,token);
if(redisUtils.exists(token)){
return (UserInfo)redisUtils.get(token);
}
return null;
}
}
对TokenManager进行二次封装,每次操作不需要token参数
@Component
public class AuthManager { @Autowired
private TokenManager tokenManager; /**
* 获取请求体
* @return
*/
public HttpServletRequest getRequest(){
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
} /**
* 登录
* @param userInfo
* @return
*/
public String signIn(UserInfo userInfo){
return tokenManager.getToken(userInfo);
} /**
* 获取该访问用户信息
* @return
*/
public UserInfo getUserInfo(){
HttpServletRequest request=getRequest();
String token=request.getAttribute(Constants.USER_TOKEN).toString();
UserInfo userInfo=tokenManager.getUserInfoByToken(token);
if(userInfo==null){
throw new AuthException("该用户已过期", HttpStatus.UNAUTHORIZED.value());
}
return userInfo;
} /**
* 刷新该登录用户,延时
*/
public void refreshUserInfo(){
HttpServletRequest request=getRequest();
String token=request.getAttribute(Constants.USER_TOKEN).toString();
tokenManager.refreshUserToken(token);
} /**
* 注销该访问用户
*/
public void loginOff(){
HttpServletRequest request=getRequest();
String token=request.getAttribute(Constants.USER_TOKEN).toString();
tokenManager.loginOff(token);
}
}
上面是对用户信息基本操作
对用户进行控制,部分接口可以不登陆访问
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AuthIgnore {
}
拦截器:
@Component
public class AuthorizationInterceptor extends HandlerInterceptorAdapter { @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
AuthIgnore annotation;
if(handler instanceof HandlerMethod) {
annotation = ((HandlerMethod) handler).getMethodAnnotation(AuthIgnore.class);
}else{
return true;
} //如果有@AuthIgnore注解,则不验证token
if(annotation != null){
return true;
} //获取用户凭证
String token = request.getHeader(Constants.USER_TOKEN);
if(StringUtils.isBlank(token)){
token = request.getParameter(Constants.USER_TOKEN);
}
if(StringUtils.isBlank(token)){
Object obj = request.getAttribute(Constants.USER_TOKEN);
if(null!=obj){
token=obj.toString();
}
} //token凭证为空
if(StringUtils.isBlank(token)){
throw new AuthException(Constants.USER_TOKEN + "不能为空", HttpStatus.UNAUTHORIZED.value());
} return true;
}
}
如果token参数必须放在请求体中,直接读取请求体会报错,requestbody miss
解决方法:https://www.cnblogs.com/hongdada/p/9171739.html
这里的注解只是标注那些不需要登陆的接口
上面相关redis操作在上面也写过,请看前面文章。
SpringBoot 通过token进行身份验证,存储redis的更多相关文章
- 基于 Token 的身份验证方法
使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录.大概的流程是这样的: 客户端使用用户名跟密码请求登录 服务端收到请求,去验证用户名与密码 验证成功后,服务端会签发一个 Toke ...
- (转)基于 Token 的身份验证
原文:https://ninghao.net/blog/2834 最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twitter,Google+,G ...
- 基于 Token 的身份验证:JSON Web Token(附:Node.js 项目)
最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份验证方法,Token 扩展性更强, ...
- 基于token的身份验证JWT
传统身份验证的方法 HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用.这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下 ...
- [转载]基于 Token 的身份验证
作者:王皓发布于:2015-08-07 22:06更新于:2015-08-07 22:07 最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twit ...
- JavaWeb—基于Token的身份验证
传统身份验证的方法 HTTP Basic Auth HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password,简言之,Basic Auth是配合RES ...
- 基于 Token 的身份验证:JSON Web Token(JWT)
1.传统身份验证和JWT的身份验证 传统身份验证: HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用.这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过 ...
- JAVA中的Token 基于Token的身份验证
最近在做项目开始,涉及到服务器与安卓之间的接口开发,在此开发过程中发现了安卓与一般浏览器不同,安卓在每次发送请求的时候并不会带上上一次请求的SessionId,导致服务器每次接收安卓发送的请求访问时都 ...
- 基于 Token 的身份验证
最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份验证方法,Token 扩展性更强, ...
随机推荐
- big and little endian
总是容易搞混big endian 和 little endian,但是找到一篇文章,其解释让人耳目一新. 文章链接:http://www.cs.umd.edu/class/sum2003/cmsc31 ...
- ef entity转json引起的Self referencing loop
问题简介:前段时间做项目时,将取到的entity往Redis cache里存放时报多重引用的错误. Self referencing loop detected for property 'Check ...
- Cipher
Description Bob and Alice started to use a brand-new encoding scheme. Surprisingly it is not a Publi ...
- 【转】阿里出品的ETL工具dataX初体验
原文链接:https://www.imooc.com/article/15640 来源:慕课网 我的毕设选择了大数据方向的题目.大数据的第一步就是要拿到足够的数据源.现实情况中我们需要的数据源分布在不 ...
- NGINX的几个应用场景
NGINX的几个应用场景 两个参考地址: NGINX的百度百科:https://baike.baidu.com/item/nginx/3817705?fr=aladdin NGINX的中文网站:htt ...
- flask设置cookie,设置session,模拟用户认证、模拟管理后台admin、模拟用户logout
设置cookie HTTP协议是无状态的,在一次请求响应结束后,服务器不会留下关于客户端状态的信息.但是对于某些web程序来说,客户端的信息有必要被记住,比如用户的登录状态,这样就可以根据用户的状态来 ...
- 转:"为自动填充列调整大小期间不能执行此操作"解决办法 .
转载自:http://blog.csdn.net/zhxingway/article/details/5384690 今天在测试的时候,打开一个窗口突然发现出现以下错误,就算我在打开窗口那个按钮里面和 ...
- 深入理解Node.js基于事件驱动的回调
回调和异步调用的关系 首先明确一点,回调并非是异步调用,回调是一种解决异步函数执行结果的处理方法.在异步调用,如果我们希望将执行的结果返回并且处理时,可以通过回调的方法解决.为了能够更好的区分回调和异 ...
- linux学习---ps、kill
一.ps 查看进程 ps 为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的:如果想对进程时间监控,应该用 top 工具 linux上进程有5种状态: 1. 运行(正在运行或 ...
- jsky使用小记
jsky是一款深度WEB应用安全评估工具,能轻松应对各种复杂的WEB应用,全面深入发现里面存在的安全弱点. jsky可以检测出包括SQL注入.跨站脚本.目录泄露.网页木马等在内的所有的WEB应用层漏洞 ...