cas5.3.2单点登录-自定义鉴权路径(十)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34021712/article/details/81508273

原文地址,转载请注明出处: https://blog.csdn.net/qq_34021712/article/details/81508273     ©王赛超 

客户端整合cas之后,无论我们访问什么地址,只要没有发现票据,都会跳转到cas服务端去进行登录。有时候我们有这样的需求,用户不登录也可以访问某些网页,这个时候就需要用到AuthenticationFilter的忽略地址功能。为了方便测试,我用一张图片来测试。
如果只是简单的忽略地址,那很简单只要使用AuthenticationFilter的ignorePattern参数,具体操作如下:

传统web项目配置方式

1.配置资源映射

我的图片放在WEB-INF/images下,默认是无法直接访问的,所以在spring-mvc.xml中配置资源映射

<mvc:resources mapping="/images/**" location="WEB-INF/images/" />

2.给web.xml中的AuthenticationFilter添加参数

<filter>
    <filter-name>CAS Filter</filter-name>
    <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
    <init-param>
        <param-name>casServerLoginUrl</param-name>
        <param-value>https://server.cas.com:8443/cas/login</param-value>
        <!-- 使用的CAS-Server的登录地址,一定是到登录的action -->
    </init-param>
    <init-param>
        <param-name>serverName</param-name>
        <param-value>http://app1.cas.com:8081</param-value>
        <!-- 当前Client系统的地址 -->
    </init-param>
    <init-param>
        <param-name>ignorePattern</param-name>
        <param-value>/js/*|/images/*|/view/*|/css/*</param-value>
    </init-param>
</filter>

注意到上面的配置相对于之前,新增了ignorePattern 忽略的路径包含 /js 或者 /images 等,就这么简单就可以了.

springboot配置方式

1.首先配置资源映射

springboot项目,我的图片放在resource/static/images下,配置映射如下:

@Configuration
public class SpringMVC implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/images/**")
                .addResourceLocations("classpath:/static/images/");
    }
}

2.再配置授权过滤器如下:

/**
 * 授权过滤器
 * @return
 */
@Bean
public FilterRegistrationBean filterAuthenticationRegistration() {
    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setFilter(new AuthenticationFilter());
    // 设定匹配的路径
    registration.addUrlPatterns("/*");
    Map<String,String>  initParameters = new HashMap<String, String>();
    initParameters.put("casServerLoginUrl", CAS_SERVER_LOGIN_URL);
    initParameters.put("serverName", SERVER_NAME);
    initParameters.put("ignorePattern", "/js/*|/images/*|/view/*|/css/*");
    registration.setInitParameters(initParameters);
    // 设定加载的顺序
    registration.setOrder(1);
    return registration;
}

使用我之前自定义的starter

1.配置映射,代码参考上面springboot配置

2.在application.properties中添加如下配置就可以了。

#cas配置
cas.server-url-prefix=https://server.cas.com:8443/cas
cas.server-login-url=https://server.cas.com:8443/cas/login
cas.client-host-url=http://app2.cas.com:8082
cas.ignore-pattern=/js/*|/images/*|/view/*|/css/*

上面那种方式是写死在配置文件里的,假如出现某种情况,前期是不需要登录就可以获取,后期可能改需求,需要登录之后才可以获取,这个时候不能 因为这个功能而且改需求吧,我们可以实现UrlPatternMatcherStrategy 接口来做,将内容存在数据库,请求过来时,可以查询数据库做判断。具体操作如下:

1.需要写一个类实现UrlPatternMatcherStrategy 接口

package com.wangsaichao.cas.config;

import org.jasig.cas.client.authentication.UrlPatternMatcherStrategy;

import java.util.regex.Pattern;

/**
 * @author: wangsaichao
 * @date: 2018/8/7
 * @description: 自定义鉴权路径
 */
public class SimpleUrlPatternMatcherStrategy implements UrlPatternMatcherStrategy {

    private Pattern pattern;

    @Override
    public boolean matches(String url) {

        //在此可以做额外的扩展,比如判断是insert也放行 可以通过查询数据库来进行动态判断
        if(url.contains("/insert")){
            return true;
        }

        //默认是根据cas.ignore-pattern来判断是否否满足过滤
        return this.pattern.matcher(url).find();
    }

    /**
     * 这个pattern就是 在application.properties中配置的cas.ignore-pattern
     * @param pattern
     */
    @Override
    public void setPattern(String pattern) {
        this.pattern = Pattern.compile(pattern);
    }
}

在matches方法内,可以进行扩展,可以进行查库操作,等等。setPattern的方法参数就是我们前面配置的ignorePattern参数值。会自动传过来。下面针对不同项目给出不同配置方式。主要是配置ignoreUrlPatternType参数。

传统web项目配置方式

<filter>
    <filter-name>CAS Filter</filter-name>
    <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
    <init-param>
        <param-name>casServerLoginUrl</param-name>
        <param-value>https://server.cas.com:8443/cas/login</param-value>
        <!-- 使用的CAS-Server的登录地址,一定是到登录的action -->
    </init-param>
    <init-param>
        <param-name>serverName</param-name>
        <param-value>http://app1.cas.com:8081</param-value>
        <!-- 当前Client系统的地址 -->
    </init-param>
    <init-param>
        <param-name>ignorePattern</param-name>
        <param-value>/js/*|/images/*|/view/*|/css/*</param-value>
    </init-param>
    <init-param>
        <param-name>ignoreUrlPatternType</param-name>
        <param-value>com.wangsaichao.cas.config.SimpleUrlPatternMatcherStrategy</param-value>
    </init-param>
</filter>

springboot配置方式

/**
 * 授权过滤器
 * @return
 */
@Bean
public FilterRegistrationBean filterAuthenticationRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new AuthenticationFilter());
        // 设定匹配的路径
        registration.addUrlPatterns("/*");
        Map<String,String>  initParameters = new HashMap<String, String>();
        initParameters.put("casServerLoginUrl", CAS_SERVER_LOGIN_URL);
        initParameters.put("serverName", SERVER_NAME);
        initParameters.put("ignorePattern", "/js/*|/images/*|/view/*|/css/*");
        initParameters.put("ignoreUrlPatternType", "com.wangsaichao.cas.config.SimpleUrlPatternMatcherStrategy");
        registration.setInitParameters(initParameters);
        // 设定加载的顺序
        registration.setOrder(1);
        return registration;
}

使用我之前的自定义starter方式

在application.properties中添加以下内容

#cas配置
cas.server-url-prefix=https://server.cas.com:8443/cas
cas.server-login-url=https://server.cas.com:8443/cas/login
cas.client-host-url=http://app2.cas.com:8082
cas.ignore-pattern=/js/*|/images/*|/view/*|/css/*
cas.ignore-url-pattern-type=com.wangsaichao.cas.config.SimpleUrlPatternMatcherStrategy

猜你喜欢

转载自blog.csdn.net/qq_34021712/article/details/81508273