再见Spring Security!推荐一款功能强大的权限认证框架,用起来够优雅!

在我们做SpringBoot项目的时候,认证授权是必不可少的功能!我们经常会选择Shiro、Spring Security这类权限认证框架来实现,但这些框架使用起来有点繁琐,而且功能也不够强大。最近发现一款功能强大的权限认证框架Sa-Token,它使用简单、API设计优雅,推荐给大家!

Sa-Token简介

Sa-Token是一款轻量级的Java权限认证框架,可以用来解决登录认证、权限认证、Session会话、单点登录、OAuth2.0、微服务网关鉴权等一系列权限相关问题。

框架集成简单、开箱即用、API设计优雅,通过Sa-Token,你将以一种极其简单的方式实现系统的权限认证部分,有时候往往只需一行代码就能实现功能。

Sa-Token功能很全,具体可以参考下图。

image.png

使用

在SpringBoot中使用Sa-Token是非常简单的,接下来我们使用它来实现最常用的认证授权功能,包括登录认证、角色认证和权限认证。

集成及配置

Sa-Token的集成和配置都非常简单,不愧为开箱即用。

  • 首先我们需要在项目的pom.xml中添加Sa-Token的相关依赖;
再见Spring Security!推荐一款功能强大的权限认证框架
  • 然后在application.yml中添加Sa-Token的相关配置,考虑到要支持前后端分离项目,我们关闭从cookie中读取token,改为从head中读取token。
再见Spring Security!推荐一款功能强大的权限认证框架

登录认证

在管理系统中,除了登录接口,基本都需要登录认证,在Sa-Token中使用路由拦截鉴权是最方便的,下面我们来实现下。

  • 实现登录认证非常简单,首先在UmsAdminController中添加一个登录接口;
再见Spring Security!推荐一款功能强大的权限认证框架
  • 然后在UmsAdminServiceImpl添加登录的具体逻辑,先验证密码,然后调用StpUtil.login(adminUser.getId())即可实现登录,调用API一行搞定;
再见Spring Security!推荐一款功能强大的权限认证框架
  • 我们再添加一个测试接口用于查询当前登录状态,返回true表示已经登录;
再见Spring Security!推荐一款功能强大的权限认证框架
  • 之后可以通过Swagger访问登录接口来获取Token了,使用账号为admin:123456,访问地址:http://localhost:8088/swagger-ui/
    image.png

    然后在Authorization请求头中添加获取到的token;
    image.png

    访问/admin/isLogin接口,data属性就会返回true了,表示你已经是登录状态了;
    image.png
  • 接下来我们需要把除登录接口以外的接口都添加登录认证,添加Sa-Token的Java配置类SaTokenConfig,注册一个路由拦截器SaRouteInterceptor,这里我们的IgnoreUrlsConfig配置会从配置文件中读取白名单配置;
再见Spring Security!推荐一款功能强大的权限认证框架
  • application.yml文件中的白名单配置如下,注意开放Swagger的访问路径和静态资源路径;
再见Spring Security!推荐一款功能强大的权限认证框架
  • 由于未登录状态下访问接口,Sa-Token会抛出NotLoginException异常,所以我们需要全局处理下;
image.png
  • 之后当我们在登录状态下访问接口时,可以获取到数据;


    image.png

    当我们未登录状态(不带token)时无法正常访问接口,返回code为401。


    image.png

角色认证

角色认证也就是我们定义好一套规则,比如ROLE-ADMIN角色可以访问/brand下的所有资源,而ROLE_USER角色只能访问/brand/listAll,接下来我们来实现下角色认证。

首先我们需要扩展Sa-Token的StpInterface接口,通过实现方法来返回用户的角色码和权限码;


再见Spring Security!推荐一款功能强大的权限认证框架
  • 然后在Sa-Token的拦截器中配置路由规则,ROLE_ADMIN角色可以访问所有路径,而ROLE_USER只能访问/brand/listAll路径;
再见Spring Security!推荐一款功能强大的权限认证框架
  • 当用户不是被允许的角色访问时,Sa-Token会抛出NotRoleException异常,我们可以全局处理下;
再见Spring Security!推荐一款功能强大的权限认证框架
  • 我们现在有两个用户,admin用户具有ROLE_ADMIN角色,macro用户具有ROLE_USER角色;


    image.png

    使用admin账号访问/brand/list接口可以正常访问;

image.png

使用macro账号访问/brand/list接口无法正常访问,返回code为403。


image.png

权限认证

当我们给角色分配好权限,然后给用户分配好角色后,用户就拥有了这些权限。我们可以为每个接口分配不同的权限,拥有该权限的用户就可以访问该接口。这就是权限认证,接下来我们来实现下它。

  • 我们可以在Sa-Token的拦截器中配置路由规则,admin用户可以访问所有路径,而macro用户只有读取的权限,没有写、改、删的权限;
再见Spring Security!推荐一款功能强大的权限认证框架
  • 当用户无权限访问时,Sa-Token会抛出NotPermissionException异常,我们可以全局处理下;
再见Spring Security!推荐一款功能强大的权限认证框架
  • 使用admin账号访问/brand/delete接口可以正常访问;


    image.png

    使用macro账号访问/brand/delete无法正常访问,返回code为403。


    image.png

总结

通过对Sa-Token的一波实践,我们可以发现它的API设计非常优雅,比起Shiro和Spring Security来说确实顺手多了。Sa-Token不仅提供了一系列强大的权限相关功能,还提供了很多标准的解决方案,比如Oauth2、分布式Session会话等,大家感兴趣的话可以研究下。

你可能感兴趣的:(再见Spring Security!推荐一款功能强大的权限认证框架,用起来够优雅!)