Skip to content

鉴权框架封装模块

介绍

基于Sa-TokenjustAuth进行封装,未选择Spring Security原因是复杂度较高,且同时对在前后端分离环境下支持一般。未选择Shiro是因为Sa-Token已经足够成熟, API对中小项目来说更加直观和简单易用。注意:管理员用户拥有最高的权限,不受权限控制,默认拥有所有数据和接口的权限。

Sa-Token官网:https://sa-token.cc/

justAuth官网:https://justauth.wiki/

更详细的内容可以查看 身份识别与访问管理 下的具体模块,有更详细的说明。

功能

  • 提供账号密码登陆功能
  • 提供第三方登录扩展
  • 支持配置多端登录
  • 支持忽略鉴权注解@IgnoreAuth的功能支持
  • 支持通过权限码来控制接口是否可以请求
  • 支持通过配置请求资源与角色关系来控制是否可以请求
  • 提供PasswordEncoder密码工具类和SecurityUtil安全工具类

TokenService登录服务

认证相关服务的封装类,用于处理接收到的用户登录请求,并根据传输过来的数据选择对应的处理方式。其中clientloginType参数必须传输:

核心接口说明

AbstractAuthentication

抽象认证器,是各类认证器的根接口,UsernamePasswordAuthenticationOpenIdAuthentication都是它的子接口, 如果要扩展新的登录方式,通常是实现它或者他的子接口和继承它的实现类。例如短信登录PhoneLoginHandler就是实现的这个接口。

GetAuthClientService

用来获取认证终端的接口声明,在登录处理时,需要知道当前是哪类终端进行的登录,所以这个接口必须要被实现,并且注册到Bean容器中,否则无法进行登录流程, 项目也无法启动。目前IAM模块已做实现。

GetAuthLoginTypeService

用来获取认证登录方式对象的声明,在登录处理时,需要知道当前是哪种登录方式,所以这个接口必须要被实现,并且注册到Bean容器中,否则无法进行登录流程, 项目也无法启动。目前IAM模块已做实现。

OpenIdAuthentication

AbstractAuthentication接口的一个实现,主要用在封装第三方登录的场景,例如企业微信、钉钉、QQ等方式。配合ThirdLoginService服务类可以快速接入新的第三方登录, 可以参照系统中已完成的DingTalkLoginHandlerWeChatLoginHandlerWeComLoginHandler等处理类。

RouterCheck

路由拦截检查,接收到用户访问的请求后,依次通过各实现类的check方法判定返回的truefalse,来控制是否放行请求,目前已经有下列实现:

  • IgnoreAdminUserRouterCheck 超级管理员跳过各种限制
  • IgnoreAnnotationRouterCheck 注解方式过滤判定
  • IgnorePathRouterCheck 跳过不启用权限控制的路径
  • UserPathRouterCheck 用户是否拥有路径访问方式检查
  • PermCodeRouterCheck 权限码方式请求路径拦截

UsernamePasswordAuthentication

通过实现该接口,就可以实现认证鉴权中最经典的用户账号密码登录,目前系统中PasswordLoginHandler类实现了该接口。

注解和工具类

@IgnoreAuth

忽略鉴权注解,可以加在Controller的方法或类上,访问时不在进行鉴权,加在非Controller的地方无效,在Controller类和方法同时添加此注解时,以方法上的注解为准,注解配置如下:

  • ignore 是否忽略请求鉴权,默认为true,未登录也可以访问
  • login 只要登录就忽略权限校验, 在ignorefalse时生效,默认为false

@IgnoreAuth(Sa-Token自带注解)

忽略认证:表示被修饰的方法或类无需进行注解认证和路由拦截认证

请注意:此注解的忽略效果只针对 SaInterceptor拦截器 和 APO注解鉴权 生效,对自定义拦截器与过滤器不生效

@PermCode

权限码注解,在认证中主要用来控制哪些用户和角色可以访问,通过在Controller类或者它的方法上标注此注解,就可以对访问权限进行控制。

请注意: 加在非Controller的地方无效,在Controller类和方法同时添加此注解时,以方法上的注解为准。

PasswordEncoder

密码编码工具类,对原始密码进行摘要加密,通常用在注册、修改密码、重置密码等场合。

SecurityUtil

安全工具类,主要功能就是用来获取当前登录用户的信息。

第三方登录

TIP

主要基于OpenIdAuthentication接口进行实现,然后通过ThirdLoginController来处理生成授权页与接收三方登录的回调消息。 目前已经对接了微信公众平台微信开放平台钉钉企业微信四种,其中微信公众平台跟其他的不太一致, 需要查看第三方平台对接中的说明。

认证的过程基本上都是OAuth方式,可以阅读justAuth官网的文档进行了解,地址:OAuth流程

配置说明

yaml
bootx.starter.auth:
  # 盐值
  salt: yanzhi 
  # 默认密码
  defaultPassword: 123456
  # 开启超级管理员,开启后可以登录超级管理员账号,超级管理员有系统中最高的权限。推荐生产模式关闭此选项
  enableAdmin: true
  # 不进行鉴权的路径
  ignoreUrls:
    - '/actuator/**'
    - '/v2/api-docs'
    - '/doc.html'
    - '/webjars/**'
  # 第三方登录
  third-login:
    ding-talk:
      # 登录成功后的回调地址
      redirect-uri: http://127.0.0.1:9999/auth/third/callback/dingTalk
      # 客户端Secret:对应各平台的appSecret
      client-secret: ??
      # 客户端id:对应各平台的appKey
      client-id: ??
    we-com:
      redirect-uri: http://127.0.0.1:9999/auth/third/callback/weCom
      client-secret: ??
      client-id: ??
      # 企业微信,授权方的网页应用ID 
      agent-id: ??
    # 微信开放平台
    we-chat-open:
      redirect-uri: http://127.0.0.1:9999/auth/third/callback/weChat
      client-id: ??
      client-secret: ??
本文档内容版权属于 Bootx 组织,保留所有权利