我遇到年龄类问题用方程求解了,求解

在CAS架设中遇到的有关问题和小弟我的解决方案 - 编程当前位置:& &&&在CAS架设中遇到的有关问题和小弟我的解决方案在CAS架设中遇到的有关问题和小弟我的解决方案&&网友分享于:&&浏览:16次在CAS架设中遇到的问题和我的解决方案
工作需要,对CAS进行了研究,网络上看了些文章,但都不完善,自己就写了一篇。我在CAS部署过程中遇到了几个问题,主要是中文乱码的问题,毕竟是外国人写的东西。对中文的支持不好。相关的jar包可以在www.apache.org& www.jasig.org& www.springsource.org上找到。在CAS架设中遇到的问题和我的解决方案1.在CAS服务端用户登入如果是中文请求会乱码的问题解决方案:CAS利用到spring,spring框架中提供了编码过滤功能,利用它可以解决请求乱码问题2.CAS客户端和服务端中文传输乱码问题,虽然请求乱码问题解决了,但是这个问题还是会存在,可能是数据传输过程中引起的解决方案:BASE64服务端加密,客户端解密(O(∩_∩)O~偶突发奇想来的)3.中心同一个服务器,机房和办公室访问地址不同的问题(有的网站一个服务器有多个域名)解决方案:重写CAS客户端CASFilter类,请注意,我们中心的CAS客户端和CAS服务端在同一服务器上的,我是针对这环境下写的CAS架设环境WindowsTomcat 6.xJDK 1.6CAS server 3.34cas-client-2.0.11(是耶鲁大学的那个版本,不是最新版,最新不一定最好,下载时请注意)配置CAS服务端部署cas-server下载最新的cas-server-3.3.4.zip 服务器端,解压后找到cas-server-webapp.war,将这个war进行解压到tomcat的webapps目录下.将刚才解压出的目录cas-server-webapp进行重命名为cas启动tomcat 输入http://localhost:8080/cas/login 查看是否成功部署下载地址: http://www.jasig.org/推荐环境:JDK1.6 tomcat 6.0配置数据源和身份验证用户的认证信息通常保存在数据库中,我们这里使用的是jtds数据库连接。将前面下载的cas-server-3.3.4.zip 包解开后,在 modules 目录下可以找到包cas-server-support-jdbc-3.3.4.jar,再下载个jtds的jar包,将两个包拷贝到cas\WEB-INF\lib目录下DataStore 依赖于 spring.jar, commons-collections.jar, commons-dbcp.jar, commons-pool.jar在apache和spring官方网找到这四个包把它们拷贝到cas\WEB-INF\lib下在 cas-server-support-jdbc-3.3.4.jar包中,提供了 3 个基于 JDBC 的 AuthenticationHandler,分别为 BindModeSearchDatabaseAuthenticationHandler, QueryDatabaseAuthenticationHandler, SearchModeSearchDatabaseAuthenticationHandler我们这里使用的是QueryDatabaseAuthenticationHandler,它是通过配置一个 SQL 语句查出密码,与所给密码匹配根据密码加密方式的不同,我们需要实现PasswordEncoder接口,来对输入的密码进行加密才能与数据库中的密码比较 建立一个项目,导入cas-server-core-3.3.4.jar包在项目中写个类实现org.jasig.cas.authentication.handler.PasswordEncoder接口中的public String encode(String arg0)方法,这是用来输入的密码加密的。项目导出成jar包,拷贝到cas\WEB-INF\lib下
根据不同的密码加密方式实现,我这里是MD5加密,下文仅为参考,请根据需求变化新建个caspasskey项目源码为 import java.security.MessageDimport java.security.NoSuchAlgorithmE import org.jasig.cas.authentication.handler.PasswordE public class MD5 implements PasswordEncoder { @Overridepublic String encode(String arg0) {MessageDigest digest =if (digest == null) {try { digest = MessageDigest.getInstance("MD5");} catch (NoSuchAlgorithmException nsae) { nsae.printStackTrace();}}// Now, compute hash.digest.update(arg0.getBytes());
byte[] bytes=digest.digest();StringBuffer buf = new StringBuffer(bytes.length * 2);for (int i= 0; i & bytes. i++) {if (((int) bytes[i] & 0xff) & 0x10) {buf.append("0");}buf.append(Long.toString((int) bytes[i] & 0xff, 16));}return buf.toString().toUpperCase();} } 导出为caspasskey.jar,拷贝到cas/WEB-INF/lib目录下
打开文件cas/WEB-INF/deployerConfigContext.xml,找到&beanclass="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" /&将它替换为&bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"&
&property name="dataSource" ref="casDataSource" /& & &property name="sql"&&&&&&&& &&&&& value="select 密码 from 用户表 where lower([用户名]) = UPPER(?)" /&& &&&&& &property& name="passwordEncoder"& ref="myPasswordEncoder"/&&/bean& & &bean id="myPasswordEncoder"&&& class="org.MD5"/&& ---org.MD5这是我上文自定义的加密类
找到&bean id="serviceRegistryDao" class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl" /&在它的下方添加以下数据源代码&bean id="casDataSource" class="mons.dbcp.BasicDataSource"&&&&& &property name="driverClassName"&&&&&&&& &value&net.sourceforge.jtds.jdbc.Driver&/value& & &/property&&&& &&&&&& &property name="url"& &value&jdbc:jtds:sqlserver://数据库地址:1433/数据库名&/value&&&&&&&&& &/property&&&&& &property name="username"& &&&&&&&&& &value&数据库访问用户名&/value&&&&& &/property&&& &&&&&&&&&&& &property name="password"&&&&&&&&&&&&&& &value&数据库访问密码&/value&&&&&&&&&&&&&& &/property&&&&&&&&&&&&&& &/bean& 到此,数据库与cas服务端的连接已完成,登入http://localhost:8080/cas/login,用英文的用户名测试登入是否成功! CAS服务端提交表单utf-8中文乱码解决方案中文的用户名登入,默认情况下是乱码的,因为cas没有对请求进行utf-8编码cas用到了spring的框架,我们可以直接利用spring的编码器进行utf-8编码在web.xml中添加&filter&&filter-name&encodingFilter&/filter-name&&filter-class&org.springframework.web.filter.CharacterEncodingFilter&/filter-class&&init-param&&param-name&encoding&/param-name&&param-value&utf-8&/param-value&&/init-param&&/filter&&filter-mapping&&filter-name&encodingFilter&/filter-name&&url-pattern&/*&/url-pattern&&/filter-mapping& 需要注意的是,此配置需要在 &filter-mapping&&filter-name&CAS Client Info Logging Filter&/filter-name&&url-pattern&/*&/url-pattern&&/filter-mapping&的上方 再测试,发现中文可以登入了。 中文用户名客户端乱码解决方案因为cas默认对中文是不支持的,在cas服务端与客户端之间,如果有中文存在,会有中文乱码的问题,虽然上文对请求进行了编码,但是客户端中文乱码的问题始终存在。为了避免中文乱码的存在,我的临时解决方案是在服务器端对中文进行base64加密,在客户端进行base64解密 找到org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver类的源代码,这个类在cas-server-core-3.3.4.jar包中找到 protected String extractPrincipalId(final Credentials credentials)方法,将return usernamePasswordCredentials.getUsername();改为return (new sun.misc.BASE64Encoder()).encode(usernamePasswordCredentials.getUsername().getBytes()); 这样就可以在服务器端对所有用户名进行base64加密了服务器端配置到此结束Tomcat SSL安全验证如果要实现CAS的单点登入,这是必须的 1. 生产密钥点击’开始’à’运行’,输入cmd进入控制台? CD& X:\jdk根目录\Java\jdk1.6.0_14\bin? CD X:? 下文中导入过程密码统一使用changeitkeytool -genkey -alias cas-server -keyalg RSA -keypass changeit -storepass changeit -keystore casserver.keystore输入密码后,在第一个提示输入姓名的时候,输入你的服务端地址或ip地址,如localhost国家输入CNkeytool -export -alias cas-server& -storepass changeit -file casserver.cer -keystore& casserver.keystore
keytool -import -trustcacerts -alias server -file casserver.cer –keystore jre根目录/lib/security/cacerts -storepass changeit
如果操作成功,会在jdk bin目录下看到casserver.cer& casserver.keystore 这两个文件打开tomcat目录下conf/ server.xml 文件,找到&Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"&&&&&&&&&&&&&& maxThreads="150" scheme="https" secure="true"&&&&&&&&&&&&&& clientAuth="false" sslProtocol="TLS" /&将注释去掉,修改为&Connector port="8443" protocol="HTTP/1.1"& SSLEnabled="true"&&&&&&&&&&&&&& maxHttpHeaderSize="8192"maxThreads="150" minSpareThreads="25" maxSpareThreads="75"enableLookups="false" disableUploadTimeout="true"acceptCount="100" scheme="https" secure="false"clientAuth="false" sslProtocol="TLS"keystoreFile=" x:\casserver.keystore 所在的目录\casserver.keystore" keystorePass="changeit"/& 默认的密钥有效期是3个月,可以根据自己需求修改访问https://localhost:8443/cas/login 测试是否部署成功 CAS客户端配置CAS客户端配置非常的简单,但这里需要进行些修改以下是官方文档中客户端web.xml中配置&filter&&filter-name&CAS Filter&/filter-name&&filter-class&edu.yale.its.tp.cas.client.filter.CASFilter&/filter-class&&init-param&&param-name&edu.yale.its.tp.cas.client.filter.loginUrl&/param-name&&param-value&https://compA:8443/cas/login&/param-value&&!—compA是cas服务器的地址à&/init-param&&init-param&&param-name&edu.yale.its.tp.cas.client.filter.validateUrl&/param-name&&param-value&https://compA:8443/cas/serviceValidate&/param-value&&/init-param&&init-param&&param-name&edu.yale.its.tp.cas.client.filter.serverName&/param-name&&param-value&compA:8080&/param-value&&!—注意,这里compA是cas客户端的地址à&/init-param&&/filter& &filter-mapping&&filter-name&CAS Filter&/filter-name&&!—对访问/servlet/HelloWorldExample 进行拦截,转向cas服务器端验证à&url-pattern&/servlet/HelloWorldExample&/url-pattern&&/filter-mapping& 因为我们中心的网络环境原因,机房和办公室访问同一台服务器的地址是不同的,所以需要对CASFilter类的源代码进行更改。注意,此设置修改仅对于CAS客户端和cas服务端在同一服务器时下载cas-client-2.0.11.zip解压导入源码,修改edu.yale.its.tp.cas.client.filter.CASFilter类注意:不要太高版本,2.0x是耶鲁的版本,高版本是jasig的,实现的步骤全都变了. 1. 声明两个属性private String casclientport,2. 在init方法中添加casclientport = config.getInitParameter(&&&&&&&&&&&&&&& "edu.yale.its.tp.cas.client.filter.port");casserverport = config.getInitParameter(&&& "edu.yale.its.tp.cas.server.filter.port");这是我自定义的,用来在xml中指定自定义的端口号3. 在doFilter方法中添加&&& casLogin="https://"+request.getServerName()+":"+casserverport+"/cas/login";//cas服务器的登入地址 request.getServerName()是可以根据客户访问的服务器端地址不同而变化的casServerName=request.getServerName()+":"+//注意,这是cas客户端的地址&&& casValidate="https://"+request.getServerName()+":"+casserverport+"/cas/serviceValidate";//cas服务器的验证地址 修改客户端web.xml&!-- CAS& --& &filter&&filter-name&CAS Filter&/filter-name&&filter-class&edu.yale.its.tp.cas.client.filter.CASFilter&/filter-class&&init-param&&param-name&edu.yale.its.tp.cas.client.filter.loginUrl&/param-name&&param-value&/cas/login&/param-value&&!-- 默认无需修改 --&&/init-param&&init-param& &param-name&edu.yale.its.tp.cas.client.filter.validateUrl&/param-name&&param-value&/cas/serviceValidate&/param-value&&!-- 默认无需修改 --&&/init-param&&init-param& &param-name&edu.yale.its.tp.cas.client.filter.port&/param-name&&param-value&8080&/param-value&&!-- 对应客户端端口号 --&&/init-param&&init-param& &param-name&edu.yale.its.tp.cas.server.filter.port&/param-name&&param-value&8443&/param-value&&!-- 对应服务器端口号 因为是ssl安全连接,所以是8443--&&/init-param&&init-param&&param-name&edu.yale.its.tp.cas.client.filter.serverName&/param-name&&param-value&localhost:8080&/param-value&&!-- 这是服务器端验证后访问客户端的地址--&&/init-param& &/filter&&!-- 对访问/xxxxx的都进行拦截,并转向cas服务器,进行登入验证 --&&filter-mapping&&filter-name&CAS Filter&/filter-name&&url-pattern&/xxxxx&/url-pattern&&/filter-mapping&&!-- CAS end& --&因为我们上文对中文在服务器端进行了base64加密,在客户端,就需要进行解密还是对CASFilter类进行修改在读doFilter方法中找到以下语句&&&&&&& if (session != null) // probably unncessary&&&&&&&&&&& session.setAttribute(CAS_FILTER_USER, user);将它修改为&&&&& if (session != null) // probably unncessary&&&&&&& {&&&&&&&&&&& session.setAttribute(CAS_FILTER_USER,& new String((new BASE64Decoder()).decodeBuffer(user)));&&&&&&& }这就是对base64加密的数据进行解密后再存放进客户端的session。到此客户端存在的问题就解决了测试在一个客户端已http://localhost:8080/客户端名/xxxxxCAS权限认证我的方案 1. 我的理解是CAS主要解决用户登入的问题,权限上还是由各应用系统来分配的,用户在访问受限的页面时,通过过滤器判断CAS是否已登入过了,并且在客户端附加过了相关权限。l 如果用户未登入过,则登入CAS服务端进行用户登入,登入后返回客户端,再根据用户名附加权限l 如果用户cas服务端已登入过了,但是他是第一次登入客户端,则进入CAS服务端,获取登入的用户名,再返回客户端进行根据用户名附加权限l 如果用户已登入了CAS并且附加了权限,则不在进入CAS服务端验证& 全文到此结束,谢谢!/p-.html
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有用故事填空:有时我们遇到问题百思不得其解,突然有了灵感,这真是“------,-------"呀!
厚渺酥2337
有时我们遇到问题百思不得其解,突然有了灵感,这真是“-踏破铁鞋无觅处-----,-得来全不费工夫------"呀!
为您推荐:
其他类似问题
山穷水尽疑无路,柳暗花明又一村。
扫描下载二维码

我要回帖

更多关于 规划求解遇到错误值 的文章

 

随机推荐