42

基于 Spring Security 和 JWT 的权限系统设计

 5 years ago
source link: https://mp.weixin.qq.com/s/sMi1__Rw_s75YDaIdmTWKw?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

mqUjIjb.jpg!web

文章共 1209字,阅读大约需要 5分钟,文尾有计时器可自行对时!

写在前面

  • 关于 Spring Security

Web系统的认证和权限模块也算是一个系统的基础设施了,几乎任何的互联网服务都会涉及到这方面的要求。在Java EE领域,成熟的安全框架解决方案一般有 Apache Shiro、Spring Security等两种技术选型。Apache Shiro简单易用也算是一大优势,但其功能还是远不如 Spring Security强大。Spring Security可以为 Spring 应用提供声明式的安全访问控制,起通过提供一系列可以在 Spring应用上下文中可配置的Bean,并利用 Spring IoC和 AOP等功能特性来为应用系统提供声明式的安全访问控制功能,减少了诸多重复工作。

  • 关于JWT

JSON Web Token (JWT),是在网络应用间传递信息的一种基于 JSON的开放标准((RFC 7519),用于作为JSON对象在不同系统之间进行安全地信息传输。主要使用场景一般是用来在 身份提供者和服务提供者间传递被认证的用户身份信息。关于JWT的科普,可以看看阮一峰老师的《JSON Web Token 入门教程》。

本文则结合 Spring Security和 JWT两大利器来打造一个简易的权限系统。

另外本文实验代码置于文尾,需要自取!

本文实验环境如下:

  • Spring Boot版本:2.0.6.RELEASE

  • IDE:IntelliJ IDEA 2018.2.4

注:  本文首发于 作者 公众号  CodeSheep  ,可  长按  扫描  下面的  小心心  来订阅 ↓ ↓ ↓

ZRJvmqu.jpg!web

设计用户和角色

本文实验为了简化考虑,准备做如下设计:

  • 设计一个最简角色表 role ,包括   角色ID  角色名称

RrmMZ3Q.png!web

  • 设计一个最简用户表 user ,包括   用户ID  用户名  密码

7fMz2iB.png!web

  • 再设计一个用户和角色一对多的关联表 user_roles   一个用户可以拥有多个角色

    3Y73aiM.png!web

创建Spring Security和JWT加持的Web工程

  • pom.xml   中引入 Spring Security和 JWT所必需的依赖

  • 项目配置文件中加入数据库和 JPA等需要的配置

  • 创建用户、角色实体

用户实体 User:

此处所创建的 User类继承了 Spring Security的 UserDetails接口,从而成为了一个符合 Security安全的用户,即通过继承 UserDetails,即可实现 Security中相关的安全功能。

角色实体 Role:

  • 创建JWT工具类

主要用于对 JWT Token进行各项操作,比如生成Token、验证Token、刷新Token等

  • 创建Token过滤器,用于每次外部对接口请求时的Token处理

  • Service业务编写

主要包括用户登录和注册两个主要的业务

  • Spring Security配置类编写( 非常重要

这是一个高度综合的配置类,主要是通过重写 WebSecurityConfigurerAdapter   的部分   configure 配置,来实现用户自定义的部分。

  • 编写测试 Controller

登录和注册的 Controller:

再编写一个测试权限的 Controller:

这里给出两个测试接口用于测试权限相关问题,其中接口 /normal/test 需要用户具备普通角色(   ROLE_NORMAL )即可访问,而接口   /admin/test 则需要用户具备管理员角色(   ROLE_ADMIN )才可以访问。

接下来启动工程,实验测试看看效果

实验验证

  • 在文章开头我们即在用户表 user 中插入了一条用户名为   codesheep 的记录,并在用户-角色表   user_roles 中给用户   codesheep 分配了普通角色(   ROLE_NORMAL )和管理员角色(   ROLE_ADMIN

  • 接下来进行用户登录,并获得后台向用户颁发的JWT Token

qU3M3eQ.jpg!web

  • 接下来访问权限测试接口

不带 Token直接访问需要普通角色( ROLE_NORMAL )的接口   /normal/test 会直接提示访问不通:

F3iUjyy.jpg!web

而带 Token访问需要普通角色( ROLE_NORMAL )的接口   /normal/test 才会调用成功:

nYvMvuj.jpg!web

同理由于目前用户具备管理员角色,因此访问需要管理员角色( ROLE_ADMIN )的接口   /admin/test 也能成功:

r2Evuqy.jpg!web

接下里我们从用户-角色表里将用户 codesheep 的管理员权限删除掉,再访问接口   /admin/test ,会发现由于没有权限,访问被拒绝了:

InmuEjB.jpg!web

经过一系列的实验过程,也达到了我们的预期!

写在最后

本文涉及的东西还是蛮多的,最后我们也将本文的实验源码放在 Github上,需要的可以自取:

github.com/hansonwang99/Spring-Boot-In-Action/tree/master/springbt_security_jwt

由于能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流!

个人网站: www.codesheep.cn (程序羊)

我的更多系列原创文章在此:

●   程序羊的2018年终总(gen)结 (feng)

●   利用K8S技术栈打造个人私有云 系列连载文章

●   从一份配置清单详解Nginx服务器配置

●   Spring Boot Admin 2.0开箱体验

●   一文上手 Elasticsearch常用可视化管理工具

●   Docker容器可视化监控中心搭建

●   利用ELK搭建Docker容器化应用日志中心

●   RPC框架实践之:Google gRPC

●   一文详解 Linux系统常用监控工具

作者更多 务实、能看懂、可复现的 原创文章尽在公众号 CodeSheep ,欢迎订阅 :arrow_down::arrow_down::arrow_down:

Ifeqeq2.gif

你花了    ·   来阅读

点个  2uEBfuq.gif  再走吧~  

点阅读原文, 去作者官网codesheep.cn阅读


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK