栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

告别shiro-cas单点登录集成库,这款简单且强壮的Java Web安全引擎pac4j你值得拥有

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

告别shiro-cas单点登录集成库,这款简单且强壮的Java Web安全引擎pac4j你值得拥有

告别shiro-cas单点登录集成库,这款简单且强壮的Java Web安全引擎pac4j你值得拥有

一、缘何遇到该引擎二、引擎能力三、引擎特征四、核心组件五、项目移植

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 导包

   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

5.2 配置
cas:
  client-name: app
  server:
   url: http://127.0.0.1:8080/cas
  project:
   url: http://127.0.0.1:8082/iotProject
5.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官网,传送门。

5.5 完成
  1. Cas校验INVALID_TICKET-not recognized ↩︎

  2. 单点登录出现“票根‘ST-xxxxxx-cas’不符合目标服务”的错误的解决办法 ↩︎

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/759116.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号