最近一个项目要接入一个统一登录平台,对方使用的是cas服务端,我们的项目需要继承cas客户端。我对项目进行了调整,集成cas客户端,具体的步骤如下:
首先要在pom.xml中引入cas的依赖,如下:
<!--cas的客户端 -->
<dependency>
<groupId>net.unicon.cas</groupId>
<artifactId>cas-client-autoconfig-support</artifactId>
<version>2.2.0-GA</version>
<exclusions>
<exclusion>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
<version>3.5.0</version>
</dependency>
注:这里要特别提醒下,网上有些帖子写的xml的配置,可能只需要第二个dependency就可以了,但是对于springboot来说,可能会有一定的问题,我这边是报了一个json的错误,最后找了半天才发现是这块的问题。
然后再对application.properties做如下的配置(基本有注释):
#cas 前缀
cas.server-url-prefix=http://192.168.2.101:9999/cas
#cas cas登录
cas.server-login-url=http://192.168.2.101:9999/cas/login
#回调
cas.client-host-url=http://192.168.2.101:9999/xxx/login
#Ticket校验器使用Cas30ProxyReceivingTicketValidationFilter
cas.validation-type=CAS3
#cas不拦截的url
ignore-host-url=/external/*
我这边有一个cas不拦截的一个外部接口,所以这边我定义了一个ignore-host-url。
后面需要写java config,做一些相应的操作和定义,代码如下:
CASUtil.java,从cas中获取用户名
public class CASUtil {
/**
* 从cas中获取用户名
*
* @param request
* @return
*/
public static String getAccountNameFromCas(HttpServletRequest request) {
Assertion assertion = (Assertion) request.getSession().getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION);
if(assertion!= null){
AttributePrincipal principal = assertion.getPrincipal();
return principal.getName();
}else return null;
}
}
CASAutoConfig.java,过滤被cas拦截的外部url
@Configuration
public class CASAutoConfig {
@Value("${cas.server-url-prefix}")
private String serverUrlPrefix;
@Value("${cas.server-login-url}")
private String serverLoginUrl;
@Value("${cas.client-host-url}")
private String clientHostUrl;
@Value("${ignore-host-url}")
private String ignoreHostUrl;
/**
* 授权过滤器
* @return
*/
@Bean
public FilterRegistrationBean filterAuthenticationRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new AuthenticationFilter());
// 设定匹配的路径
registration.addUrlPatterns("/*");
Map<String,String> initParameters = new HashMap<>();
initParameters.put("casServerLoginUrl", serverUrlPrefix);
initParameters.put("serverName", clientHostUrl);
//忽略的url,"|"分隔多个url
initParameters.put("ignorePattern", ignoreHostUrl);
registration.setInitParameters(initParameters);
// 设定加载的顺序
registration.setOrder(1);
return registration;
}
}
因为项目中还有shiro的java config,所以这块的代码不一定是通用版的,不过基本也没什么问题,大体的一个思路是可以看得到的,希望这个能够帮助到有需要用到的童鞋们。
有不懂的地方可以给我留言,或者进群交流!