Ruoyi框架学习笔记--Spring Security

发布于:2022-12-27 ⋅ 阅读:(1187) ⋅ 点赞:(0)

Spring Security介绍:

Spring Security安全控制

1、介绍
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。

2、功能
Authentication 认证,就是用户登录
Authorization 授权,判断用户拥有什么权限,可以访问什么资源
安全防护,跨站脚本攻击,session攻击等
非常容易结合Spring进行使用

3、Spring SecurityShiro的区别

相同点

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的对应方法判断接口调用者的权限。

  1. 数据权限示例。
// 符合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')")
  1. 角色权限示例。
// 属于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;
}


网站公告

今日签到

点亮在社区的每一天
去签到