cas 配置与自定义开发

1. 下载 cas server 源码

https://github.com/Jasig/cas/releases

我下载的是 4.0.1。你也可以直接checkout


cas client : http://downloads.jasig.org/cas-clients/

版本是 3.3.3


2. 将下载的 cas-4.0.1.zip 解压, 在根目录 执行 

mvn package install -Dmaven.test.skip=true

执行完成后,可将 cas-server-webapp\target\cas.war 部署到tomcat


3. 生成证书

参考: http://kai2008.iteye.com/blog/1134238

生成服务器端证书

keytool -genkey  -v  -alias  tomcat1 -dname "cn=localhost,ou=cas,o=cas,c=CN" -keyalg  RSA  -keystore d:/tomcat1.keystore -storepass 123456   -keypass 123456 -validity 3650

为客户端生成证书
keytool -genkey  -v   -alias myKey -keyalg   RSA  -storetype PKCS12   -keystore d:/my1.p12   -dname "cn=localhost,ou=cas,o=cas,c=CN"  -storepass 123456   -keypass 123456   -validity 3650

让服务器信任客户端证书
keytool -export -alias myKey   -keystore d:/my1.p12  -storetype PKCS12 -rfc  -file d:/my1.cer

客户端证书导入到服务器的证书库
keytool -import -v   -file d:/my1.cer  -keystore d:/tomcat1.keystore -storepass 123456


让客户端信任服务器证书

keytool -keystore d:/tomcat1.keystore -export -alias tomcat1 -file d:/tomcat1.cer


在浏览器中导入服务器和客户端证书。

双击 tomcat1.cer 即可导入服务器证书。按照提示安装证书,将证书填入到“受信任的根证书颁发机构”。

 

双击 my1.p12 即可导入服务器证书。按照提示安装证书,将证书填入到“个人”。


注意,cn要设置为服务器地址,如 localhost,方便调试,否则后面cas server 回调 cas client 会出错:

java.security.cert.CertificateException: No name matching localhost found


为客户端的JVM导入密钥

keytool -import -file d:/tomcat1.cer -alias tomcat1 -keystore "%java_home%\jre\lib\security\cacerts"


查看证书
keytool -list -v -keystore "%java_home%\jre\lib\security\cacerts" -alias localhost  

修改 tomcat conf server.xml :

<Connector SSLEnabled="true" clientauth="false" keystoreFile="conf/tomcat1.keystore" keystorePass="123456" maxThreads="150"
                     port="8443" protocol="HTTP/1.1" scheme="https" secure="true" sslProtocol="TLS" />



4. 开发 cas server

第一种:下载 cas server 源码后,执行

mvn eclipse:eclipse
导入eclipse,这时会报错:

Plugin execution not covered by lifecycle configuration:xxx plugin

解决方法:

在 cas-4.0.1\pom.xml 里的 build - pluginManagement  - plugins 节点加入:

<plugin>
			<groupId>org.eclipse.m2e</groupId>
			<artifactId>lifecycle-mapping</artifactId>
			<version>1.0.0</version>
			<configuration>
			   <lifecycleMappingMetadata>
				  <pluginExecutions>
				    <pluginExecution>
				      <pluginExecutionFilter>
				        <groupId>org.apache.maven.plugins</groupId>
				        <artifactId>maven-checkstyle-plugin</artifactId>
				        <versionRange>2.10</versionRange>
				        <goals>
				          <goal>checkstyle</goal>
				        </goals>
				      </pluginExecutionFilter>
				      <action>
				        <ignore />
				      </action>
				    </pluginExecution>
				    <pluginExecution>
				      <pluginExecutionFilter>
				        <groupId>com.mycila.maven-license-plugin</groupId>
				        <artifactId>maven-license-plugin</artifactId>
				        <versionRange>1.9.0</versionRange>
				        <goals>
				          <goal>check</goal>
				        </goals>
				      </pluginExecutionFilter>
				      <action>
				        <ignore />
				      </action>
				    </pluginExecution>
				    <pluginExecution>
				      <pluginExecutionFilter>
				        <groupId>org.codehaus.mojo</groupId>
				        <artifactId>aspectj-maven-plugin</artifactId>
				        <versionRange>1.4</versionRange>
				        <goals>
				          <goal>compile</goal>
				        </goals>
				      </pluginExecutionFilter>
				      <action>
				        <ignore />
				      </action>
				    </pluginExecution>
				  </pluginExecutions>
				</lifecycleMappingMetadata>
			</configuration>
		</plugin>


