1、什么是pac4j
pac4j是一个java的安全 引擎
在一套标准的interface下,
1、提供多种认证机制,表单登录,JWS,cas,OAuth等等
2、多种授权和权限检查机制:role/permission,CORS,CSRF,HTTP Security headers
3、多种框架集成方式:springboot, shiro,play,spring security
多种认证方式可插拔,可同时使用一种或多种
常见的是springboot+cas+role/permissions
2、重要组件及概念
client
引入不同的认证包会包含不同的Client类,每个Client类代表一种登录和认证方式。比如:
使用CLient-cas,里面就是CasClient
authenticator
Authenticator是client的一个组件,用来validate credentials,并用来创建user profile。
authorizer
用来检测用户是否能够通过授权,pac4j内置了很多authorizer:
- StrictTransportSecurityHeader
- XContentTypeOptionsHeader
- XFrameOptionsHeader
- XSSProtectionHeader
- CacheControlHeader
- CsrfAuthorizer
- CsrfTokenGeneratorAuthorizer
- CorsAuthorizer
- IsAnonymousAuthorizer
- IsAuthenticatedAuthorizer
- IsFullyAuthenticatedAuthorizer
- IsRememberedAuthorizer
我们也可以自己实现,然后添加到config的authorizerMap中
matchers
用来判断一个请求,是否经过登录或认证
开发者可以在config中定义很多的matchers,并定义每个请求需要经过哪些matchers
一个请求只有在经过的matchers返回值都为true时才能进行认证检测
如果为false,则直接授权访问
config
配置了要用到的clients,authorizers,matchers
user profile
代表了一个认证后的用户,包括id,属性,角色,权限等
web context
对一个请求的抽象,包含了request,response,session,还有pac4j提供的其他的来辅助描述这次请求的数据
security filter
拦截机制,根据client的不同来进行认证检查,授权检查,从而保护一个url地址,如果是没有认证的用户,则尝试登录
callback controller
对于一些间接登录,如需要在一个特殊页面进行登录,不是每个请求都携带认证信息的client,在完成登陆操作需要调用callback controller,最终完成登陆操作。
logout controller
登出操作
3、流程
一个请求过来,访问一个url A,如果A需要被保护,那么开始以下步骤:
1、开发人员设置需要经过的security filter
2、如果security filter能从web context中获取到user profile,并且user profile是登录状态,那么通过认证,允许访问。
3、如果没有user profile,那么从config中配置的clients中获取到该应用可支持的client
4、先用direct clients来判断是否能登录,如果此时的context中包含了这类client所需的登录信息,如token,则能够被授权访问成功
5、如果不行,则用indirect client的登录方式,跳转回特定的登录页
6、在特定的登录页登录成功后,会跳转到rollback controller进行最后的登录操作,及获取user profile并保存。
7、退出时,访问logoutcontroller,执行退出