目录
文章
分布式系统认证解决方案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/r3
,zs
具有ADMIN
的角色,所以可以访问成功:
访问/r/r4
,zs
没有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/r1
,zs
具有p1
的权限,访问成功:
访问/r/r2
,因为zs
没有p2
的权限,所以访问失败:
3.4 无权限处理类
源码
代码已上传码云
https://gitee.com/L1692312138/spring-cloud-alibaba
文章
学习SpringBoot使用SpringSecurity(一)_表单登录、角色认证
SpringBoot使用SpringSecurity(二)_使用注解以及更细粒度权限控制