CAS4.0.3服务的搭建实战三【编写shiro-cas客户端】

shiro与cas可以实现无缝的整合,只需要加入几个依赖的jar包,修改部分shiro的配置文件,定义一个自己的casRealm

项目结构

在这里插入图片描述

一、在pom中加入cas相关依赖

<dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-cas</artifactId>
      <version>${cas-version}</version>
</dependency>

二、修改shiro配置文件

主要修改三处:
1、shiroFilter,一是将loginUrlvalue设置为:cas认证服务地址/login?service=客户端访问地址/cas,二是配置新增的casFilter,和固定的拦截规则:/cas = cas修改如下:

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!-- 构建securityManager环境 -->
        <property name="securityManager" ref="securityManager" />
        <!-- 要求登录时的链接(可根据项目的URL进行替换),非必须的属性,默认会自动寻找Web工程根目录下的"/login.jsp"页面 -->
        <property name="loginUrl" value="https://sso.siwash.net:8443/login?service=http://client.siwash.net:8081/cas"/>
        <!--&lt;!&ndash; 登录成功后要跳转的连接 &ndash;&gt;-->
        <!--<property name="successUrl" value="/index.html"/>-->
        <!--&lt;!&ndash; 没有权限返回的地址 (拒绝访问路径)&ndash;&gt;-->
        <!--<property name="unauthorizedUrl" value="/index.jsp" />-->
        <property name="filters">
            <util:map>
                <entry key="cas" value-ref="casFilter"/>
                <entry key="logoutFilter" value-ref="logoutFilter"/>
            </util:map>
        </property>
        <property name="filterChainDefinitions">
            <value>
                /casFailure.jsp=anon
                /cas = cas
                /index.jsp=anon
                /index.html=anon
                /**=authc
                /logout = logoutFilter
                /users/** = user
            </value>
        </property>
    </bean>

2.新增一个casFilter:

<bean id="casFilter" class="org.apache.shiro.cas.CasFilter">
        <property name="failureUrl" value="http://client.siwash.net:8081/casFailure.jsp" />
        <property name="successUrl" value="http://client.siwash.net:8081/zone.html" />
</bean>

3.定义自己的casRealm,其中casServerUrlPrefix为cas服务端地址,casService为客户端地址,这里配置这两个的目的是:在应用A已经认证后应用B访问时,则会直接进入该casRealm,在代码中回去请求认证中心如下url:

https://sso.siwash.net:8443/cas/serviceValidate?ticket=xxxx&service=客户端地址

去验证有效性,并返回用户的信息,当验证通过后应用B则直接进入B系统,而不需要进行二次登陆。

<bean id="realm" class="rpf.study.shiro.casRealm">
        <property name="casServerUrlPrefix" value="https://sso.siwash.net:8443/"/>
        <property name="casService" value="http://client.siwash.net:8081/cas"/>
</bean>

三、定义自己的casRealm

public class casRealm extends CasRealm{

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        CasToken casToken = (CasToken)token;
        if (token == null) {
            return null;
        } else {
            String ticket = (String)casToken.getCredentials();
            if (!StringUtils.hasText(ticket)) {
                return null;
            } else {
                TicketValidator ticketValidator = this.ensureTicketValidator();

                try {
                    Assertion casAssertion = ticketValidator.validate(ticket, this.getCasService());
                    AttributePrincipal casPrincipal = casAssertion.getPrincipal();
                    String userId = casPrincipal.getName();
                    Map<String, Object> attributes = casPrincipal.getAttributes();
                    casToken.setUserId(userId);
                    String rememberMeAttributeName = this.getRememberMeAttributeName();
                    String rememberMeStringValue = (String)attributes.get(rememberMeAttributeName);
                    boolean isRemembered = rememberMeStringValue != null && Boolean.parseBoolean(rememberMeStringValue);
                    if (isRemembered) {
                        casToken.setRememberMe(true);
                    }

                    List<Object> principals = CollectionUtils.asList(new Object[]{userId, attributes});
                    PrincipalCollection principalCollection = new SimplePrincipalCollection(principals, this.getName());
                    return new SimpleAuthenticationInfo(principalCollection, ticket);
                } catch (TicketValidationException var14) {
                    throw new CasAuthenticationException("Unable to validate ticket [" + ticket + "]", var14);
                }
            }
        }
    }
}

这里只是将父类的方法直接复制了过来,实际开发中可以将代码中attributes 中读取到的用户数据放入shirosession中去。可以看出这里同样用到了validate方法去请求cas验证ticket的有效性

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值