认证
会话
用户认证通过后,为了避免用户的每次操作都进行认证可将用户的信息保证在会话中,会话就是系统为了解决认证之后,在进行常规操作是防止再次认证。常见方式有session ,token
session
用户认证成功后,在服务端生成用户相关的数据保存在session中,发送给客户端的session_id存放到cookie中,这样用户客户端请求时带上session_id就可以验证服务端是否存在session数据,已完成用户的合法校验,
token
用户认证成功后,服务端生成token,客户端可以放到cookie或者localStorage等存储中,每次请求带上token
两者区别:session只能放到cookie中,并且服务端要存储tsession,token可以存到客户端自定义的地方,并且不要求服务端进行存储,通过算法校验
授权
通过指定角色分配权限
RBAC
如何实现授权,业界通常基于RBAC完成授权
基于角色的访问控制
比如总经理级角色可以进行查询公司
基于资源的访问控制
比如用户必须具有查询工资的权限才能查询员工工资信息
优点:系统设计是定义好工资权限标识,即使查询工资所需要的角色变化为总经理和部门经理也不需要修改授权代码,系统可扩展性强
入门案例
所用依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
SpringSecurity基本原理
过滤器加载
本质是一个过滤链
项目已启动加载过滤器
FilterSecurityInterceptor 方法级别的过滤器
ExceptionTranslationFilter 异常过滤器,用于处理认证授权过程中抛出的异常
UsernamePasswordAuthenticationFilter 用户密码过滤器
如何加载过滤器?
DelegatingFilterProxy
重要接口
UserDetailService
当什么也没配置的时候,security 自动生成账户密码, 而实际项目中账户和密码都是从数据库中查询出来的。所以我们要通过自定义逻辑控制认证逻辑。
如果需要自定义逻辑时,需要两步:
- 继承UsernamePasswordAuthenticationFilter,重写认证,认证成功,认证失败方法。
- 实现UserDetailsService接口,编写查询数据库过程,返回User对象,这个User对象是安全框架提供的对象
PasswordEncoder
PasswordEncoder 对密码进行加密
BcryptPasswordEncoder 是安全框架官方推荐的密码解析器
设置登录的用户名和密码
1.配置文件设置
2. 配置类设置
3.自定义编写实现类
实现实现UserDetailsService接口