一行代码教你实现登录鉴权

简介: 一行代码教你实现登录鉴权

前言:

小面的同事有一天来问小面,'小面啊,我最近看了springSecurity和shiro,感觉好难理解啊!'

小面:难理解吗?哈哈,那说明你功力不足啊!

小面同事:那该咋搞啊?我得向你取取经!小面:像这种权限认证框架,其实都是大同小异的,我给你介绍一个轻量级的框架吧!sa-token!

小面同事:这是啥框架啊?没听说过

小面:这是一款新的权限认证框架,用它,我们可以更优雅的鉴权~

小面同事:......


正文:

首先给大家介绍一下sa-token的登录模块和权限模块。

登录相关:

sa-token可以实现单、多端登录,互斥登录,固定时间免登录的相关功能。举例:我们来用代码简单实现一个登录功能

//我们写一个简单登录的接口
  //controller层
  @GetMapping("/login")
  public R login(String userName, String password){
      SaTokenInfo login = systemService.login(userName, password);
      return R.ok(login);
  }
  //serviceImpl层
  @Override
  public SaTokenInfo login(String userName, String password) {
      StpUtil.login(user.getId());
      SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
      return tokenInfo;
  }

这样就是一个简单的登录接口,我们把用户ID作为参数,然后用sa-token的方法,StpUtil.login(user.getId());

就实现了一个登录功能,这个login的方法返回的类包含了一些属性给大家说明一下:token名称,token值,此token是否登录, 登录id,token剩余有效期,登录设备类型等等.... 看到这些返回的参数,大家就知道简简单单一个login方法,其实底层是做了很多的事情的(比如检查账号是否登录,生成token和session,将token注入上下文等等)

除了登录,还有其他一些方法提供给了大家,包括:1.是否登录:StpUtil.isLogin(); 2.获取登录信息:StpUtil.getTokenInfo(); 3.登出:StpUtil.logout();

权限相关:

权限模块,简单理解就是有权限放行,无权限禁止通过。所以我们在进行权限判断的时候要获取到两个信息,第一个是 该用户拥有什么权限。第二个是该操作需要什么权限标识。

该用户拥有的权限,这肯定是由我们自己去实现的,所以sa-token提供了一个接口,我们去实现这个接口就可以去获取 用户的权限。我们做一个简单实现给大家看一下。

@Component
public class StpInterfaceImpl implements StpInterface {
  @Autowired
  private MenuDao menuDao;
  @Autowired
  private RoleDao roleDao;
  @Autowired
  private UserDao userDao;
  @Autowired
  private UserRoleDao userRoleDao;
  @Autowired
  private RoleMenuDao roleMenuDao;
  @Override
  public List<String> getPermissionList(Object loginId, String loginType) {
      UserRole userRole = userRoleDao.selectOne(new QueryWrapper<UserRole>().eq("user_id", loginId));
      Role role = roleDao.selectOne(new QueryWrapper<Role>().eq("id", userRole.getRoleId()));
      List<RoleMenu> roleMenu = roleMenuDao.selectList(new QueryWrapper<RoleMenu>().eq("role_id", role.getId()));
      List<Integer> collect = roleMenu.stream().map(RoleMenu::getMenuId).collect(Collectors.toList());
      List<Menu> menuList = menuDao.selectBatchIds(collect);
      List<String> list = menuList.stream().map(Menu::getMenu).collect(Collectors.toList());
      return list;
  }
  @Override
  public List<String> getRoleList(Object loginId, String loginType) {
      UserRole userRole = userRoleDao.selectOne(new QueryWrapper<UserRole>().eq("user_id", loginId));
      Role role = roleDao.selectOne(new QueryWrapper<Role>().eq("id", userRole.getRoleId()));
      ArrayList<String> list = new ArrayList<>();
      list.add(role.getRole());
      return list;
  }
}

我们可以看到,getPermissionList就是获取用户的权限集合,getRoleList就是获取用户的角色。我们权限相关一共有五个表:User ,Role ,Menu ,UserRole,RoleMenu 。通过这五个表我们就可以建立一套简单的权限系统。

实现了这个类,我们就可以去使用以下API了。

  1. 获取当前用户的所有权限:StpUtil.getPermissionList();

2.判断当前用户是否拥有该权限:StpUtil.hasPermission("user.add");

3.判断当前用户是否拥有多个权限(需要全部都有才能够算拥有):StpUtil.checkPermissionAnd("user.add", "user.delete", "user.get");

4.判断当前用户是否拥有多个权限(只需要有一个就算通过):StpUtil.checkPermissionOr("user.add", "user.delete", "user.get");

5.获取当前用户的角色:StpUtil.getRoleList();

