统一认证
概述
基于spring-authorization-server开发的支持的FORM、OAUTH2、CAS、SAML等协议的统一认证平台。
客户端接入
使用配置
spring:
security:
oauth2:
resourceserver:
opaquetoken:
client-id: e4da4a32-592b-46f0-ae1d-784310e88423
client-secret: secret
introspection-uri: http://127.0.0.1:9010/oauth2/introspect # 统一认证的endpoint
上述为资源服务器的配置,依赖spring-boot-starter-oauth2-resource-server。macula平台使用gateway作为资源服务器。
服务端介绍
提供基于OAUTH/CAS/OIDC/SAML协议的统一认证服务,所有服务经过网站认证
认证方式
负责认证资源Owner方提供的认证凭据,为下层交互协议生成token或者ticket做准备
用户名密码认证
POST /login
username 用户名
password 密码
要带上openid/unionid可以绑定
短信认证(TODO)
POST /login/captcha
phone 手机号码
captcha 短信验证码
要带上openid/unionid可以绑定
微信授权手机号登录(TODO)
POST /login/weapp/phone
新版
code(后端通过code获取手机号),再根据手机号查询对应用户
旧版(加密数据,后端用session_key解密得到手机号)
encryptedData
iv
要带上openid/unionid可以绑定
已绑定小程序登录认证(TODO)
POST /login/weapp/code
code(后端调用code2session获取openid/unionid,如果没有绑定则调用不成功)
已绑定企微小程序登录认证(TODO)
POST /login/qyweapp/code
code(后端调用code2session获取userid,没有绑定登录不成功)
协议
协议层不负责用户身份认证,只按照协议生成对应的token或者ticket返回给客户端
OAuth2协议
提供基于OAuth2.1协议的实现,基于spring-authorization-server 0.41实现,默认支持的grant_type为:
- authorization_code
- client_credentials
- refresh_token
- 兼容旧OAuth2.0扩展的password等类型
注意:基于安全原因,OAuth2.1默认已经取消了对于grant_type为password及implicit的支持。
CAS协议(TODO)
SAML协议(TODO)
二次开发
认证方式扩展
主要参考authentication和grant两个包中类
协议扩展
参考config中的有关各协议的配置
登录界面定制
在 src/resources/templates/目录中,可以考虑在client配置中设置不同client需要的认证方式,从而出现不同登录界面
用户身份源定制
实现UserAuthInfoService接口,可以根据UserType访问不同的身份源
public interface UserAuthInfoService {
/**
* 获取用户信息,上层覆盖该方法
*
* @param userType 用户类型
* @param username 用户名
* @return 返回指定用户类型和用户名的用户信息
*/
UserAuthInfo getUserAuthInfo(UserTypeEnum userType, String username);
}
public enum UserTypeEnum {
MEMBER("member", "会员"),
EMPLOYEE("employee", "行政员工"),
ODC("odc", "外包人员"),
SUPPLIER("supplier", "供应商");
...
}
注意:
为了兼容旧版oauth2服务器,grant包提供password的grant_type方式,不过该方式以后会逐步取消
版权说明
- spring-authorization-server:https://github.com/spring-projects/spring-authorization-server/blob/main/LICENSE.txt