CAS安装配置

安装要求:
  1. Java >= 1.7
  2. Servlet容器支持servlet3.0
  3. Apache Maven >= 3.3

安装步骤:
1. 下载cas模板
* Maven https://github.com/apereo/cas-overlay-template
* Gradle https://github.com/apereo/cas-gradle-overlay-template
2. 进入模板中,查看readme.md文件。使用mvnw.bat clean package进行build.
这里我把maven升到了3.3.9,但是执行的时候一直报错-Dmaven.multiModuleProjectDirectory system propery is not set,网上查到的解决办法是加上这个参数给vm,最初我在目录下面建立.jvm/jvm.config但是没有它没有读,后来就索性在bat脚本执行前加上了一个set JVM_CONFIG_MAVEN_PROPS="-Dmaven.multiModuleProjectDirectory=E:\software\apache\apache-maven-3.3.9"命令,于是就可以进行maven build了。
3. 把生成的war放进tomcat或者eclipse中。这之前需要先启用tomcat的ssl连接.具体可参考
4. 访问https://localhost:8443/cas可以访问了,出现登陆页面.


接下来就是自定义配置CAS.

  1. 配置数据库验证.
    首先我们需要使用数据库验证。当前我们使用的版本是4.2.5,属于4.x.x,所以默认使用的验证器是primaryAuthenticationHandler.根据官方文档来看,我们可以使用官方提供的三种,也可以选择自己写。我们选择自己手动写一个.
    simpleUsernamePasswordAuthentication.java:

    package com.sut.cas.authentication.security.providers;
    
    import java.security.GeneralSecurityException;
    
    import javax.security.auth.login.FailedLoginException;
    
    import org.jasig.cas.authentication.HandlerResult;
    import org.jasig.cas.authentication.PreventedException;
    import org.jasig.cas.authentication.UsernamePasswordCredential;
    import org.jasig.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler;
    
    import com.sut.service.UserService;
    
    /**
     * 使用数据库验证
     * @author sut
     * @version $Revision:$
     */
    public class SimpleUsernamePasswordAuthentication extends AbstractUsernamePasswordAuthenticationHandler{
    
        private UserService userService;
    
        /**
        * @see org.jasig.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler#authenticateUsernamePasswordInternal(org.jasig.cas.authentication.UsernamePasswordCredential)
        */
        @Override
        protected HandlerResult authenticateUsernamePasswordInternal(UsernamePasswordCredential transformedCredential) throws GeneralSecurityException, PreventedException {
            if(transformedCredential == null)
                throw new FailedLoginException("No user can be accepted because none is defined");
            final String username = transformedCredential.getUsername();
            final String encodedPassword = this.getPasswordEncoder().encode(transformedCredential.getPassword());
    
            return doAuthenticate(transformedCredential, username, encodedPassword);
        }
    
    
        /**
        * @param credential
        * @param username
        * @param encodedPassword
        * @return
         * @throws FailedLoginException 
        */
        private HandlerResult doAuthenticate(UsernamePasswordCredential credential, String username, String encodedPassword) throws FailedLoginException{
            if(! userService.login(username, encodedPassword))
                throw new FailedLoginException("用户名或密码错误!");
            return createHandlerResult(credential, this.principalFactory.createPrincipal(username), null);
        }
    
    
        public UserService getUserService() {
            return userService;
        }
    
    
        public void setUserService(UserService userService) {
            this.userService = userService;
        }
  2. 配置deployerConfigContext.xml

    
    <bean id="simpleUsernamePasswordAuthentication" class="com.sut.cas.authentication.security.providers.SimpleUsernamePasswordAuthentication">
        <!-- 我们要使用的自定义service -->
        <property name="userService" ref="userService" />
    </bean>
    ...
    <!-- 自定义验证需要哪些 -->
    <util:map id="authenticationHandlersResolvers">
        <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
        <!-- <entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" /> -->
        <entry key-ref="simpleUsernamePasswordAuthentication" value-ref="primaryPrincipalResolver" />
    </util:map>

这样数据库验证就可以完成。要理解为什么这么做,这里涉及到具体的CAS SERVER验证的流程。

有一个博文讲的很清楚,觉得很好:

【SSO单点系列】(4):CAS4.0 SERVER登录后用户信息的返回


CAS Authentication(验证)

PrincipalNameTransformer

根据字面意思就是了,就是把login form得到的id和password,转换成以后特殊验证处理器可以使用的类型.

AuthenticationManager

这个验证Authentication Handler和验证策略,及验证结果的管理系统.

AuthenticationHander

AuthenticatioinHandler是一个具体验证处理器,产生三种结果:成功,失败,未验证.

PrincipalResolver

把authentication验证信息转换成security principal,通常包括元数据信息,比如用户详细信息,隶属关系,机构,邮件,名称等。

AuthenticationMetaDataPopulator

用来验证成功后设置元数据信息,通常用来设置protocol-specific数据.


Authentication Manager

这个manager可以设置多种验证策略,比如任一符合,全部符合。验证过程大概是验证,解析验证结果,解析元数据,验证是否符合security policy。

  • AnyAuthenticationPolicy
    符合任何验证即可
  • AllAuthenticationPolicy
    需要符合所有验证
  • RequiredHandlerAuthenticationPolicy
    符合所需要的验证即可。

Authentication Handler

支持多种通用的系统.还会受白名单和黑名单的影响

  • Database
  • JAAS
  • LDAP
  • OAuth 1.0/2.0, OpenID
  • RADIUS
  • SPNEGO (Windows)
  • Trusted (REMOTE_USER)
  • X.509 (client SSL certificate)
  • Remote Address
  • YubiKey
  • Apache Shiro
  • pac4j

Password Encoding

用来在验证时间中加密密码数据。

Argument Extractors

解析参数


CAS Security Guide简单介绍

Forced Authentication

对于某个服务,我们可能希望重新验证User。CAS支持这种服务,通过renew parameter设置。

Passive Authentication

这个认证是匿名验证,即使不登陆也可以访问的服务。通过gateway特性配置

Proxy Authentication

代理认证,主要用来当用户验证service不能直接和终端打交道的时候使用。但是有风险,并且破坏了几种性.

Multi-factor Authentication

多个元素验证,包括多个验证。比如地点、时间、level等.

Multi-factor Authentication

使用这个缓存登陆credients和reply给请求的request.

Service Management

service管理。用来指定配置需要哪些具体的sercurity sevice。

当用户登录成功的时候会给一个HTTP cookiee,默认是加密,可以通过cas.properties进行设置.

Ticket Expiration Policies

Ticket Expiration Polices是security service首要的一个策略。这个策略可以控制CAS SSO会话的一些行为:
* SSO session duration(失效)
* Ticket reuse

Single Sign-Out

单点登出

Login Throttling

登陆限制

Credential Encryption

credits加密

CAS Security Filter

这个是用来设置security request过滤器,在认证前进行过滤。 推荐使用。

Security Response Headers

自动加入的response header

Spring Webflow Sessions

CAS使用spring webflow来管理session,而这个webflow session的管理由客户端管理和追踪的。


User-Driven Security Features

一下为用户可以应用的自定义service

Long Term Authentication

长时间保持验证

Warn

用来设置warn,用户登录后到一个warnPage,大多数情况下可以用来显示,然后舍弃这个会话。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