JWT实现用户权限认证
网上的java基础教程曾教会我们,将用户登录信息存在session(服务器端)中,需要验证的时候拿出来作对比以达到身份
验证的效果。但这种方式暴露的问题也是可想而知的:
1.Seesion:每次认证用户发起请求时,服务器需要去创建一个记录来存储信息。当越来越多的用户发请求时,内存的开销也会不断增加。
2.可扩展性:在服务端的内存中使用Seesion存储登录信息,伴随而来的是可扩展性问题。
3.CORS(跨域资源共享):当我们需要让数据跨多台移动设备上使用时,跨域资源的共享会是一个让人头疼的问题。在使用Ajax抓取另一个
域的资源,就可以会出现禁止请求的情况。
4.CSRF(跨站请求伪造):用户在访问网站时,他们很容易受到跨站请求伪造的攻击,并且能够被利用其访问其他的网站。
在这些问题中,可扩展行是最突出的。因此我们有必要去寻求一种更有行之有效的方法。
而token却能解决在服务端存储信息时的许多问题:
1.用户登录
和往常一样,一个表单,输入用户名、密码然后登录
<form action="servlet/Addcookies" method="post">
<label>账 号:</label><input type="text" name="username" /><br>
<label>密 码:</label><input type="password" name="password" /><br>
<button type="submit">登录</button>
</form>
可以看到,这个表单提交到一个servlet
2.servlet
下面看这个servlet
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String username = request.getParameter("username");
String Token = null;
try {
Token = JwtToken.creatToken(username);
} catch (Exception e) {
e.printStackTrace();
}
Cookie cookie = new Cookie("token", Token);
cookie.setPath("/"); // 设置路径使得cookie共享
cookie.setMaxAge();// 设置cookie有效期
response.addCookie(cookie);// 向客户端添加cookie
response.sendRedirect("../index2.jsp");// 请求转发
}
根据表单发来的请求,获取username参数值;
根据username参数值生成Token(具体方法后面讲);
新建一个cookie,key值为token,value值为之前生成的Token;
页面跳转到index2.jsp。
3.index2.jsp
页面没什么,直接看js
//定义一个function,根据name获取该cookie的value值
function getCookie(name){
//获取cookies并分割成数组形式
var strcookie = document.cookie;
var arrcookie = strcookie.split("; ");
//遍历所有cookie,并根据参数返回对应cookie的vaule
for ( var i = ; i < arrcookie.length; i++) {
var arr = arrcookie[i].split("=");
if (arr[] == name){
return encodeURIComponent(arr[]);
}
}
return "找不到指定cookie或cookie过期了";
} var token=getCookie("token");
document.getElementById("go").innerHTML=token;
这样,就将存在cookie里面的token拿到了,之后需要验证用户权限的话,就将这个token作为参数放到请求中;
服务端接收到这个携带token的请求,会对token解析,如果解析成功,就表示权限认证通过。
4.Token的生成与解析
直接看这个工具类
package com.eco.util; import java.util.HashMap;
import java.util.Map; import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT; public class JwtToken {
/* 生成token加密所需的公钥,位于服务端 */
public static String SECRET = "eco"; /*
* 根据用户登录信息(用户名、密码)生成token
*
* @pram name 用户请求提供的某个参数
*/ public static String creatToken(String name) throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
map.put("alg", "HS256");
map.put("typ", "JWT");
String token = JWT.create().withHeader(map).withClaim("name", name)
.sign(Algorithm.HMAC384(SECRET));
return token;
} /*
* 解析用户请求提供的token字符串,返回map
*
* @pram token 用户请求提供的token
*/ public static Map<String, Claim> verifyToken(String token) throws Exception {
JWTVerifier verifier = JWT.require(Algorithm.HMAC384(SECRET)).build();
DecodedJWT jwt = null;
jwt = verifier.verify(token);
return jwt.getClaims();
}
}
JWT实现用户权限认证的更多相关文章
- 基于SpringSecurity和JWT的用户访问认证和授权
发布时间:2018-12-03 技术:springsecurity+jwt+java+jpa+mysql+mysql workBench 概述 基于SpringSecurity和JWT的用户访 ...
- MongoDB用户权限认证
关于用户的认证及权限 用户是跟着库创建的,在哪个库创建的什么权限的什么用户,只对此库有相应权限(除超级管理员以外). 官网文档:https://docs.mongodb.com/master/refe ...
- SpringBoot系列 - 集成JWT实现接口权限认证
会飞的污熊 2018-01-22 16173 阅读 spring jwt springboot RESTful API认证方式 一般来讲,对于RESTful API都会有认证(Authenticati ...
- SpringBoot集成JWT 实现接口权限认证
JWT介绍 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的, 特别适用于分布式站点 ...
- spring-security用户权限认证框架
大家知道在spring中有一个基于acegi开发的spring-security的权限管理模块,它是一个轻量级框架. SpringSecurity能以声明的方式来保护Web应用程序的URL访问,只需简 ...
- 基于jwt的用户登录认证
最近在app的开发过程中,做了一个基于token的用户登录认证,使用vue+node+mongoDB进行的开发,前来总结一下. token认证流程: 1:用户输入用户名和密码,进行登录操作,发送登录信 ...
- 【laravel54】关于用户权限认证RBAC和无限极分类
1.权限认证方面: https://packagist.org/packages/spatie/laravel-permission 用户认证 HTTP本身是无状态,通常在系统交互的过程中,使用账号或 ...
- 绑定用户id,用户权限认证
上面这个就是为了把user_id与文章关联起来 文章需要跟用户关联,所以要去文章模型中加以关联 这样就可以直接在模板中进行关联处理 权限认证 首先要创建policy php artisan make: ...
- springboot+shrio简易登录登出和用户权限认证。
源码:https://github.com/huangshengz/myJavaDemo本例子参考:https://www.cnblogs.com/HowieYuan/p/9259638.html 本 ...
随机推荐
- Java Web 高性能开发,第 3 部分: 网站优化实战
这个系列的前两篇,介绍了前端的优化技术,这些技术秉承了前人至高无上的智慧,我只是负责吸收和传播.然而,这些技术一般也都是某某大型网站的技术经验,我们大部分人或许只能接触到相对小规模的网站,小规模的网站 ...
- Linux0.11中对文本文件进行修改的策略
现在,假设 hello.txt 是硬盘上已有的一个文件,而且内容为 "hello, world" ,在文件的当前指针设置完毕后,我们来介绍 sys_read , sys_write ...
- 1.Linux下libevent和memcached安装
1 下载libevent-2.0.22-stable.tar.gz,下载地址是:http://libevent.org/ 2 下载memcached,下载地址是:http://memcached ...
- 苹果IOS与谷歌 android系统的UI设计原则
一.苹果为IOS的界面设计提出了六大原则: 1.整体美学 整体美学指的是一个应用的表现和行为与它的功能完美集成,传达连贯的信息. 人们关心一个应用是否提供它承诺的功能,但他们也被应用的外观和行为强烈影 ...
- Erlang cowboy 入门参考之现代Web的发展历史
Erlang cowboy 入门参考之现代Web发展史 原文: http://ninenines.eu/docs/en/cowboy/1.0/guide/modern_web/ 让我回顾一下web技术 ...
- 可靠联机的 TCP 协议
可靠联机的 TCP 协议 在前面的 OSI 七层协议当中,在网络层的 IP 之上则是传送层,而传送层的数据打包成什么? 最常见的就是 TCP 封包了.这个 TCP 封包数据必须要能够放到 IP 的数据 ...
- PS 滤镜——素描算法(二)
利用另外一种算法完成素描特效的生成. %%% Sketch clc; clear all; Image=imread('4.jpg'); Image=double(Image); [row,col,l ...
- HBase运维经验
http://www.qconbeijing.com/download/Nicolas.pdf 重点看了下facebook做了哪些改进以及他们的运维经验,比较重要的有以下几点: 改进: 1 加强了行级 ...
- leetCode之旅(12)-反转二叉树
背景描述 Homebrew 是 OS X 平台上的包管理工具.用其官网的话说就是: the missing package manager for OS X | OS X 平台遗失的包管理器. 相信在 ...
- LeetCode - 二叉树的最大深度
自己解法,欢迎拍砖 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例:给定二叉树 [3,9,20,null,nu ...