原文地址,转载请注明出处: 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