开发者学堂课程【微服务+全栈在线教育实战项目演练(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,
有个问题是当中有乱码,原因是当前 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 atguigu、com. 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 进行登录,密码是6个1,但是用来 acl 密码加密,点击登录,登录页面如下图所示。
证明 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 网关重启就可以了。