Appearance
鉴权框架封装模块 ¶
介绍
基于Sa-Token和justAuth进行封装,未选择Spring Security原因是复杂度较高,且同时对在前后端分离环境下支持一般。未选择Shiro是因为Sa-Token已经足够成熟, API对中小项目来说更加直观和简单易用。注意:管理员用户拥有最高的权限,不受权限控制,默认拥有所有数据和接口的权限。
Sa-Token官网:https://sa-token.cc/
justAuth官网:https://justauth.wiki/
更详细的内容可以查看 身份识别与访问管理 下的具体模块,有更详细的说明。
功能 ¶
- 提供账号密码登陆功能
- 提供第三方登录扩展
- 支持配置多端登录
- 支持忽略鉴权注解@IgnoreAuth的功能支持
- 支持通过权限码来控制接口是否可以请求
- 支持通过配置请求资源与角色关系来控制是否可以请求
- 提供PasswordEncoder密码工具类和SecurityUtil安全工具类
TokenService登录服务 ¶
认证相关服务的封装类,用于处理接收到的用户登录请求,并根据传输过来的数据选择对应的处理方式。其中client和loginType参数必须传输:
核心接口说明 ¶
AbstractAuthentication ¶
抽象认证器,是各类认证器的根接口,UsernamePasswordAuthentication和OpenIdAuthentication都是它的子接口, 如果要扩展新的登录方式,通常是实现它或者他的子接口和继承它的实现类。例如短信登录PhoneLoginHandler就是实现的这个接口。
GetAuthClientService ¶
用来获取认证终端的接口声明,在登录处理时,需要知道当前是哪类终端进行的登录,所以这个接口必须要被实现,并且注册到Bean容器中,否则无法进行登录流程, 项目也无法启动。目前IAM模块已做实现。
GetAuthLoginTypeService ¶
用来获取认证登录方式对象的声明,在登录处理时,需要知道当前是哪种登录方式,所以这个接口必须要被实现,并且注册到Bean容器中,否则无法进行登录流程, 项目也无法启动。目前IAM模块已做实现。
OpenIdAuthentication ¶
AbstractAuthentication接口的一个实现,主要用在封装第三方登录的场景,例如企业微信、钉钉、QQ等方式。配合ThirdLoginService服务类可以快速接入新的第三方登录, 可以参照系统中已完成的DingTalkLoginHandler、WeChatLoginHandler、WeComLoginHandler等处理类。
RouterCheck ¶
路由拦截检查,接收到用户访问的请求后,依次通过各实现类的check方法判定返回的true或false,来控制是否放行请求,目前已经有下列实现:
- IgnoreAdminUserRouterCheck超级管理员跳过各种限制
- IgnoreAnnotationRouterCheck注解方式过滤判定
- IgnorePathRouterCheck跳过不启用权限控制的路径
- UserPathRouterCheck用户是否拥有路径访问方式检查
- PermCodeRouterCheck权限码方式请求路径拦截
UsernamePasswordAuthentication ¶
通过实现该接口,就可以实现认证鉴权中最经典的用户账号密码登录,目前系统中PasswordLoginHandler类实现了该接口。
注解和工具类 ¶
@IgnoreAuth ¶
忽略鉴权注解,可以加在Controller的方法或类上,访问时不在进行鉴权,加在非Controller的地方无效,在Controller类和方法同时添加此注解时,以方法上的注解为准,注解配置如下:
- ignore是否忽略请求鉴权,默认为- true,未登录也可以访问
- login只要登录就忽略权限校验, 在- ignore为- false时生效,默认为- 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: ??