权限管理-整合 SpringSecurity 代码过程 | 学习笔记

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 快速学习 权限管理-整合 SpringSecurity 代码过程

开发者学堂课程【微服务+全栈在线教育实战项目演练(SpringCloud Alibaba+SpringBoot)权限管理-整合 SpringSecurity 代码过程】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/667/detail/11536


权限管理-整合 SpringSecurity 代码过程


内容介绍:

一、权限管理-整合 SpringSecurity 代码过程

二、代码执行过程图


一、权限管理-整合 SpringSecurity 代码过程

将前端后端整合完成后,将项目启动起来,先启用前端项目,

e:' \work\vs 1010\vue-admin-1010>npm run dev 启动过程可能会报错,再根据报错修改,如果没有错再启动后端接口,查看效果。

为了效果更加明显,将 acl_user 跟 acl_role 中的内容都删掉,在 as_user 中有个用户叫做 admin,admin 意思是管理员,在后台处理中会有一个超级管理员的角色,这个管理员角色能够有很多操作权限,所以一般可以用 rot 或者admin,在我们这个项目中是应用 admin 作为超级管理员,不需要授权,可以访问所有权限,针对他可以做不同的操作。

/** .

*判断用户是否系统管理员

* Cbaram userId

* @return

private boolean isSysAdmin (String userId) {

User user= userService. getById(userId);

if(null != user &&“admin' . equals (user. getUsername()) {

return true;

return false;

@Override

public List<JSONObject> selectPermi ssionByUserId(String userId) {

List<Permission〉selectPermissionList = null;

if(this. isSysAdmin(userId))

//如果是超级管理员,获取所有菜单

selectPermissionList = baseMapper. selectList( wrapper: null);

else

selectPermissionList = baseMapper. selectPerhissionByUserId(userId)

List<Permission〉permissionList = PermissionHelper. bulid(selectPermissionList);

List<JSONObject> result = MemuHelper. bulid(permi ssionList) ;

return result;

如果是管理员就要查询所有,如果不是管理员就要根据当前用户查看权限,所以先用 admin 登录,然后登录之后再加用户,权限,用加完之后的内容再登录。

Your application is running here :http://localhost:9528启用之后。

2、启动接口,

启动 nacos,

image.png

有个问题是当中有乱码,原因是当前 nacos 是放在了一个中文目录下,一般来说,这种软件放的位置都不需要有中文,有中文也没有错,但是会出现乱码,原因是默认软件都不放置在带中名字中,以避免很多问题。

启动接口,先启用 Apigatewayapplication,

再启用 servicesaclapplication,然后网关要通过 nacos 找到里面配置的各种服务,在这个过程中不需要在 crtl 中加跨域注解,网关启动后,再将 acl  启动,

@SpringBootApplicatior

@EnableDi scoveryClient

@ComponentScan(" com atguigu' )

)@MapperScan(" com. atgui gu. aclservice. mapper' )

public class ServiceAclApplication {

public static void main(String[] args){SpringApplication.run(ServiceAclApplication.class,注意 apl com atguigucom. atgui gu. aclservice. Mapper注解不能少

api 网关中 acl 规则也都做了配置

#设置路由 id

spring. cloud. gateway. routes[0]. id= service racl

#设置路由的 uri Ib://nacos 注 册服务名称

spring. cloud. gateway. routes[0]. uri=lb://service acl

#设置路由断言,代理 servicerId auth-service auth/路径

spring. cloud. gateway. routes[0]. predicates= Path=/*/ac1/**

acl 中 controller 规则, @RequestMapping ("/admin/ac+/ index ),所以在里面添加 path=/*/acl/**

来到项目中测试一个登录查看如何登录

用一个超级管理员 admin 进行登录,密码是61,但是用来 acl 密码加密,点击登录,登录页面如下图所示。

image.png

证明 security 的整合过程生效了,如果不生效会报各种错误,登陆失败。

1、接下来查看 security 中的众多类的执行过程,用 debugger 方式演示,先关闭 acl,通过 debugger 断点调试看看他的运行过程,流程复制代码就可以但是过程需要知道如何运行。

2、加断点,第一个断点在 tokenloginfilter 中,

第一种方法:

在 attemptAuthenticat ion 这个方法里加断点,这个方法表示可以得到输入的用户名和密码。

第二种方法,在登录过程中会查询数据库,在登录成功的时候就会调用 userdetails 中的方法,在其中也加入一个断点,

第三种方法,在认证和授权过滤服务器中加入断点。

开始测试,第一次测试时间可能比较长,多启动几次就会成功。

用户名:admin,密码:6个1 点击登录,

发现首先进入 tokenloginfilter 认证过滤服务器,在里面的做法就是得到当前登录的用户名和密码,点击 step over/f8往下执行,观察 user,user{User@9791}"User(username=ardmin,password=111111nickName=null, salt= nll, token=nul)"

之后做 return,得到 userdetails,往下执行,查询用户和一步步权限,查询完成后得到 securityuser 中,

返回之后得到 successfulauthentication,

ResponseUtil. out(res, R. ok(). data(" token' ,token)):

在里面根据用户名生成 token 的字符串,然后将用户名称对应的权限值放到 redis 中,最终再返回,返回进行认证,查看是否有权限进行操作,操作过程有个特点,redios 服务器必须是运行状态,因为已经在 redis 中放了数据,

查看数据是否存在

[rooteonline bin]# . /redis-cli

127.0.0.1:6379> keys

1)”test4"

2) "admin"  

3) "test“

127.0.0.1:6379>1

发现多了个数据,2) "admin"  

127.0.0.1:6379>get admin

可以查询用户的值就是用户的所有权限,redis所具有的权限在里面做了存储,接下来的操作就是 springsecurity 进行操作,他就在 redis 中取值,再复制权限,就可以进行登录

上述超时,重新刷新进行登录,登陆成功后查询,查询成功后,进入授权中,然后取到 token 的值,然后得到用户的值,查看用户是否有权限进行登录,通过这个操作,登录就可以做到。


二、代码执行过程图

第一步先输入用户名跟密码,点击登录,进入到 springsecurity 认证过滤器,会首先进入 Authenticationnattempt 方法,进入之后会获取用户名和密码,获取之后会调取查询的类,在类中根据用户名查询用户信息和用户具有的权限,然后通过 security 返回,认证成功之后,就会执行认证过滤器中的成功的方法,在这个方法中得到用户信息,根据用户名得到信息得到 token 值,把用户名和权限信息放到 redis 中,最终返回生成 token,认证成功后会进行授权,会进入到授权过滤器中,从 header 中获取 token 信息,根据 token 信息获取用户名称,根据用户名称从 redis 查询数据,最后给用户授权。

第一次启用可能是没有编译,需要将项目编译,将内容都删除,然后重新编译再启动,编译过程就是点击 build,找到rebulid project,之后再将 api 网关重启就可以了。

相关文章
|
存储 Java 数据库
若依框架----源码分析(@Log)
若依框架----源码分析(@Log)
2804 1
|
消息中间件
RabbitMQ-如何保证消息不丢失
在RabbitMQ中,可以通过以下几种方式来保证消息不丢失:
703 0
|
数据可视化 Java uml
IDEA这个功能真强大!一键把整个项目代码绘制成UML类图...
IDEA这个功能真强大!一键把整个项目代码绘制成UML类图...
5404 0
IDEA这个功能真强大!一键把整个项目代码绘制成UML类图...
|
SQL Java 测试技术
在Spring boot中 使用JWT和过滤器实现登录认证
在Spring boot中 使用JWT和过滤器实现登录认证
685 0
|
3月前
|
Java 数据格式 微服务
SpringBoot使用汇总
SpringBoot使用汇总
SpringBoot使用汇总
|
3月前
|
敏捷开发 存储 数据可视化
前后端联调安排工具选型全景分析:提升开发效率的最佳拍档
前后端联调常面临进度难跟踪、反馈滞后、协作低效等问题,影响开发效率。本文分析了联调管理的挑战,并推荐如板栗看板、禅道、飞书等工具,帮助团队提升协作效率,实现高效有序的联调流程。
|
3月前
|
SQL 前端开发 Java
Spring的三层架构
Spring MVC 三层架构(表现层、业务层、数据访问层)通过职责分离提升代码可维护性与扩展性。表现层(Controller)接收请求并返回响应;业务层(Service)处理核心逻辑与事务;数据访问层(Mapper)负责数据库操作与数据映射,共同实现高效、清晰的系统开发。
279 0
|
8月前
|
存储 数据可视化 搜索推荐
「从0到1搭建知识库:设计团队的效率革命」
在快节奏的设计行业中,团队协作的效率和质量至关重要。本文探讨了如何通过搭建高效的设计团队知识库解决信息分散、规范不统一等问题,提升团队协同效率。内容涵盖知识库的核心价值、常见痛点、搭建方法、运营策略及未来趋势,帮助团队实现从混乱到高效的转变。知识库不仅能统一设计规范、沉淀最佳实践,还能提高新人上手速度。文章还介绍了内容框架设计、流程化管理、工具赋能等黄金方法论,并展望了智能化与场景化的未来趋势。
418 10
|
缓存 JavaScript
【Node】node.js安装与配置(详细步骤)
【Node】node.js安装与配置(详细步骤)
4853 2