Spring Security介绍:
Spring Security安全控制
1、介绍Spring Security
是一个能够为基于Spring
的企业应用系统提供声明式的安全访问控制解决方案的安全框架。
2、功能Authentication
认证,就是用户登录Authorization
授权,判断用户拥有什么权限,可以访问什么资源
安全防护,跨站脚本攻击,session
攻击等
非常容易结合Spring
进行使用
3、Spring Security
与Shiro
的区别
相同点
1、认证功能
2、授权功能
3、加密功能
4、会话管理
5、缓存支持
6、rememberMe功能
....
不同点
优点:
1、Spring Security基于Spring开发,项目如果使用Spring作为基础,配合Spring Security做权限更加方便。而Shiro需要和Spring进行整合开发
2、Spring Security功能比Shiro更加丰富,例如安全防护方面
3、Spring Security社区资源相对比Shiro更加丰富
缺点:
1)Shiro的配置和使用比较简单,Spring Security上手复杂些
2)Shiro依赖性低,不需要依赖任何框架和容器,可以独立运行。Spring Security依赖Spring容器
Spring Security配置文件:
全部集中在ruoyi.framework.config.SecurityConfig.java文件内,主要包括了认证失败处理、退出处理、token认证处理、允许匿名处理、强散列哈希加密、身份认证、权限管理等等处理类。
Spring Security密码加密:
核心密码加密匹配就是用了两个方法:
1、String encode(CharSequence rawPassword)输入明文加密方法,输入同样的明文输出的加密后的字符串是不一样的。
2、Boolean matches(CharSequence rawPassword,String encodePassword)用输入的明文跟输出的加密后的字符串匹配,结果返回布尔类型,注意匹配密码只能用这个方法。
Spring Security退出配置:
本质上就是ruoyi.framework.security.handle.LogoutSuccessHandlerImpl对原本LogoutSuccessHandler的一个重写。主要包括了以下三个步骤:
1、收集退出的用户的个人信息
2、删除退出的用户的缓存记录
3、记录退出用户的日志
4、将退出的指令也传到前端,前后端使用相同的url来重定向退出后转向的页面。
5、前端执行完之后走一个刷新reload()
(注:Vscode里查文件名的快捷键:ctrl+p)
Spring Security登录配置:
主体在ruoyi.web.controller.system.SysLoginController.java里,其余具体实现部门主要是service部门。主要也就是包括三个部分:
1、登录验证(包括账号密码验证码)
2、菜单验证(包括这个人是什么部门,有什么什么菜单的使用权限)
3、角色权限验证(包括他是什么职位,在操作系统里又什么权限)
Spring Security权限详解:
这里主要是分为两种权限:
1、角色权限:主要针对的是是sys_role,角色信息表,也就是它是什么角色有什么权限,这里只分了管理员和普通用户,管理员有全部权限。
2、菜单权限:主要针对的是sys_menu ,菜单权限表,注明某个用户有什么权力操作哪些具体的功能模块。
以上两种权限设置使用sys_role_menu来链接他们之间的权限分配问题。
Spring Sercurity 权限注解使用:
权限注解
Spring Security
提供了Spring EL
表达式,允许我们在定义接口访问的方法上面添加注解,来控制访问权限。
#权限方法
@PreAuthorize
注解用于配置接口要求用户拥有某些权限才可访问,它拥有如下方法
方法 | 参数 | 描述 |
---|---|---|
hasPermi | String | 验证用户是否具备某权限 |
lacksPermi | String | 验证用户是否不具备某权限,与 hasPermi逻辑相反 |
hasAnyPermi | String | 验证用户是否具有以下任意一个权限 |
hasRole | String | 判断用户是否拥有某个角色 |
lacksRole | String | 验证用户是否不具备某角色,与 isRole逻辑相反 |
hasAnyRoles | String | 验证用户是否具有以下任意一个角色,多个逗号分隔 |
#使用示例
其中@ss
代表的是PermissionService ()服务,对每个接口拦截并调用PermissionService
的对应方法判断接口调用者的权限。
- 数据权限示例。
// 符合system:user:list权限要求
@PreAuthorize("@ss.hasPermi('system:user:list')")
// 不符合system:user:list权限要求
@PreAuthorize("@ss.lacksPermi('system:user:list')")
// 符合system:user:add或system:user:edit权限要求即可
@PreAuthorize("@ss.hasAnyPermi('system:user:add,system:user:edit')")
- 角色权限示例。
// 属于user角色
@PreAuthorize("@ss.hasRole('user')")
// 不属于user角色
@PreAuthorize("@ss.lacksRole('user')")
// 属于user或者admin之一
@PreAuthorize("@ss.hasAnyRoles('user,admin')")
权限提示
超级管理员拥有所有权限,不受权限约束。
#公开接口
如果有些接口是不需要验证权限可以公开访问的,这个时候就需要我们给接口放行。
使用注解方式,只需要在Controller
的类或方法上加入@Anonymous
该注解即可
// @PreAuthorize("@ss.xxxx('....')") 注释或删除掉原有的权限注解
@Anonymous
@GetMapping("/list")
public List<SysXxxx> list(SysXxxx xxxx)
{
return xxxxList;
}