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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容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 网关重启就可以了。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
7月前
|
前端开发 数据安全/隐私保护
若依框架---权限控制角色设计
若依框架---权限控制角色设计
1239 0
|
6月前
|
Java 数据安全/隐私保护 Spring
SpringSecurity6从入门到实战之默认用户的生成流程
该文档介绍了SpringSecurity6中默认用户的生成流程。在`SecurityAutoConfiguration`源码中,通过`SecurityProperties`配置类,系统默认创建了一个名为&quot;user&quot;的用户,其密码是一个随机生成的UUID。这个用户是在没有在`application.properties`中设置相关配置时自动创建的。
|
7月前
|
安全 Java 数据库
后端进阶之路——浅谈Spring Security用户、角色、权限和访问规则(三)
后端进阶之路——浅谈Spring Security用户、角色、权限和访问规则(三)
|
6月前
|
缓存 安全 Java
【权限管理系统】Spring security(三)---认证过程(原理解析,demo)
【权限管理系统】Spring security(三)---认证过程(原理解析,demo)
|
安全 Java 数据库
SpringSecurity-4-认证流程源码解析
SpringSecurity-4-认证流程源码解析
83 0
|
安全
springsecurity配置类以及授权逻辑的编写
springsecurity配置类以及授权逻辑的编写
106 0
|
安全 Java 数据库连接
四.SpringSecurity基础-自定义登录流程
SpringSecurity基础-自定义登录流程
|
7月前
|
SQL 前端开发 数据安全/隐私保护
若依框架---权限管理设计
若依框架---权限管理设计
561 0
|
存储 SQL 数据库
七.SpringSecurity基础-记住我功能实现
SpringSecurity基础-记住我功能实现
|
存储 SQL 数据库
SpringSecurity基础-记住我功能实现
Remember me(记住我)记住我,当用户发起登录勾选了记住我,在一定的时间内再次访问该网站会默认登录成功,即使浏览器退出重新打开也是如此,这个功能需要借助浏览器的cookie实现,具体流程如下
99 0