分布式系统认证解决方案SpringSecurityOAuth2.0(一)认证授权

文章

分布式系统认证解决方案SpringSecurityOAuth2.0(一)认证授权
分布式系统认证解决方案SpringSecurityOAuth2.0(二)分布式系统认证流程分析与实现
分布式系统认证解决方案SpringSecurityOAuth2.0(三)资源服务器使用Redis令牌、JWT令牌认证及RSA非对称加密算法
分布式系统认证解决方案SpringSecurityOAuth2.0(四)整合网关认证授权

一、简介

SpringSecurity的主要核心功能为 认证授权,所有的权限架构也是基于这两个核心功能去实现的。
用户认证 一般要求用户提供用户名和密码。系统通过校验用户名密码来完成认证过程。
用户授权 指的是验证某个用户是否有权限执行某个操作。

二、认证

2.1 认证流程

在这里插入图片描述

2.2 代码实现

表结构

首先我们需要建表:用户表角色表用户角色关联表。一个用户可以对应多个角色,通过中间表关联。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

建表sql已上传仓库。

配置类 WebSecurityConfigurerAdapter

自定义SpringSecurity配置类需要继承WebSecurityConfigurerAdapter
在这里插入图片描述

在这里插入图片描述
配置拦截机制:

在这里插入图片描述
在控制层创建对应请求接口:
在这里插入图片描述

放行静态资源:
在这里插入图片描述

认证逻辑 UserDetailsService

我们需要自定义UserDetailServiceImpl实现的是实现UserDetailsService这个接口,实现loadUserByUsername方法,在方法里是我们重写的逻辑:

在这里插入图片描述
通过用户名查询用户表,没有说明用户不存在返回null;如果用户存在则查询中间表该用户对应的角色ID,在通过角色ID查询角色表拥有的角色信息,返回一个org.springframework.security.core.userdetails.User对象,是UserDetails的子类。包含用户名、密码和角色集:
在这里插入图片描述

在成功读取到UserDetails信息后,进行认证:
AbstractUserDetailsAuthenticationProvider类中可以看到认证逻辑:
在这里插入图片描述
其他的校验内容有兴趣可以自己看源码,这里只看下密码的校验:
在这里插入图片描述
我们可以看到认证校验分为 前校验、附加校验和后校验,如果任何一个校验出错,就会抛出相应的异常。
所有校验都通过后,调用 createSuccessAuthentication() 返回认证信息。

配置

2.3 认证测试

匿名访问

访问/anno请求是不需要认证的,所以可以请求成功:
在这里插入图片描述

但是如果要访问其他请求/r/r1/r/r2 则会自动跳转登录页面,登录认证后才能请求:
在这里插入图片描述

使用 zs 登录

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

然后访问/r/r3zs具有ADMIN 的角色,所以可以访问成功:
在这里插入图片描述

访问/r/r4zs没有USER的角色,访问失败:
在这里插入图片描述

使用 ls 登录

在这里插入图片描述
在这里插入图片描述
ls只有一个USER的角色。

可以访问/r/4:
在这里插入图片描述
但是ls没有ADMIN的角色,所以访问/r/r3失败:
在这里插入图片描述

三、授权

3.1 授权流程

在这里插入图片描述

3.2 代码实现

表结构

需要新建权限表角色权限关联表
角色与权限也是多对多的关系。
在这里插入图片描述
在这里插入图片描述

授权逻辑 PermissionEvaluator

我们需要自定义类PermissionEvaluatorImpl实现PermissionEvaluator接口,重写hasPermission这个方法:
在这里插入图片描述

在这里插入图片描述
即 根据登录时的认证信息,获得角色信息,根据角色权限关联表查询权限信息,与目标权限对比,如果具有目标权限,则返回true,否则返回false。

@EnableGlobalMethodSecurity开启注解校验

在这里插入图片描述

@PreAuthorize(“hasPermission(’/r/r1’,‘p1’)”)

使用 @PreAuthorize("hasPermission('/r/r1','p1')") 权限校验。
或者在配置类中配置:

http.authorizeRequests()
	...
   .antMatchers("/r/r1").hasAuthority("p1")//访问/r/r1需要p1的权限
   .antMatchers("/r/r2").hasAuthority("p2")//访问/r/r2需要p2的权限
   ...

3.3 授权测试

使用 zs 登录

在这里插入图片描述
然后访问/r/r1zs具有p1的权限,访问成功:
在这里插入图片描述
在这里插入图片描述

访问/r/r2,因为zs没有p2的权限,所以访问失败:
在这里插入图片描述
在这里插入图片描述

3.4 无权限处理类

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

源码

代码已上传码云
https://gitee.com/L1692312138/spring-cloud-alibaba
在这里插入图片描述
在这里插入图片描述

文章

学习SpringBoot使用SpringSecurity(一)_表单登录、角色认证

SpringBoot使用SpringSecurity(二)_使用注解以及更细粒度权限控制

SpringBoot使用SpringSecurity(三)_登录及退出管理

SpringSecurity加密解密以及使用JWT鉴权

SpringSecurityOauth2授权模式与使用RSA非对称加密方式生成公钥私钥

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liu_Shihao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值