# Spring-Security-JWT-DEMO **Repository Path**: JakeRhino/spring-security-jwt-demo ## Basic Information - **Project Name**: Spring-Security-JWT-DEMO - **Description**: Spring-Security集合JWT 实现前后端分离完成权限验证功能案例,案例中,主要完成用户登录获取Token,通过Token访问Rest接口,没有权限或授权失败时返回JSON,前端根据状态码进行重新登录;案例中的用户名称: jake_j,密码:123。用户、角色、及菜单权限都是代码中指定的,未实现查询数据库相关数据。正常开发需要和现有系统数据库结合,这里只是整体认证、授权流程逻辑说明。 - **Primary Language**: Java - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 2 - **Created**: 2021-07-12 - **Last Updated**: 2023-09-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring-Security-JWT-DEMO #### 介绍 Spring-Security结合JWT 实现前后端分离完成权限验证功能案例,案例中,主要完成用户登录获取Token,通过Token访问Rest接口,没有权限或授权失败时返回JSON,前端根据状态码进行重新登录;案例中的用户名称: jake_j,密码:123。用户、角色、及菜单权限都是代码中指定的,未实现查询数据库相关数据。正常开发需要和现有系统数据库结合,这里只是简单说明整体用户认证、授权流程逻辑说明。 #### 软件架构 软件架构说明 Spring-Boot 2.3.0.RELEASE Spring-Security #### 安装教程 1. clone 当前项目到本地 2. Idea 导入项目 3. 直接运行 com.rhino.App.main() 方法即可 #### 使用说明 1. 当前项目主要用于,前后端项目分离时,用户登录,用户认证、授权等功能 2. 主要开发思想: 用户登录后,保存Token信息到前端,后续所有接口的请求在head中携带,Authorization:accessToken; 前端权限控制:用户登录后,前端需要调用接口获取当前用户角色及权限信息,前端需要维护一套逻辑,根据当前用户的角色及权限,页面控制某些菜单或按钮是否显示; 后端权限控制:在Controller上的Action方法上,添加注解`@PreAuthorize`或`@Secured`,控制哪些方法的访问需要哪些权限,具体使用案例查看:`com.rhino.controller.TestController`即可;由于前端都是JS,可能直接调用JS或拼接URL访问API,因此后端必须也有权限控制; 菜单权限控制:正常用户登录后,前端调用API,获取当前用户及角色下,可访问的菜单,前端展示相关菜单;但是菜单URL可能被别人直接拼接访问,因此后端也需要有动态资源访问的控制;实现代码主要在包`com.rhino.security.datasourceaccess` 下; Token刷新:单独提供接口,供前端刷新token,前端可定时刷新Token;前端同时也统一控制Rest API访问控制,响应消息状态码:40000时,说明无权限或Token超时,应该让用户重新登录。 用户角色来源数据库时,如何修改? 需修改`com.rhino.security.service.impl.JwtUserDetailsServiceImpl-loadUserByUsername()`通过userLoginName 读取数据库用户信息及角色信息到Spring Security。 菜单及资源授权来源数据库时,如何修改? 需修改`com.rhino.security.datasourceaccess.MyFilterInvocationSecurityMetadataSource-getAttributes()`,通过当前访问的URL,从数据库(缓存)中获取访问当前URL需要哪些角色。 以下是访问案例及截图: 用户登录: http://localhost:8088/authentication/login?password=123&username=jake_j ![输入图片说明](https://images.gitee.com/uploads/images/2021/0712/162915_8c8055a8_4930098.png "屏幕截图.png") 前端访问其他API接口:Head中携带Token:Authorization:accessToken http://localhost:8088/test/role ![输入图片说明](https://images.gitee.com/uploads/images/2021/0712/163021_0311bd98_4930098.png "屏幕截图.png") 前端可定时刷新Token: http://localhost:8088/token/refreshToken?refreshToken= ![输入图片说明](https://images.gitee.com/uploads/images/2021/0712/164219_f72ab60f_4930098.png "屏幕截图.png") #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)