LDAP中怎么jq怎么获取自定义属性性

月热门文章
&&&&&&&&OAuth2.0是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储用户信息,而无需将用户名和密码提供给第三方应用,CAS3.5.x(x&1)提供了OAuth2.0的支持,包括客户端和服务端,依赖cas-server-support-oauth.jar包。CAS默认提供了三个服务:/oauth2.0/authorize需要输入GET参数:client_id和redirect_uri/oauth2.0/accessToken需要输入GET参数:client_id,redirect_uri,client_secret和代码/oauth2.0/profile需要输入GET参数:access_token关于CAS3.5.x Server版本接入oauth2.0 Server配置步骤,下面为本站素文宅大家分享一下个人总结,仅供大家参考学习使用。1、将cas-server-support-oauth工程引入cas-server-webapp项目中,通过pom.xml文件,增加内容如下:&dependency&
&groupId&org.jasig.cas&/groupId&
&artifactId&cas-server-support-oauth&/artifactId&
&version&${project.version}&/version&
&/dependency&2、配置应用获得client_id和client_secret在QQ、新浪等使用第三方登录中,通常提供页面供用户申请应用,然后提供用户client_id和client_secret,并允许用户配置回调地址,那么oauth2.0 server考虑的就是需要持久化这些配置,CAS默认在文件deployerConfigContext.xml的serviceRegistryDao中配置应用服务,注意实际使用可以将申请的应用信息存储在数据库中,具体配置如下:&bean
id=&serviceRegistryDao&
&&&&&&&&class=&org.jasig.cas.services.InMemoryServiceRegistryDaoImpl&&
&&&&&&&&&&&&&property&name=&registeredServices&&
&&&&&&&&&&&&&&&&&list&
&&&&&&&&&&&&&&&&&&&&&bean&class=&org.jasig.cas.services.RegexRegisteredService&&
&&&&&&&&&&&&&&&&&&&&&&&&&property&name=&id&&value=&0&&/&
&&&&&&&&&&&&&&&&&&&&&&&&&property&name=&name&&value=&HTTP&and&IMAP&&/&
&&&&&&&&&&&&&&&&&&&&&&&&&property&name=&description&&value=&Allows&HTTP(S)&and&IMAP(S)&protocols&&/&
&&&&&&&&&&&&&&&&&&&&&&&&&property&name=&serviceId&&value=&^(https?|imaps?)://.*&&/&
&&&&&&&&&&&&&&&&&&&&&&&&&property&name=&evaluationOrder&&value=&&&/&
&!--&参数回传&--&
&&&&&&&&&&&&&&&&&&&&&&&&&property&name=&ignoreAttributes&&value=&true&/&
&&&&&&&&&&&&&&&&&&&&&/bean&
&&&&&&&&&&&&&&&&&&&&&bean&class=&org.jasig.cas.services.RegisteredServiceImpl&&
&&&&&&&&&&&&&&&&&&&&&property&name=&id&&value=&1&&/&
&&&&&&&&&&&&&&&&&&&&&property&name=&name&&value=&HTTP&&/&
&&&&&&&&&&&&&&&&&&&&&property&name=&description&&value=&oauth&wrapper&callback&url&&/&&!--&oauth&wrapper&callback&url&--&
&&&&&&&&&&&&&&&&&&&&&property&name=&serviceId&&value=&${server.prefix}/oauth2.0/callbackAuthorize&&/&
&&&&&&&&&&&&&&&&&/bean&
&&&&&&&&&&&&&&&&bean&class=&org.jasig.cas.services.RegisteredServiceImpl&&
&&&&&&&&&&&&&&&&&property&name=&id&&value=&2&&/&
&&&&&&&&&&&&&&&&&property&name=&name&&value=&key&&/&
&&&&&&&&&&&&&&&&&property&name=&description&&value=&secret&&/&
&&&&&&&&&&&&&&&&&property&name=&serviceId&&value=&/&&/&
&&&&&&&&&&&&&&&&&property&name=&theme&&value=&Yoodb&&/&
&&&&&&&&&&&&&&&/bean&
&&&&&&&&&&&&&&&&&/list&
&&&&&&&&&&&&&/property&
&&&&&&&&&/bean&如上述代码所示,新注册了两个bean,第一个bean不需要考虑那是默认存在的bean,如果想了解参考地址:bean /article/display/1223,我们新增的第二个bean中,name为client_id,description为client_secret,serviceId为回调地址,theme为应用名称,下面为大家说说第一个bean的用法及其用途。3、 Oauth client构造url获得authorization_code(ST票据)1)cas server对/oauth2.0/authorize的url进行拦截处理,需要配置映射,在web.xml中增加配置信息如下:&servlet-mapping&& & &servlet-name&cas&/servlet-name&& & &url-pattern&/oauth2.0/*&/url-pattern&&/servlet-mapping&2)在cas-servlet.xml配置文件,增加内容如下:&bean
&&&&&&id=&handlerMappingC&
&&&&&&class=&org.springframework.web.servlet.handler.SimpleUrlHandlerMapping&&
&&&&&property&name=&mappings&&
&&&&&&&props&
&prop&key=&/oauth2.0/*&&oauth20WrapperController&/prop&
&bean&id=&oauth20WrapperController&
&&&&class=&org.jasig.cas.support.oauth.web.OAuth20WrapperController&
&&&&p:loginUrl=&${server.prefix}/login&&p:servicesManager-ref=&servicesManager&
&&&&p:ticketRegistry-ref=&ticketRegistry&&p:timeout=&7200&&/&配置完成后,我们获取授权码的链接会转向login页面,此时的service地址就是第二步时新增的bean配置的第一个bean的serviceId,通过这个默认提供的地址间接的获取到ST票据,具体请求如下:CAS Server在浏览器中打开地址:http://localhost:8080/cas/oauth2.0/authorize?client_id=key&redirect_uri=/&response_type=codea将会跳转到地址:http://localhost:8080/cas/login?service=http%3A%2F%2F127.0.0.1%3A8080%2Fcas%2Foauth2.0%2FcallbackAuthorize,从而间接的获取到ST票据。认证成功之后,就会携带值为ST票据的参数跳转到callbackAuthorize页面,此时生成的ST即为授权码,其中回调地址、服务名称是通过session传递过来的,注意到浏览器地址变为如下:http://localhost:8080/cas/oauth2.0/callbackAuthorize?ticket=ST-5-u53bEqNQz2phBhnocFsb-默认授权码只能使用一次且有效时间为10s,可以参考/article/display/1225文章,通过修改票据过期策略进行配置时间。4、通过ST票据授权码获得access_token在浏览器中输入如下地址:http://localhost:8080/cas/oauth2.0/accessToken?client_id=key&client_secret=secret&
grant_type=authorization_code&redirect_uri=/&code=ST-3-KIxamZyWgOYFcoXggdfs-返回access_token信息如下:access_token=TGT-6-csg7B16Pc09aZ6bx9j3Y6INMzScyZFhZcOGEqpnBUvoiLJkv93-&expires=71935、根据access_token获取用户信息在浏览器中输入如下地址:http://localhost:8080/cas/oauth2.0/cas/oauth2.0/profile?access_token=TGT-4-bxgrfir4tdCJ2O1EbR6eeguc3tcdpToZeyFBv416vdvvH1g3Nk-根据access_token等到的返回用户信息如下:{
&&&&&id&:&&000001&,
&&&&&attributes&:&[
&&&&&&&&&&&&&uid&:&&000001&
&&&&&&&&},
&&&&&&&&&&&&&username&:&&mrwang&
&&&&&&&&},
&&&&&&&&&&&&&password&:&&123456&
}通过上述描述CAS3.5.x Server认证成功之后生成ST,此值即为授权码,传递给应用的回调地址即可,OAuth2的实现并不是很标准,对于CAS3.5.x Server版本需要扩展org.jasig.cas.support.oauth.web.OAuth20WrapperController类来进一步完善oauth2.0协议。
&&&&&&&&LDAP全称是Lightweight Directory Access Protocol,LDAP是一个目录服务器,在客户端可以使用同样的协议、客户端连接软件包以及查询命令与LDAP服务器进行交互LDAP目录是树形结构,目录有条目组成。条目是具有区别名DN(Distinguished Name)的属性(Attribute)集合,条目相当于关系型数据库中的表,DN相当于表中的关键字(Primary Key),属性由类型(Type)和多个值(Values)组成。&&&&&&&&下面为本站素文宅大家分享一下如何使用Spring-LDAP进行封装对LDAP的操作,下载1.3.1版本,其中所需jar包包含有:spring-ldap-core-1.3.1.RELEASE.jar,spring-ldap-core-tiger-1.3.1.RELEASE.jar,commons-lang-2.5.jar,commons-logging-1.1.jar,log4j-1.2.15.jar以及Spring相关jar包等。配置LDAP数据源和LdapTemplate以及所需使用的bean,applicationContext.xml文件具体配置内容如下:&?xml&version=&1.0&&encoding=&UTF-8&?&
&beans&xmlns=&http://www.springframework.org/schema/beans&
&&&&&&&xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&
&&&&&&&xmlns:p=&http://www.springframework.org/schema/p&
&&&&&&&xmlns:tx=&http://www.springframework.org/schema/tx&
&&&&&&&xmlns:sec=&http://www.springframework.org/schema/security&
&&&&&&&xsi:schemaLocation=&http://www.springframework.org/schema/beans&http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
&&&&&&&http://www.springframework.org/schema/tx&http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
&&&&&&&http://www.springframework.org/schema/security&http://www.springframework.org/schema/security/spring-security-3.1.xsd&&
&&&&&!--&配置数据源&--&
&&&&&bean&id=&contextSource&&
&&&&&&&&class=&org.springframework.ldap.core.support.LdapContextSource&&
&&&&&&&&&property&name=&url&&value=&ldap://127.0.0.1:1389&&/&
&&&&&&&&&property&name=&base&&value=&dc=users,dc=CMP&&/&
&&&&&&&&&property&name=&userDn&&value=&cn=manager&&/&
&&&&&&&&&property&name=&password&&value=&&&/&
&&&&&/bean&
&&&&&!--&配置LdapTemplate&--&
&&&&&bean&id=&ldapTemplate&&class=&org.springframework.ldap.core.LdapTemplate&&
&&&&&&&&&constructor-arg&ref=&contextSource&&/&
&&&&&/bean&
&&&&&!--&配置实体类&--&
&&&&&bean&id=&userDao&&class=&com.yoodb.dao.UserDao&&
&&&&&&&&&property&name=&ldapTemplate&&ref=&ldapTemplate&&/&
&&&&&/bean&
&/beans&为了方便数据传递新建实体对象User类,具体代码如下:package&com.yoodb.
&&&&public&class&User&{
&&&&private&String&
&&&&private&String&
&&&&public&String&getId()&{
&&&&&&&&return&
&&&&public&void&setId(String&id)&{
&&&&&&&&this.id&=&
&&&&public&String&getName()&{
&&&&&&&&return&
&&&&public&void&setName(String&name)&{
&&&&&&&&this.name&=&
&&&&@Override
&&&&public&String&toString()&{
&&&&&&&&return&&User&[id=&&+&id&+&&,&name=&&+&name&+&&]&;
}为了方便操作LDAP对LdapTemplate对象进行了封装,具体代码如下:package&com.yoodb.
import&java.util.C
import&java.util.HashM
import&java.util.L
import&java.util.M
import&javax.naming.NamingE
import&javax.naming.directory.A
import&javax.naming.directory.A
import&javax.naming.directory.BasicA
import&javax.naming.directory.BasicA
import&javax.naming.directory.DirC
import&javax.naming.directory.ModificationI
import&mons.logging.L
import&mons.logging.LogF
import&org.jasig.services.persondir.IPersonA
import&org.jasig.services.persondir.support.AttributeNamedPersonI
import&org.jasig.services.persondir.support.StubPersonAttributeD
import&org.springframework.ldap.core.AttributesM
import&org.springframework.ldap.core.LdapT
public&class&UserDao&{
protected&final&Log&logger&=&LogFactory.getLog(getClass());
private&LdapTemplate&ldapT
public&LdapTemplate&getLdapTemplate()&{
return&ldapT
public&void&setLdapTemplate(LdapTemplate&ldapTemplate)&{
this.ldapTemplate&=&ldapT
&*&@param&rdn
&*&@return
public&User&find(String&rdn)&{
&&&&&&&&return&(User)this.ldapTemplate.lookup(rdn,&new&AttributesMapper(){
&&&&&&&&&&&&public&Object&mapFromAttributes(Attributes&attributes)
&&&&&&&&&&&&&&&&&&&&throws&NamingException&{
&&&&&&&&&&&&&&&&User&user&=&new&User();
&&&&&&&&&&&&&&&&if(attributes!=null){
&&&&&&&&&&&&&&&&&&&&Attribute&idAttr&=&attributes.get(&uid&);
&&&&&&&&&&&&&&&&&&&&if(idAttr!=null){
&&&&&&&&&&&&&&&&&&&&&&&&user.setId((String)idAttr.get());
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&Attribute&nameAttr&=&attributes.get(&sn&);
&&&&&&&&&&&&&&&&&&&&if(nameAttr!=null){
&&&&&&&&&&&&&&&&&&&&&&&&user.setName((String)nameAttr.get());
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&return&
&&&&&&&&&&&&}
&&&&&&&&});
&*&@param&rdn
&*&@param&user
public&void&add(String&rdn,User&user){
&&&&&&&&Attributes&attrs&=&new&BasicAttributes();
&&&&&&&&Attribute&ocAttr&=&new&BasicAttribute(&objectClass&);
&&&&&&&&ocAttr.add(&top&);
&&&&&&&&ocAttr.add(&organizationalUnit&);
&&&&&&&&attrs.put(ocAttr);
&&&&&&&&Attribute&snAttr&=&new&BasicAttribute(&sn&);
&&&&&&&&snAttr.add(user.getName());
&&&&&&&&attrs.put(snAttr);
&&&&&&&&this.ldapTemplate.bind(rdn,&null,&attrs);
&*&@param&rdn
&&&&public&void&delete(String&rdn){
&&&&&&&&this.ldapTemplate.unbind(rdn);
&&&&&*&修改RDN
&&&&&*&@param&oldRDN
&&&&&*&@param&newRDN
&&&&public&void&modifyRDN(String&oldRDN,String&newRDN){
&&&&&&&&this.ldapTemplate.rename(oldRDN,&newRDN);
&*&@param&rdn
&*&@param&user
&&&&public&void&modfiyAttrs(String&rdn,User&user){
&&&&&&&&Attribute&attr&=&new&BasicAttribute(&sn&);
&&&&&&&&attr.add(user.getName());
&&&&&&&&ModificationItem&item&=&new&ModificationItem(DirContext.REPLACE_ATTRIBUTE,&attr);
&&&&&&&&this.ldapTemplate.modifyAttributes(rdn,&new&ModificationItem[]{item});
@SuppressWarnings(&unchecked&)
public&List&User&&search(String&rdn,String&fileter)&{
&&&&&&&&return&this.ldapTemplate.search(rdn,&fileter,&
&&&&&&&&&&&&&&&&new&AttributesMapper(){
&&&&&&&&&&&&&&&&&&&&public&Object&mapFromAttributes(Attributes&attributes)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&throws&NamingException&{
&&&&&&&&&&&&&&&&&&&&&&&&User&user&=&new&User();
&&&&&&&&&&&&&&&&&&&&&&&&if(attributes!=null){
&&&&&&&&&&&&&&&&&&&&&&&&&&&&Attribute&idAttr&=&attributes.get(&uid&);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&if(idAttr!=null){
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&user.setId((String)idAttr.get());
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&Attribute&nameAttr&=&attributes.get(&sn&);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&if(nameAttr!=null){
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&user.setName((String)nameAttr.get());
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&return&
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&});
}简单测试,具体代码如下:package&com.yoodb.
import&org.springframework.context.ApplicationC
import&org.springframework.context.support.ClassPathXmlApplicationC
public&class&LDAPTest&{
&*&@param&args
&&&public&static&void&main(String[]&args)&{
&&&&&&&ApplicationContext&ac=new&ClassPathXmlApplicationContext(&applicationContext.xml&);
&&&&&&&UserDao&userDao=(UserDao)ac.getBean(&userDao&);
&&&&&&&String&rdn&=&String.format(&uid=%s&,uid);
&&&&&&&User&userDao&=&find(rdn);//查询&&,其他方式相似测试已省略
&&&&&&&&CAS的核心就是Ticket中文称之为票据,以及在Ticket之上的一系列逻辑处理操作。CAS的主要包含票据有TGT、ST、PGT、PGTIOU、PT,其中TGT、ST是CAS1.0协议中就有的票据,PGT、PGTIOU、PT是CAS2.0协议中新增的的票据,目前CAS最新版本已经到了CAS4.0。cas分为服务端和客户端两部分组成,下简单说一说CAS认证过程:1)用户访问cas-client,被拦截跳转到cas-server进行登录,输入正确的用户信息2)登录成功后,cas-server签发一个TGC票据,写入浏览器同时生成一个TGT对象,放入自己的缓存,TGT对象的ID就是cookie的值,并再次跳转到cas-client,同时携带着ST票据cas-client发现有ST票据则拿着ST票据去cas-server验证,如果验证通过,则返回用户名信息3)cas-client登录成功,用户访问另一个cas-client2时,也会被拦截再次跳转到cas-server发现TGC票据生成的TGT对象的ID值存在则直接验证通过,签发一个ST票据给cas-client2。关于TGT和ST术语解释o &TGT(Ticket Grangting Ticket)&&&&&&&&TGT是CAS为用户签发的登录票据,拥有了TGT,用户就可以证明自己在CAS成功登录过。TGT封装了Cookie值以及此Cookie值对应的用户信息。用户在CAS认证成功后,CAS生成cookie(叫TGC),写入浏览器,同时生成一个TGT对象,放入自己的缓存,TGT对象的ID就是cookie的值。当HTTP再次请求到来时,如果传过来的有CAS生成的cookie,则CAS以此cookie值为key查询缓存中有无TGT ,如果有的话,则说明用户之前登录过,如果没有,则用户需要重新登录。o &ST(Service Ticket)&&&&&&&&ST是CAS为用户签发的访问某一service的票据。用户访问service时,service发现用户没有ST,则要求用户去CAS获取ST。用户向CAS发出获取ST的请求,如果用户的请求中包含cookie,则CAS会以此cookie值为key查询缓存中有无TGT,如果存在TGT,则用此TGT签发一个ST,返回给用户。用户凭借ST去访问service,service拿ST去CAS验证,验证通过后,允许用户访问资源。下面为大家说一说ST票据和TGT票据的过期策略,上述已经简单介绍ST票据和TGT票据的含义,这里就不做说明了,打开cas-server工程查找ticketExpirationPolicies.xml配置文件,配置具体内容如下:&?xml&version=&1.0&&encoding=&UTF-8&?&
&&&&Licensed&to&Jasig&under&one&or&more&contributor&license
&&&&agreements.&See&the&NOTICE&file&distributed&with&this&work
&&&&for&additional&information&regarding&copyright&ownership.
&&&&Jasig&licenses&this&file&to&you&under&the&Apache&License,
&&&&Version&2.0&(the&&License&);&you&may&not&use&this&file
&&&&except&in&compliance&with&the&License.&&You&may&obtain&a
&&&&copy&of&the&License&at&the&following&location:
&&&&&&http://www.apache.org/licenses/LICENSE-2.0
&&&&Unless&required&by&applicable&law&or&agreed&to&in&writing,
&&&&software&distributed&under&the&License&is&distributed&on&an
&&&&&AS&IS&&BASIS,&WITHOUT&WARRANTIES&OR&CONDITIONS&OF&ANY
&&&&KIND,&either&express&or&implied.&&See&the&License&for&the
&&&&specific&language&governing&permissions&and&limitations
&&&&under&the&License.
&beans&xmlns=&http://www.springframework.org/schema/beans&
&&&&&&&xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&
&&&&&&&xmlns:p=&http://www.springframework.org/schema/p&
&&&&&&&xmlns:c=&http://www.springframework.org/schema/c&&xmlns:util=&http://www.springframework.org/schema/util&
&&&&&&&xsi:schemaLocation=&http://www.springframework.org/schema/beans
&&&&&&&&&&&&&&&&&&&&&&&&&&&http://www.springframework.org/schema/beans/spring-beans.xsd
&&&&&&&&&&&&&&&&&&&&&&&&&&&http://www.springframework.org/schema/util
&&&&&&&&&&&&&&&&&&&&&&&&&&&http://www.springframework.org/schema/util/spring-util.xsd&&
&&&&&description&
&&&&&&&&Assignment&of&expiration&policies&for&the&different&tickets&generated&by&CAS&including&ticket&granting&ticket
&&&&&&&&(TGT),&service&ticket&(ST),&proxy&granting&ticket&(PGT),&and&proxy&ticket&(PT).
&&&&&&&&These&expiration&policies&determine&how&long&the&ticket&they&are&assigned&to&can&be&used&and&even&how&often&they
&&&&&&&&can&be&used&before&becoming&expired&/&invalid.
&&&&&/description&
&&&&&!--&Expiration&policies&--&
&&&&&util:constant&id=&SECONDS&&static-field=&java.util.concurrent.TimeUnit.SECONDS&/&
&&&&&bean&id=&serviceTicketExpirationPolicy&&class=&org.jasig.cas.ticket.support.MultiTimeUseOrTimeoutExpirationPolicy&
&&&&&&&&&&c:numberOfUses=&1&&c:timeToKill=&${st.timeToKillInSeconds:10}&&c:timeUnit-ref=&SECONDS&/&
&&&&&!--&TicketGrantingTicketExpirationPolicy:&Default&as&of&3.5&--&
&&&&&!--&Provides&both&idle&and&hard&timeouts,&for&instance&2&hour&sliding&window&with&an&8&hour&max&lifetime&--&
&&&&&bean&id=&grantingTicketExpirationPolicy&&class=&org.jasig.cas.ticket.support.TicketGrantingTicketExpirationPolicy&
&&&&&&&&&&p:maxTimeToLiveInSeconds=&${tgt.maxTimeToLiveInSeconds:28800}&
&&&&&&&&&&p:timeToKillInSeconds=&${tgt.timeToKillInSeconds:7200}&/&
&/beans&TGT票据过期配置,默认时间是两小时,当用户在2个小时(7200秒)之内不动移动鼠标或者进行系统超过8个小时(28800秒),则tgt过期,具体配置如下:&bean&id=&grantingTicketExpirationPolicy&&class=&org.jasig.cas.ticket.support.TicketGrantingTicketExpirationPolicy&
&&&&&&&&&&p:maxTimeToLiveInSeconds=&${tgt.maxTimeToLiveInSeconds:28800}&
&&&&&&&&&&p:timeToKillInSeconds=&${tgt.timeToKillInSeconds:7200}&/&
&/beans&ST票据过期配置,默认时间是10秒钟,使用次数为1 次或者超过10秒没有应用均会引起st过期,具体配置如下:&bean&id=&serviceTicketExpirationPolicy&&class=&org.jasig.cas.ticket.support.MultiTimeUseOrTimeoutExpirationPolicy&
&&&&&&&&&&c:numberOfUses=&1&&c:timeToKill=&${st.timeToKillInSeconds:10}&&c:timeUnit-ref=&SECONDS&/&
&&&&&&&&CAS3.5.2 Server提供了Restful API供调用,Restful是一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。开启Restful服务需要相关的jar包,CAS3.5.2 Server源码里cas-server-integration-restlet工程支持Restful模块,将其引入到cas-server-webapp工程中即可,下面本站素文宅为大家分享一下CAS3.5.2 Server如何集成RESTful API。
在cas-server-webapp工程中需要增加相关的依赖jar包,以满足Restful服务,修改pom.xml文件,增加cas-server-integration-restlet工程jar包依赖maven配置如下:
&dependency&
&groupId&org.jasig.cas&/groupId&
&artifactId&cas-server-integration-restlet&/artifactId&
&version&3.4.2.1&/version&
&type&jar&/type&
&/dependency&
其他相关jar包依稀,com.noelios.restlet.ext.servlet.jar
com.noelios.restlet.ext.spring-1.1.0.jar
com.noelios.restlet.jar
org.restlet.ext.spring-1.1.10.jar
org.restlet-1.1.10.jar,pom.xml文件配置如下:
&dependency&
&groupId&org.restlet&/groupId&
&artifactId&org.restlet&/artifactId&
&version&1.1.1&/version&
&scope&compile&/scope&
&/dependency&
&dependency&
&groupId&org.restlet&/groupId&
&artifactId&org.restlet.ext.spring&/artifactId&
&version&1.1.1&/version&
&scope&runtime&/scope&
&/dependency&
&dependency&
&groupId&com.noelios.restlet&/groupId&
&artifactId&com.noelios.restlet.ext.spring&/artifactId&
&version&1.1.1&/version&
&scope&runtime&/scope&
&/dependency&
&dependency&
&groupId&com.noelios.restlet&/groupId&
&artifactId&com.noelios.restlet.ext.servlet&/artifactId&
&version&1.1.1&/version&
&type&jar&/type&
&scope&runtime&/scope&
&/dependency&
此时需要maven数据源Restlet,具体pom.xml配置如下:
&repositories&
&repository&
&id&restlet-repository&/id&
&name&Restlet Repository&/name&
&url&http://maven.restlet.org&/url&
&/repository&
&/repositories&
上述pom.xml文件配置说白了就是将cas-server-integration-restlet工程里的pom.xml文件内容增加到cas-server-webapp工程中。
2、修改cas-server-webapp工程下web.xml文件,增加Restful的servlet配置,具体如下:
&servlet-name&restlet&/servlet-name&
&servlet-class&com.noelios.restlet.ext.spring.RestletFrameworkServlet&/servlet-class&
&load-on-startup&1&/load-on-startup&
&/servlet&
&servlet-mapping&
&servlet-name&restlet&/servlet-name&
&url-pattern&/v1/*&/url-pattern&
&/servlet-mapping&
关于 restlet的其他配置在 Cas3.5.2 Server中已经存在,具体文件地址: /WEB-INF/restlet-servlet.xml文件,配置完成之后直接启动Server。
下面来进行简单登录验证的测试,获取ST票据和TGT票据具体代码如下:
package com.spring.
import java.io.IOE
import java.util.logging.L
import java.util.regex.M
import java.util.regex.P
import mons.httpclient.HttpC
import mons.httpclient.NameValueP
import mons.httpclient.methods.PostM
public final class Client {
private static final Logger logger = Logger.getLogger(Client.class
.getName());
private Client() {
// static-only access
public static String getTicket(final String server, final String username,
final String password, final String service) {
notNull(server, &server must not be null&);
notNull(username, &username must not be null&);
notNull(password, &password must not be null&);
notNull(service, &service must not be null&);
return getServiceTicket(server,
getTicketGrantingTicket(server, username, password), service);
private static String getServiceTicket(final String server,
final String ticketGrantingTicket, final String service) {
if (ticketGrantingTicket == null)
final HttpClient client = new HttpClient();
final PostMethod post = new PostMethod(server + &/&
+ ticketGrantingTicket);
post.setRequestBody(new NameValuePair[] { new NameValuePair(&service&,
service) });
client.executeMethod(post);
final String response = post.getResponseBodyAsString();
switch (post.getStatusCode()) {
logger.warning(&Invalid response code (& + post.getStatusCode()
+ &) from CAS server!&);
(&Response (1k): &
+ response.substring(0,
Math.min(1024, response.length())));
catch (final IOException e) {
logger.warning(e.getMessage());
post.releaseConnection();
private static String getTicketGrantingTicket(final String server,
final String username, final String password) {
final HttpClient client = new HttpClient();
final PostMethod post = new PostMethod(server);
post.setRequestBody(new NameValuePair[] {new NameValuePair(&username&, username),
new NameValuePair(&password&, password) });
client.executeMethod(post);
final String response = post.getResponseBodyAsString();
switch (post.getStatusCode()) {
case 201: {
final Matcher matcher = pile(&.*action=\&.*/(.*?)\&.*&).matcher(response);
if (matcher.matches())
return matcher.group(1);
logger.warning(&Successful ticket granting request, but no ticket found!&);
(&Response (1k): &+ response.substring(0,Math.min(1024, response.length())));
logger.warning(&Invalid response code (& + post.getStatusCode()+ &) from CAS server!&);
(&Response (1k): &+ response.substring(0,Math.min(1024, response.length())));
}catch (final IOException e) {
logger.warning(e.getMessage());
}finally {
post.releaseConnection();
private static void notNull(final Object object, final String message) {
if (object == null)
throw new IllegalArgumentException(message);
public static void main(final String[] args) {
final String server = &http://127.0.0.1:8080/cas/v1/tickets&;
final String username = &000001&;
final String password = &&;
final String service = &http://localhost:8080/service&;
(getTicketGrantingTicket(server, username, password));//获取TGT票据
(getTicket(server, username, password, service));//获取ST票据
打开cas-server工程查找ticketExpirationPolicies.xml配置文件,ST票据过期配置,默认时间是10秒钟,使用次数为1 次或者超过10秒没有应用均会引起st过期,手动测试的时候一下ST票据就过期了,更改配置如下:
&bean id=&serviceTicketExpirationPolicy& class=&org.jasig.cas.ticket.support.MultiTimeUseOrTimeoutExpirationPolicy&
c:numberOfUses=&100& c:timeToKill=&${st.timeToKillInSeconds:10000}& c:timeUnit-ref=&SECONDS&/&
如果想了解CAS票据中ST与TGT过期策略,参考资料:/article/display/1225&&
此时已经拿到了ST票据和TGT票据,一般需要用户信息但是公司要求通过接口的方式提供给其他应用,本人建议CAS3.5.2 Server 集成 OAuth2.0 Server,通过第三方认证接口OAuth2.0 Server特性获取用户信息,具体参考资料:/article/display/1226
如果还想了解CAS Server其他插件的使用方法,可以在本站素文宅进行站内搜索或留言。
&&&&&&&&Java开源验证框架Oval是一个可扩展的Java对象数据验证框架,功能强大使用简单,验证规则可通过配置文件、注解等方式进行设置,规则的编写可以使用纯Java、JavaScript 、Groovy 、BeanShell等语言。下面本站素文宅为大家举例简单介绍一下如何使用Oval数据验证框架,本文仅供大家参考使用。Oval官方地址: http://oval.sourceforge.net/,如果想了解具体Oval可以去官网看一些相关资料工程实现Oval需要依赖相应的Jar包,本文采用maven工程在pom.xml文件中增加如下内容:&dependency&
&&&&&groupId&net.sf.oval&/groupId&
&&&&&artifactId&oval&/artifactId&
&&&&&version&1.81&/version&
&/dependency&实现Oval实体对象类,用户的年龄和名字进行校验,具体代码如下:public&class&OvalTest&{
&&&&@Min(18)
&&&&private&int&
&&&&@Length(min&=&6,&max&=&12)
&&&&private&String&
&&&&public&static&void&main(String[]&args)&{
&&&&&&&&OvalTest&ovalTest&=&new&OvalTest();
&&&&&&&&ovalTest.age&=&12;
&&&&&&&&ovalTest.name&=&&yoodb&;
&&&&&&&&Validator&validator&=&new&Validator();&
&&&&&&&&List&ConstraintViolation&&ret&=&validator.validate(ovalTest);
&&&&&&&&System.out.println(ret);
}执行main函数后,输出结果如下:[net.sf.oval.ConstraintViolation:&
&&&&OvalTest.age&cannot&be&smaller&than&18.0,&
&net.sf.oval.ConstraintViolation:&
&&&&OvalTest.name&is&not&between&6&and&12&characters&long]Oval支持很多类型注解,场景不同使用的注解也有不同,具体注解包含如下:字符类型@AsserURL、@Email、@Length、@MaxLength、@MinLength@NotNull、@NotBlank、@NotEmpty、@Digits、@HasSubstring数值类型@Range、@Max、@Min、@NotNegative布尔类型@AssertFalse、@AssertTrue集合数组@Size、@MaxSize、@MinSize、@MemberOf、@NotMemberOf表达式或自定义@Assert、@CheckWith、@NotMatchPatternCheck,@MatchPatternCheck、@ValidateWithMethod自定义注解,此处省略,如果想了解可在本站素文宅搜索。
切换注册登录
切换登录找回密码
切换登录注册
切换登录注册

我要回帖

更多关于 openldap 自定义属性 的文章

 

随机推荐