一、缘何遇到该引擎二、引擎能力三、引擎特征四、核心组件五、项目移植
5.1 导包5.2 配置5.3 重写认证和授权函数5.4 调试
5.4.1 CAS验证原理
5.5 完成
pac4j官网地址传送门。
一、缘何遇到该引擎pac4j引擎全称为powerful authentication client for java,这是笔者根据其官网介绍推测的全称,不一定正确,姑且这样叫着。
笔者在集成CAS单点登录服务时使用springboot+shiro搭配shiro-cas库,但是总是遇到非法令牌的问题即invalid_ticket,找了各种解释。
- CAS服务器令牌失效时间短的问题1
笔者更改配置文件,尝试多次,貌似不起作用,官方说的这是默认且唯一的配置;缺少其它依赖库2
引入后也不得行;客户端应用路径问题
Url缺少“/”
总之成功的都是相似的,不成功的原因千奇百怪。
更要命的是说,该库在退出的时候也有bug,折腾了许久,未果。
就在GitHub上搜springboot shiro cas,就出来了使用pac4j引擎的项目,而且是一个很简单的纯测试项目。项目地址传送门。
下载跑起来测试一下,很舒服,直接成功。
先来看一下这个安全引擎能够支持的框架,如下图,几乎包揽市面上的所有的框架,当然Shiro和Spring Security也在其中。在对接的时候引擎抽象了共同点使得工作变得简单。
支持的认证协议有:
OAuth (Facebook, Twitter, Google…) - SAML - CAS - OpenID Connect - HTTP - Google App Engine
LDAP - SQL - JWT - MongoDB - CouchDB - IP address - Kerberos (SPNEGO) - REST API
支持的授权类型有:
Roles/permissions - Anonymous/remember-me/(fully) authenticated - CORS - CSRF - HTTP Security headers
三、引擎特征- 简单高效强壮
笔者需要被集成的Web系统是基于Guns后台开发,版本是beetle版本,项目集成CAS基于spring-shiro-cas移植。
5.1 导包5.2 配置org.apache.shiro shiro-core 1.4.0 slf4j-api org.slf4j org.apache.shiro shiro-spring 1.4.0 io.buji buji-pac4j 4.0.0 org.pac4j pac4j-cas 3.3.0
cas: client-name: app server: url: http://127.0.0.1:8080/cas project: url: http://127.0.0.1:8082/iotProject5.3 重写认证和授权函数
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken)throws AuthenticationException {
final Pac4jToken pac4jToken = (Pac4jToken) authenticationToken;
final List commonProfileList = pac4jToken.getProfiles();
final CommonProfile commonProfile = commonProfileList.get(0);
logger.info("单点登录返回的信息" + commonProfile.toString());
// final Pac4jPrincipal principal = new Pac4jPrincipal(commonProfileList,getPrincipalNameAttribute());
UserAuthService shiroFactory = UserAuthServiceServiceImpl.me();
User user = shiroFactory.user(commonProfile.getId());
ShiroUser shiroUser = shiroFactory.shiroUser(user);
final PrincipalCollection principalCollection = new SimplePrincipalCollection(shiroUser, getName());
return new SimpleAuthenticationInfo(principalCollection,commonProfileList.hashCode());
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
UserAuthService shiroFactory = UserAuthServiceServiceImpl.me();
ShiroUser shiroUser = (ShiroUser) principals.getPrimaryPrincipal();
List roleList = shiroUser.getRoleList();
Set permissionSet = new HashSet<>();
Set roleNameSet = new HashSet<>();
for (Long roleId : roleList) {
List permissions = shiroFactory.findPermissionsByRoleId(roleId);
if (permissions != null) {
for (String permission : permissions) {
if (ToolUtil.isNotEmpty(permission)) {
permissionSet.add(permission);
}
}
}
String roleName = shiroFactory.findRoleNameByRoleId(roleId);
roleNameSet.add(roleName);
}
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.addStringPermissions(permissionSet);
info.addRoles(roleNameSet);
return info;
}
5.4 调试
5.4.1 CAS验证原理
该图出自CAS官网,传送门。
Cas校验INVALID_TICKET-not recognized ↩︎
单点登录出现“票根‘ST-xxxxxx-cas’不符合目标服务”的错误的解决办法 ↩︎



