所需依赖
<!-- https://mvnrepository.com/artifact/org.jasig.cas.client/cas-client-core -->
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
<version>3.5.0</version>
</dependency>
web.xml配置
在客户端的web.xml里配置过滤器,根据添加的过滤器的位置顺序介绍
Cas20ProxyReceivingTicketValidationFilter(必需)
该过滤器负责对ticket的校验工作,这个过滤器要放在第一个位置。casServerUrlPrefix:cas服务器访问地址,serverName:客户端域名和端口。这里也可以配置成ip,但是最好还是配置成域名。
还有就是cas服务端我取消了https,这里路径注意一下。
<!-- 该过滤器配置负责对Ticket的校验工作-->
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>http://www.mycas.com:8088/cas-server-webapp-3.5.2</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://127.0.0.1:80/</param-value>
</init-param>
<init-param>
<param-name>renew</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>gateway</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
AuthenticationFilter(必需)
该过滤器负责用户的认证工作,casServerLoginUrl:cas服务端登录地址(注意这里比上面的多了’/login’),serverName:同上
<!--该过滤器负责用户的认证工作-->
<filter>
<filter-name>CASFilter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>http://www.mycas.com:8088/cas-server-webapp-3.5.2/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://127.0.0.1:80/</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
HttpServletRequestWrapperFilter (可选)与 AssertionThreadLocalFilter(可选)
<!--HttpServletRequestWrapperFilter-->
<filter>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--AssertionThreadLocalFilter-->
<filter>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这2个过滤器的功能是一样的,所以放到一起来讲,当我们登录成功后,需要获取登录的用户信息(只能获取到用户名),就需要配置上面2个过滤器的其中一个。获取方式如下:
HttpServletRequestWrapperFilter :
1 HttpServletRequest request2 = (HttpServletRequest) request;
2 // 从Cas服务器获取登录账户的用户名(2种方式)
3 String username1 = request2.getUserPrincipal().toString();
4 String username2 = request2.getRemoteUser();
AssertionThreadLocalFilter:
1 Assertion assertion = AssertionHolder.getAssertion();
2 String username3 = assertion.getPrincipal().getName();
问题1
报错:Renew MUST be specified via context parameter or JNDI environment to avoid misconfiguration.
将Cas20ProxyReceivingTicketValidationFilter中的
<init-param>
<param-name>renew</param-name>
<param-value>false</param-value>
</init-param>
修改为
<context-param>
<param-name>renew</param-name>
<param-value>false</param-value>
</context-param>
问题2
报错
未认证授权的服务
CAS的服务记录是空的,没有定义服务。 希望通过CAS进行认证的应用程序必须在服务记录中明确定义。
因为没有定义客户端的服务,要进行以下设置
1 在application文件中必须设置(默认是false)
cas.serviceRegistry.initFromJson=true
2 如果你还有以http或其他协议进行访问的客户端,还要设置 \WEB-INF\classes\services\HTTPSandIMAPS-10000001.json
"serviceId" : "^(https|imaps)://.*" 中添加http后:
"serviceId" : "^(https|imaps|http)://.*",
问题3
未认证授权的服务
不允许使用CAS来认证您访问的目标应用。
因为你访问的客户端项目使用的协议没有加入到cas认证中,请添加使用的协议即可;可参考问题2
问题4
如何限制某些客户端接入?
同问题2,3一样
在resources/services下新建文件Pointservice-10000002.json
注意:json文件名字规则为${name}-${id}.json, id必须为json文件内容id一致
json文件解释:
•@class:必须为org.apereo.cas.services.RegisteredService的实现类,对其他属性进行一个json反射对象,常用的有RegexRegisteredService,匹配策略为id的正则表达式
•serviceId:唯一的服务id
•name: 服务名称,会显示在默认登录页
•id:全局唯一标志
•description:服务描述,会显示在默认登录页
•evaluationOrder: 匹配争取时的执行循序(越小越优先)
•theme:主题,默认是apereo
除了以上说的还有很多配置策略以及节点,具体看官方文档,配置不同的RegisteredService也会有稍微不一样
{
"@class": "org.apereo.cas.services.RegexRegisteredService",
"serviceId": "^(https|imaps)://www.pointservice.com.*",
"name": "指定的服务1",
"id": 10000002,
"description": "这是一个本地允许的服务,通过localhost访问都允许通过",
"evaluationOrder": 1
}