6.判断当前用户是否是指定的角色:StpUtil.hasRole("super-admin"); 等等....还有很多可以使用的就不一一介绍了 这些API都回去从我们的实现类里 去获取权限和角色,大家在使用这块的时候可以去结合缓存做,要不然每一次 到要去查数据库,压力也会很大的。

总结:

这就是sa-token的登录模块和权限模块的内容~

我们可以很轻松的去调用API去实现这些功能。

相关文章
|
JavaScript API
Vuex状态管理最佳实践
使用Vuex进行状态管理时,有一些最佳实践可以帮助你保持代码清晰、可维护和高效。以下是一些详细的Vuex状态管理最佳实践
410 3
|
2月前
|
监控 算法 Java
深入理解JVM《垃圾收集(GC)机制与算法 - 宇宙的清洁工》
Java通过垃圾收集(GC)实现自动内存管理,避免手动释放内存导致的泄漏或崩溃。主流JVM采用可达性分析算法判断对象生死,结合分代收集理论,使用标记-清除、复制、标记-整理等算法回收内存。G1、ZGC等现代收集器进一步提升性能与停顿控制。
|
8月前
|
存储 Java 数据库
Spring Boot 注册登录系统:问题总结与优化实践
在Spring Boot开发中,注册登录模块常面临数据库设计、密码加密、权限配置及用户体验等问题。本文以便利店销售系统为例,详细解析四大类问题:数据库字段约束(如默认值缺失)、密码加密(明文存储风险)、Spring Security配置(路径权限不当)以及表单交互(数据丢失与提示不足)。通过优化数据库结构、引入BCrypt加密、完善安全配置和改进用户交互,提供了一套全面的解决方案,助力开发者构建更 robust 的系统。
303 0
|
7月前
|
监控 NoSQL Java
分布式锁—2.Redisson的可重入锁
本文主要介绍了Redisson可重入锁RedissonLock概述、可重入锁源码之创建RedissonClient实例、可重入锁源码之lua脚本加锁逻辑、可重入锁源码之WatchDog维持加锁逻辑、可重入锁源码之可重入加锁逻辑、可重入锁源码之锁的互斥阻塞逻辑、可重入锁源码之释放锁逻辑、可重入锁源码之获取锁超时与锁超时自动释放逻辑、可重入锁源码总结。
|
设计模式 Java Apache
Springboot项目优化日志logback-spring.xml详解
Commons Logging和Slf4j是日志门面(门面模式是软件工程中常用的一种软件设计模式,也被称为正面模式、外观模式。它为子系统中的一组接口提供一个统一的高层接 口,使 得子系统更容易使用)。log4j和Logback则是具体的日志实现方案。可以简单的理解为接口与接口的实现,调用这只需要关注接口而无需关注具体的实现,做到解耦
2740 0
Springboot项目优化日志logback-spring.xml详解
|
10月前
|
人工智能 安全 开发工具
Repomix:8.1K Star!轻松将整个代码库打包为AI友好格式的开源工具,使代码库更易于AI理解
Repomix 是一款强大的工具,能够将整个代码库打包成AI友好的单个文件,支持多种输出格式和安全检查。
975 9
|
IDE Cloud Native 小程序
IDEA 中 30 秒生成 Spring Cloud Alibaba 工程
近日,阿里巴巴发布了 Spring 的国内脚手架定制版 Aliyun Java Initializer,因为全中文界面和流畅速度,被广大开发者热传。Spring 脚手架为开发者提供了丰富的可选组件,并且可以选择多种打包方式,大大方便了开发人员的使用。
16916 0
IDEA 中 30 秒生成 Spring Cloud Alibaba 工程
|
开发工具 vr&ar 图形学
XR Interaction Toolkit教程⭐一、简介、安装和基本配置
XR Interaction Toolkit教程⭐一、简介、安装和基本配置
|
消息中间件 存储 NoSQL
rocketmq实现延迟队列思路探讨
本文介绍了两种实现RocketMQ延迟消息的方法。非任意时间延迟可通过在服务器端配置`messageDelayLevel`实现,但需重启服务。任意时间延迟则分为两种策略:一是结合原生逻辑和时间轮,利用RocketMQ的默认延迟等级组合支持任意延迟,但可能丢失1分钟内的数据;二是使用存储介质(如Redis)加时间轮,消息存储和定时发送结合,能处理数据不一致和丢失问题,但涉及更多组件。推荐项目[civism-rocket](https://github.com/civism/civism-rocket)作为参考。
877 1
|
缓存 Java 测试技术
Java性能优化(八)-多线程调优-线程池大小设置
Java性能优化(八)-多线程调优-线程池大小设置
444 0

热门文章

最新文章