第二种方法:

参考: http://jasig.github.io/cas/4.0.x/installation/Maven-Overlay-Installation.html

下载maven 模板: https://github.com/UniconLabs/simple-cas4-overlay-template/archive/master.zip

导入eclipse,import - maven - existing maven projects,在pom.xml加入依赖,支持访问数据库验证密码:


<dependencies>
        <dependency>
            <groupId>org.jasig.cas</groupId>
            <artifactId>cas-server-webapp</artifactId>
            <version>${cas.version}</version>
            <type>war</type>
            <scope>runtime</scope>
        </dependency>
        
        <dependency>
			<groupId>org.jasig.cas</groupId>
			<artifactId>cas-server-core</artifactId>
			<version>${cas.version}</version>
		</dependency>
		<dependency>
			<groupId>org.jasig.cas</groupId>
			<artifactId>cas-server-support-jdbc</artifactId>
			<version>${cas.version}</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.35</version>
		</dependency>
		<dependency>
			<groupId>c3p0</groupId>
			<artifactId>c3p0</artifactId>
			<version>${c3p0.version}</version>
		</dependency>
		        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
	      <groupId>javax.validation</groupId>
	      <artifactId>validation-api</artifactId>
	      <version>${javax.validation.version}</version>
	      <scope>compile</scope>
	    </dependency>

    </dependencies>

    <properties>
        <cas.version>4.0.1</cas.version>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        
        <spring.version>3.2.6.RELEASE</spring.version>
        <javax.validation.version>1.0.0.GA</javax.validation.version>
        <c3p0.version>0.9.1.2</c3p0.version>
    </properties>



修改 deployerConfigContext.xml :

<bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">
        <constructor-arg>
            <map>
               
                <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
				<!--<entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" /> -->
				<entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver"/>
            </map>
        </constructor-arg>

        
        <property name="authenticationPolicy">
            <bean class="org.jasig.cas.authentication.AnyAuthenticationPolicy" />
        </property>
</bean>

<!-- 
    <bean id="primaryAuthenticationHandler"
          class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">
        <property name="users">
            <map>
                <entry key="casuser" value="Mellon"/>
            </map>
        </property>
    </bean>
	-->
	<bean id="dataSource"
	  class="com.mchange.v2.c3p0.ComboPooledDataSource"
	 p:driverClass="com.mysql.jdbc.Driver" p:jdbcUrl="jdbc:mysql://localhost:3306/portal_230?useUnicode=true&characterEncoding=UTF8&noAccessToProcedureBodies=true&autoReconnect=true&zeroDateTimeBehavior=convertToNull"
	  p:user="root"
	  p:password="root" />

    <!-- 密码加密方式-->
	<bean id="passwordEncoder"
      class="com.my.cas.authentication.handler.SelfPasswordEncoder"
      c:encodingAlgorithm="SHA1"
      p:characterEncoding="UTF-8" />

	<bean id="dbAuthHandler"
      class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"
      p:dataSource-ref="dataSource"
      p:sql="select password from test_user where username=? "
      p:passwordEncoder-ref="passwordEncoder"
	  />


其中的

com.my.cas.authentication.handler.SelfPasswordEncoder

为自定义的密码加密类,实现接口 

org.jasig.cas.authentication.handler.PasswordEncoder


5. 客户端

引入依赖

<dependency>  
		    <groupId>org.jasig.cas.client</groupId>  
		    <artifactId>cas-client-core</artifactId>  
		    <version>3.2.1</version>  
		</dependency>


在web.xml加入filter

