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

2023-03-07 09:30:22 浏览数 (3)

前言:

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

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

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

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

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

小面同事:......

正文:

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

登录相关:

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

代码语言:javascript复制
  //我们写一个简单登录的接口
  //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提供了一个接口,我们去实现这个接口就可以去获取 用户的权限。我们做一个简单实现给大家看一下。

代码语言:javascript复制
@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去实现这些功能。

api

0 人点赞