前言:
小面的同事有一天来问小面,'小面啊,我最近看了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了。
- 获取当前用户的所有权限: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去实现这些功能。