<!-- ======================== 单点登录开始 ======================== -->  
    <!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->  
    <listener>  
        <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>  
    </listener>  
  
    <!-- 该过滤器用于实现单点登出功能,可选配置。 -->  
    <filter>  
        <filter-name>CAS Single Sign Out Filter</filter-name>  
        <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>  
    </filter>  
    <filter-mapping>  
        <filter-name>CAS Single Sign Out Filter</filter-name>  
        <url-pattern>/*</url-pattern>  
    </filter-mapping>  
  
    <!-- 该过滤器负责用户的认证工作,必须启用它 -->  
    <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>https://sso.cas.com:8443/cas/login</param-value>  
            <!--这里的server是服务端的IP -->  
        </init-param>  
        <init-param>  
            <param-name>serverName</param-name>  
            <param-value>http://localhost:8080</param-value><span style="color:#FF0000;"> ①</span>  
        </init-param>  
    </filter>  
    <filter-mapping>  
        <filter-name>CASFilter</filter-name>  
        <url-pattern>/*</url-pattern>  
    </filter-mapping>  
  
    <!-- 该过滤器负责对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>https://sso.cas.com:8443/cas</param-value>  
        </init-param>  
        <init-param>  
            <param-name>serverName</param-name>  
            <param-value>http://localhost:8080</param-value>  <span style="color:#FF0000;">②</span>  
        </init-param>  
    </filter>  
    <filter-mapping>  
        <filter-name>CAS Validation Filter</filter-name>  
        <url-pattern>/*</url-pattern>  
    </filter-mapping>  
  
    <!-- 该过滤器负责实现HttpServletRequest请求的包裹, 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->  
    <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>  
  
    <!-- 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。 比如AssertionHolder.getAssertion().getPrincipal().getName()。 -->  
    <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>  
  
    <!-- ======================== 单点登录结束 ======================== -->  

写一个controller测试

@Controller
public class TestController {
	@RequestMapping("/test")
	public void test(HttpServletRequest request,
			HttpServletResponse response) throws IOException{
		String username = AssertionHolder.getAssertion().getPrincipal().getName();

		response.getWriter().print("hello, " + username );
		
	}
}

通过 
AssertionHolder.getAssertion().getPrincipal().getName()
 获取用户名

6. 登录成功后返回更多用户信息

cas4.0 没有了 UsernamePasswordCredentialsToPrincipalResolver,而是提供了 org.jasig.cas.authentication.principal.PersonDirectoryPrincipalResolver,需要配置 attributeRepository 属性

    <bean id="primaryPrincipalResolver"
          class="org.jasig.cas.authentication.principal.PersonDirectoryPrincipalResolver" >
        <property name="attributeRepository" ref="attributeRepository" />
    </bean>

<bean id="attributeRepository"  class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao" >
        <constructor-arg index="0" ref="dataSource"/>
        <constructor-arg index="1" value="select * from test_user where {0}"/>
        <property name="queryAttributeMapping">
            <map>
<!--                 // 这里的key需写username,value对应数据库用户名字段 -->
                <entry key="username" value="username"/>  
            </map>
        </property>
        <property name="resultAttributeMapping">
            <map>
                <entry key="id" value="id"/>
                <entry key="password" value="password"/>
                <entry key="mobile" value="mobile"/>
                <entry key="email" value="email"/>
            </map>
        </property>
    </bean>

然后将 RegexRegisteredService 的配置改为

<bean class="org.jasig.cas.services.RegexRegisteredService">
            <property name="id" value="1" />
            <property name="name" value="HTTP and IMAP on example.com" />
            <property name="description" value="Allows HTTP(S) and IMAP(S) protocols on example.com" />
            <property name="serviceId" value="^(https?|imaps?)://.*" />
            <property name="evaluationOrder" value="0" />
<!--             <property name="attributeFilter"> -->
<!--               <bean class="org.jasig.cas.services.support.RegisteredServiceRegexAttributeFilter" c:regex="^\w{3}$" />  -->
<!--             </property> -->
<!--             // 客户端需要使用的对象的属性名称 -->
            <property name="allowedAttributes"> 
                                <list>
                                        <value>id</value>
                                        <value>email</value>
                                        <value>mobile</value>
                                </list>
            </property>
        </bean>

最后,修改 WEB-INF\view\jsp\protocol\2.0\casServiceValidationSuccess.jsp,加入

		<c:if test="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes) > 0}">
            <cas:attributes>
                <c:forEach var="attr" items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}">
                    <cas:${fn:escapeXml(attr.key)}>${fn:escapeXml(attr.value)}</cas:${fn:escapeXml(attr.key)}>
                </c:forEach>
            </cas:attributes>
        </c:if>

客户端改为

@Controller
public class TestController {
	@RequestMapping("/test")
	public void test(HttpServletRequest request,
			HttpServletResponse response) throws IOException{
		String username = AssertionHolder.getAssertion().getPrincipal().getName();
		AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();
		Map<String, Object> attributes = principal.getAttributes();
		String email= (String)attributes.get("email");
		response.getWriter().print("hello, " + username + " . email:" + email);
		
	}
}


搞定!


参考:

http://zxs19861202.iteye.com/blog/890965

http://blog.csdn.net/small_love/article/details/6664831

http://jasig.github.io/cas/4.0.x/installation/Maven-Overlay-Installation.html


  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 要在Apereo CAS 5.2.3服务器端进行增量开发自定义登录页面、添加验证码、注册和修改功能,可以按照以下步骤进行操作: 1. 下载并安装Apereo CAS 5.2.3服务器端,确保服务器环境和依赖项已正确配置。 2. 创建自定义登录页:在CAS服务器的webapp目录中创建一个新的文件夹,例如customlogin,然后在该文件夹中创建一个HTML文件,可以命名为login.html。在该文件中编写自定义的登录页面,包括用户名和密码输入框和提交按钮等。 3. 更新CAS配置文件:在CAS服务器的/etc/cas目录下找到配置文件cas.properties,找到并修改以下两个属性: cas.login.viewResolver.basename=/customlogin cas.login.viewResolver.suffix=.html 将上述两行配置添加到配置文件中,并设置自定义登录页路径的前缀和后缀。 4. 添加验证码功能:可以使用各种验证码库,如Kaptcha或Google的reCAPTCHA来实现验证码功能。将所选库的相关文件和配置添加到CAS服务器的相应目录中。然后,将验证码相关的代码添加到自定义登录页面中,例如在登录表单中添加一个验证码输入框。 5. 实现注册和修改功能:首先,在CAS服务器的webapp目录中创建一个新的文件夹,例如user,用于处理注册和修改相关的请求。然后,创建相应的HTML文件用于显示注册和修改表单,以及处理相关请求的后端代码。 6. 更新CAS配置文件:在cas.properties中添加以下配置cas.logout.success.url=/user/logout.html 这将重定向用户到自定义的登出页面。 7. 编写后端代码:在新创建的user目录中编写处理注册和修改相关请求的后端代码,包括验证表单数据和将数据保存到数据库等操作。 8. 部署和测试:将CAS服务器重新启动,并使用浏览器访问自定义的登录页面,尝试登录、注册和修改等操作,确保功能正常运行。 请注意,上述步骤仅提供了一个概述,并且可能需要根据具体需求进行适当的修改和调整。此外,CAS的版本升级可能会对上述步骤产生影响,因此建议在实施前先了解相关的CAS文档和社区讨论。 ### 回答2: 首先,在Apereo CAS 5.2.3服务器端进行增量开发时,需要了解CAS的整体架构和登录流程。CAS使用Spring Security作为身份验证和授权框架,因此我们可以通过自定义Spring Security的配置来实现自定义登录页、增加验证码、注册和修改功能。 1. 自定义登录页: 创建一个自定义的登录页,可以通过使用CAS的主题功能来实现。CAS的主题功能允许我们定义自己的视图和控制器。可以在CAS配置文件中进行如下配置: ```properties cas.viewResolver.viewNames[0]=custom_login_view cas.viewResolver.​custom_login_view​=classpath:/templates/custom_login_view.html ``` 在该配置中,我们将自定义的登录页命名为`custom_login_view`,并将其路径设置为`classpath:/templates/custom_login_view.html`。 2. 增加验证码: 为了增加验证码功能,我们可以使用Spring Security的表单登录配置。可以在CAS配置文件中添加如下配置: ```properties cas.authn.​attributeRepository​[0]=org.apereo.cas.authentication.attribute.DefaultAttributeDefinitionStore cas.authn.​attributeRepository​[0].attributes​=attributeName:value ``` 在该配置中,我们可以将自定义的属性添加到登录表单中,例如`attributeName`和`value`。 3. 注册功能: 如果想要在CAS中添加注册功能,可以使用自定义的服务注册表来实现。可以创建自定义的注册控制器和视图,并在CAS配置文件中进行如下配置: ```properties cas.viewResolver.viewNames[0]=custom_register_view cas.viewResolver.​custom_register_view​=classpath:/templates/custom_register_view.html ``` 在自定义的注册视图中,可以添加表单输入字段以收集用户注册信息。然后可以在自定义的注册控制器中处理该表单的提交,将用户信息存储到数据库或其他持久化层。 4. 修改功能: 要实现修改功能,可以使用CAS提供的扩展点和API来自定义修改逻辑。可以创建自定义的修改控制器和视图,并在CAS配置文件中进行如下配置: ```properties cas.viewResolver.viewNames[0]=custom_modify_view cas.viewResolver.​custom_modify_view​=classpath:/templates/custom_modify_view.html ``` 在自定义的修改视图中,可以添加表单输入字段以收集用户修改信息。然后可以在自定义的修改控制器中处理该表单的提交,更新用户信息。 通过以上步骤,可以在Apereo CAS 5.2.3服务器端实现自定义登录页、增加验证码、注册和修改功能。需要注意的是,以上示例仅提供了一种实现方式,具体的实现方式可能因项目需求和环境而有所不同。 ### 回答3: 首先,为了进行apereo CAS 5.2.3 server的增量开发,我们需要确保已经成功安装了CAS server并进行了基本配置。接下来,我们将手把手教你如何自定义登录页,增加验证码以及实现注册和修改功能。 1. 自定义登录页: - 在CAS server的配置文件中,找到`cas.properties`文件,并将其复制到`/etc/cas/config/`目录中。 - 打开复制后的`cas.properties`文件,找到`cas.viewResolver`属性并设置为`default`。 - 在`/etc/cas/config/views/`目录下创建自定义登录页的模板文件,例如`login.jsp`。 - 在`login.jsp`中进行自定义设计,并保存文件。 - 在CAS server的`WebContent`目录下找到`WEB-INF/web.xml`文件,并将其中的`welcome-file`设置为`login.jsp`。 - 重新启动CAS server,自定义登录页将会生效。 2. 增加验证码: - 在CAS server的配置文件中,找到`application.properties`文件,并将其复制到`/etc/cas/config/`目录中。 - 打开复制后的`application.properties`文件,找到验证码相关的属性,并进行相应的配置,例如启用验证码、验证码长度,以及验证码的字体、颜色等。 - 在CAS server的`WebContent`目录下找到`WEB-INF/web.xml`文件,添加验证码相关的过滤器配置。 - 在自定义登录页的表单中,添加一个验证码输入框,并在表单提交时进行验证码的验证。 - 重新启动CAS server,验证码将会在登录时显示并进行验证。 3. 实现注册和修改功能: - 在CAS server中创建一个自定义的注册和修改模块,可以基于现有的模块进行扩展或自行开发。 - 在CAS server的配置文件中,找到`cas.properties`文件,并将其复制到`/etc/cas/config/`目录中。 - 打开复制后的`cas.properties`文件,找到`cas.authn.accept.users`属性并添加一个用于注册和修改的用户类型。 - 在注册和修改模块中,实现相应的业务逻辑,例如验证用户输入、更新用户信息等。 - 在自定义登录页中添加注册和修改的链接,并配置相应的路径。 - 重新启动CAS server,注册和修改功能将会生效。 以上就是手把手教你如何在apereo CAS 5.2.3 server上进行增量开发,包括自定义登录页、增加验证码以及实现注册和修改功能的步骤。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值