配置驱动
缺省的配置允许任何服务通过https/imaps来使用cas,通过IPersonAttributeDAO的配置来获取属性。
一个考虑是要不要用webui,如果要用的话,就必须用ServiceRegistryDao来提供持久化,保持重启之前的状态。一般推荐用配置驱动
定义要素
配置访问策略
Service配置缺省支持属性
目的是控制服务授权规则。比如:是否允许cas,是否允许SSO,是否必须预先配有principle attribute,能根据访问者的角色,配置不同的attribute,来定义不同的规则。 需要解释的属性如下:
ssoEnabled
false,不管协议上renew之类的flag,强制用户认证,为统一认证提供支持。
requiredAttributes
包含principle attribute的map。根据角色定义规则,必须在CAS处理之前能解析,如果没有则忽略。
requireAllAttributes
缺省true,表示所有的attribute都要有,否则表示至少有一个匹配则可。控制哪一个,多少个attribute name必须存在。
caseInsensitive
缺省false,匹配attribute value时候是否case敏感。 注意1, attribute名字是大小写敏感的。 2,如果发布attributes时使用了attribute缓存, 所有required attributes必须要发布上去。参考
evaluationOrder
当有多个服务地址表达式(registration)覆盖的是同一个service,先evaluate那个registration
attributeReleasePolicy
允许发布给应用的属性,以及其他的过滤逻辑,参考.
解析出的属性根据cas或者saml协议返回,经历两个阶段:- 建立principle时,通过principleResolver组件,完成属性解析。
- 通过服务配置属性发布,发布属性。
attributeReleasePolicy
- attributeReleasePolicy
访问策略
不让用cas
{ "@class" : "org.jasig.cas.services.RegexRegisteredService", "serviceId" : "testId", "name" : "testId", "id" : 1, "accessStrategy" : { "@class" : "org.jasig.cas.services.DefaultRegisteredServiceAccessStrategy", "enabled" : false, "ssoEnabled" : true } }
不让用SSO,每次都要验证
{ "@class" : "org.jasig.cas.services.RegexRegisteredService", "serviceId" : "testId", "name" : "testId", "id" : 1, "accessStrategy" : { "@class" : "org.jasig.cas.services.DefaultRegisteredServiceAccessStrategy", "enabled" : true, "ssoEnabled" : false } }
principle必须有cn属性值为admin,giveName属性值为Administrator
{ "@class" : "org.jasig.cas.services.RegexRegisteredService", "serviceId" : "testId", "name" : "testId", "id" : 1, "accessStrategy" : { "@class" : "org.jasig.cas.services.DefaultRegisteredServiceAccessStrategy", "enabled" : true, "ssoEnabled" : true, "requiredAttributes" : { "@class" : "java.util.HashMap", "cn" : [ "java.util.HashSet", [ "admin" ] ], "givenName" : [ "java.util.HashSet", [ "Administrator" ] ] } } }
principle必须有cn属性,值为admin,Admin或者TheAdmin;或者有member属性,值为admins,adminGroup或者staff
{ "@class" : "org.jasig.cas.services.RegexRegisteredService", "serviceId" : "testId", "name" : "testId", "id" : 1, "accessStrategy" : { "@class" : "org.jasig.cas.services.DefaultRegisteredServiceAccessStrategy", "enabled" : true, "requireAllAttributes" : false, "ssoEnabled" : true, "requiredAttributes" : { "@class" : "java.util.HashMap", "cn" : [ "java.util.HashSet", [ "admin, Admin, TheAdmin" ] ], "member" : [ "java.util.HashSet", [ "admins, adminGroup, staff" ] ] } } }
配置代理认证proxyPolicy
service可以配置是否允许代理认证。如果定义了允许,pgt发放给service。同时定义接受pgt的url。
缺省的配置,拒绝
{ "@class" : "org.jasig.cas.services.RegexRegisteredService", "serviceId" : "testId", "name" : "testId", "id" : 1, "proxyPolicy" : { "@class" : "org.jasig.cas.services.RefuseRegisteredServiceProxyPolicy" } }
仅允许代理匹配正规表达式的PGT url
{ "@class" : "org.jasig.cas.services.RegexRegisteredService", "serviceId" : "testId", "name" : "testId", "id" : 1, "proxyPolicy" : { "@class" : "org.jasig.cas.services.RegexMatchingRegisteredServiceProxyPolicy", "pattern" : "^https?://.*" } }
服务定制属性
CAS可以为服务添加任意的属性。这些定制属性看作额外的meta-data,如电话,地址,或者基于服务的扩展使用的属性。
- 例子
{ "@class" : "org.jasig.cas.services.RegexRegisteredService", "serviceId" : "^https://.+", "name" : "sample service", "id" : 100, "properties" : { "@class" : "java.util.HashMap", "email" : { "@class" : "org.jasig.cas.services.DefaultRegisteredServiceProperty", "values" : [ "java.util.HashSet", [ "[email protected]", "[email protected]" ] ] } } }
持久化
基于内存的bean
<bean id="serviceRegistryDao" class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl" p:registeredServices-ref="registeredServicesList" /> <util:list id="registeredServicesList"> <bean class="org.jasig.cas.services.RegexRegisteredService" p:id="1" p:name="HTTPS and IMAPS services on example.com" p:serviceId="^(https|imaps)://([A-Za-z0-9_-]+\.)*example\.com/.*" p:evaluationOrder="0" /> </util:list>
基于Json的JsonServiceRegistryDao,这是缺省的配置方式,。
在application context启动时读取json文件,dao定义文件的路径,递归查找相关的json文件.json问的变更可立即生效。如果把serviceId定义成正规表达式,要注意转义。- 定义dao, 位于deployerConfigContext.xml
<alias name="jsonServiceRegistryDao" alias="serviceRegistryDao" />
- dao查找路径, cas.properties
service.registry.config.location=classpath:services
Json文件内容
{ "@class" : "org.jasig.cas.services.RegexRegisteredService", "serviceId" : "testId", "name" : "testId", "id" : 1, "evaluationOrder" : 0 }
json文件名推荐
JSON fileName = serviceName + "-" + serviceNumericId + ".json"
- 支持注释的句法, 注意最后一行的逗号
{ /* Generic service definition that applies to https/imaps urls that wish to register with CAS for authentication. */ "@class" : "org.jasig.cas.services.RegexRegisteredService", "serviceId" : "^(https|imaps)://.*", "name" : "HTTPS and IMAPS", "id" : 10000001, }
- 定义dao, 位于deployerConfigContext.xml
基于mongo的MongoServiceRegistryDao
基于ldap的LdapServiceRegistryDao
基于jpa的JpaServiceRegistryDaoImpl