企业级单点登录解决方案 :本文记录的是cas5.3的使用
摘要:
1、开源的企业级单点登录解决方案。
2、CAS Server 为需要独立部署的 Web 应用。
3、CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。
4、CAS属于Apache 2.0许可证,允许代码修改,再发布(作为开源或商业软件)
从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。下图为 CAS 最基本的协议过程;
技术文档:https://apereo.github.io/cas/5.1.x/
1.https://github.com/apereo/cas-overlay-template/tree/5.3 下载cas服务器
2.idea导入maven项目,该项目是springboot的,已经打包成war,或者根据readme提示进行操作。
idea导入maven项目,该项目是springboot的,已经打包成war,或者根据readme提示进行操作。
操作步骤:进入项目目录:运行:
我们的运行使用cas提供的脚本
初始化命令:build.cmd init
打包命令 :build.cmd package
启动命令:build.cmd run
清理target目录文件命令:build.cmd clean
特别注意:需要导入maven项目:生成项目结构目录如下:
或者之前的步骤可以不用,导入maven项目直接install编译项目:
登录:
输入:用户名:casuser 密码:Mellon 登录cas主页
即可登录项目主页:
overlay技术:覆盖相同结构目录的文件内容:由于cas使用了该技术,我们可以直接用,不用过多了解:
下面新建类文件resources:生成的就是classes内的文件;
services里是注册信息,客户端可访问的设置:允许所有的localhost通过:不多做解释。
{
"@class": "org.apereo.cas.services.RegexRegisteredService",
"serviceId": "^(http)://localhost.*",
"name": "本地服务",
"id": 10000003,
"description": "这是一个本地允许的服务,通过localhost访问都允许通过",
"evaluationOrder": 1
}
application.properties就是springboot的配置文件,里面有服务端需要的配置参数信息:初始的账户密码就在里面;
这样,整个cas服务器初始阶段就搭好了!
下面开始搭建客户端client01
单点登录的客户端主要配置web.xml,其中过滤器的配置很重要:不懂过滤器的小伙伴请自行百度servlet的过滤器。
需要客户端的jar包:mvc的其他包就不贴了。
<!-- 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.4.1</version>
</dependency>
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--单点登出过滤器-->
<filter>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>http://localhost:8080/cas</param-value>
</init-param>
</filter>
<!--用来跳转登录-->
<filter>
<filter-name>CAS Authentication Filter</filter-name>
<!--<filter-class>org.jasig.cas.client.authentication.Saml11AuthenticationFilter</filter-class>-->
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>http://localhost:8080/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<!--这是客户端的部署地址,认证时会带着这个地址,认证成功后会跳转到这个地址-->
<!-- <param-value>http://localhost:8181/node1</param-value>-->
<param-value>http://localhost:8080/client01/toIndex</param-value>
</init-param>
</filter>
<!--Ticket校验过滤器-->
<filter>
<filter-name>CAS Validation Filter</filter-name>
<!--<filter-class>org.jasig.cas.client.validation.Saml11TicketValidationFilter</filter-class>-->
<filter-class>org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>http://localhost:8080/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<!-- <param-value>http://localhost:8181/node1</param-value>-->
<param-value>http://localhost:8080/client01/toIndex</param-value>
</init-param>
<init-param>
<param-name>redirectAfterValidation</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>useSession</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>authn_method</param-name>
<param-value>mfa-duo</param-value>
</init-param>
</filter>
<!-- 该过滤器负责实现HttpServletRequest请求的包裹,比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置-->
<filter>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>
<!-- 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。 比如AssertionHolder.getAssertion().getPrincipal().getName()-->
<!--<filter>
<filter-name>CASAssertion Thread LocalFilter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CASAssertion Thread LocalFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>-->
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Authentication Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>
toIndex
</welcome-file>
</welcome-file-list>
</web-app>
同时部署cas服务和client01服务:
访问client01自动跳转到cas服务器登录页面
登出:先访问本地登出,清空session信息,再重定向到cas服务器清空信息
重定向自己的首页就行了,系统会自动拦截又重定向到了cas服务的登录页面了。
但是这样子是不起作用的:提醒:重定向网络页面需要加入注册才可以哦。
需要:在application.properties中加入这句话
#允许用户自定义退出路径
cas.logout.followServiceRedirects=true
到此,简单的客户端demo就此完成了。
连接数据库:
cas使用jdbc连接数据库:
1.pom中添加相应的jar包
<!--cas数据库相关的一些jar包-->
<!--数据库认证相关 start-->
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jdbc-drivers</artifactId>
<version>${cas.version}</version>
</dependency>
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jdbc</artifactId>
<version>${cas.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.26</version>
</dependency>
2.application.properties 添加连接数据库以及查询的配置信息
##
# CAS Authentication Credentials
#数据库认证
#cas.authn.accept.users=a::a
cas.authn.jdbc.query[0].url=jdbc:mysql://localhost:3306/mytest1?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
cas.authn.jdbc.query[0].user=root
cas.authn.jdbc.query[0].password=131412
cas.authn.jdbc.query[0].sql=select * from user where username=?
cas.authn.jdbc.query[0].fieldPassword=password
cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver
输入用户名密码即登录成功!本文只做简单的demo样例,加密类似的操作暂不处理。
至此,cas连接数据库实现登录登出的操作就此完成!