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

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

前言:

小面的同事有一天来问小面,'小面啊,我最近看了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去实现这些功能。

相关文章
|
5月前
sa-token实现网关调用认证服务统一鉴权
sa-token实现网关调用认证服务统一鉴权
319 0
shiro登录认证后不执行授权doGetAuthorizationInfo的解决
shiro登录认证后不执行授权doGetAuthorizationInfo的解决
shiro登录认证后不执行授权doGetAuthorizationInfo的解决
|
5月前
|
安全 API C#
C 邮箱API发送邮件有什么步骤权限?
使用C#发送邮件涉及选择邮箱服务如Gmail、Outlook,创建API密钥,导入对应C#库,配置参数,实现发送功能,设置权限控制及错误处理。AokSend提供高触达发信服务,支持SMTP/API接口。
|
5月前
|
安全 JavaScript 前端开发
若依实现单点登录(解析请求链接中的参数做鉴权认证)
若依实现单点登录(解析请求链接中的参数做鉴权认证)
|
5月前
|
SQL 数据安全/隐私保护
带token的多用户登录(注册直接粗暴解决)
带token的多用户登录(注册直接粗暴解决)
带token的多用户登录(注册直接粗暴解决)
|
5月前
|
JSON 安全 Java
uniapp手机号授权登录-现在只能通过手机号授权登录,后台来获取用户信息了效果demo(整理)
uniapp手机号授权登录-现在只能通过手机号授权登录,后台来获取用户信息了效果demo(整理)
|
NoSQL Redis
使用黑名单完成,Jwt退出登录操作
使用黑名单完成,Jwt退出登录操作
746 0
|
Nacos
nacis鉴权
nacis鉴权
88 0
|
SQL 安全 Java
自定义OAuth2短信登录GrantType
`Spring`提供的原生的`OAuth2`依赖内置了几种比较常用的授权方式:`password`、`authorization-code`、`client_credentials`、`refresh_token`、`implicit`等,虽然可以满足我们日常的需求,不过针对一些特殊的需求还是捉襟见肘,有点无奈,比如:`微信登录`、`短信登录`...,针对这一点`ApiBoot`通过修改`Spring OAuth2`依赖的源码,可以根据业务进行自定义添加`grantType`。