SSO CAS

2022-10-25 15:47:04 浏览数 (2)

SSO CAS

  • 一、单点登录与CAS协议
  • 二、搭建Tomcat-CAS——CAS Server端
  • 三、代码实现——CAS Client端

一、单点登录与CAS协议

  1. SSO(概念) 目前比较流行的企业业务整合的解决方案之一,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
  2. CAS(实现) 定义:开源的企业级单点登录解决方案。 CAS框架:CAS(Central Authentication Service)是实现SSO单点登录的框架。 CAS Server为需要独立部署的Web应用;CAS Client支持非常多的客户端。

访问服务 -> 丁香认证 -> 用户认证 -> 发放票据 -> 验证票据 -> 传递用户信息

  • 名次 Ticket Granting ticket(TGT):可以认为是CAS Server根据用户名密码生成的一张票,存在server端。 Ticket-granting cookie(TGC) :其实就是一个cookie,存放用户身份信息,由server发给client端。 Service ticket(ST):由TGT生成的一次性票据,用于验证,只能用一次。相当于server发给client一张票,然后client拿着这个票再来找server验证,看看是不是server签发的。

CAS过程 搭建方法

二、搭建Tomcat-CAS——CAS Server端

Step 1. 步骤一:配置Tomcat 下载Tomcat(建议8以上版本)

代码语言:javascript复制
//复制war包进入web-apps,运行Tomcat
sudo sh startup.sh
sh shutdown.sh

1.修改端口号 (1) tomcat-config-service.xml中修改为9100(protocol=“HTTP/1.1”) (2) cas-WEB-INF-cas.properties中修改为9100(server.name=http://localhost:9100)

2.去除https认证(secure) 避开SSL证书,方便测试和编码过程。 (1) cas-WEB-INF-deployerConfigContext.xml中修改requireSecure

代码语言:javascript复制
<bean id="proxyAuthenticationHandler" class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" p:httpClient-ref="httpClient" p:requireSecure="false"/>

(2) cas-WEB-INF-spring-configuration-ticketGrantingTicketCookieGenerator.xml中修改

代码语言:javascript复制
p:cookieSecure="false"
p:cookieMaxAge="3600" <!-- cookie有效时间为3600s -->

(3) cas-WEB-INF-spring-configuration-warnCookieGenerator.xml中修改

代码语言:javascript复制
p:cookieSecure="false"
p:cookieMaxAge="3600"

3.允许退出登录后重定向到其他页面(…?service=…) cas-WEB-INF-spring-configuration-warnCookieGenerator.xml中修改

代码语言:javascript复制
 <bean id="logoutAction" class="org.jasig.cas.web.flow.LogoutAction" p:servicesManager-ref="servicesManager" p:followServiceRedirects="${cas.logout.followServiceRedirects:true}"/>

三、代码实现——CAS Client端

导入相应的依赖:

代码语言:javascript复制
<dependency>
    <groupId>net.unicon.cas</groupId>
    <artifactId>cas-client-autoconfig-support</artifactId>
    <version>1.4.0-GA</version>
</dependency>

application.properties配置:

代码语言:javascript复制
server.port=9001

cas.server-url-prefix=http://cas.server.com:8443/cas
cas.server-login-url=http://cas.server.com:8443/cas/login
cas.client-host-url=http://cas.client1.com:9001
cas.use-session=true
cas.validation-type=cas

#自定义的退出url,退出成功后跳转到 http://cas.client1.com:9001/logout/success
casClientLogoutUrl=http://cas.server.com:8443/cas/logout?service=http://cas.client1.com:9001/logout/success

Springboot 启动类添加标签@EnableCasClient,启用CAS Client。 自定义Controller类,添加login和logout逻辑。

Config类需要配置忽略授权的URL:

代码语言:javascript复制
@Configuration
public class CASConfig {
    @Value("${cas.server-url-prefix}")
    private String serverUrlPrefix;
    @Value("${cas.server-login-url}")
    private String serverLoginUrl;
    @Value("${cas.client-host-url}")
    private String clientHostUrl;
 
    /**
     * 授权过滤器,添加一个id为filterAuthenticationRegistration的bean标签
     * @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", serverUrlPrefix);
        initParameters.put("serverName", clientHostUrl);
        //忽略的url,"|"分隔多个url
        initParameters.put("ignorePattern", "/logout/success|/index.html|.xml|/filename/*");
        registration.setInitParameters(initParameters);
        // 设定加载的顺序
        registration.setOrder(1);
        return registration;
    }
}

0 人点赞