Apereo CAS 5.0.X 启用OAuth2服务时的一个坑

问题描述

引入cas-server-support-oauth-webflow依赖,启用oauth2服务,保存service先后使用了JSON和JPA的方式(如果不了解,可以参考http://blog.csdn.net/xichenguan/article/details/60770491
补充一下科学知识)。在使用JSON的时候,Tomcat启动,CAS部署过程中,在配置的目录下面会生成一个名为[OAuthCallbackurl-随机数字]格式的文件。内容如下:

{
  @class: org.apereo.cas.support.oauth.services.OAuthCallbackAuthorizeService
  serviceId: https://cas.example.org:8443/cas/oauth2.0/callbackAuthorize.*
  name: OAuth Callback url
  id: 32577569223569
  description: OAuth Wrapper Callback Url
  evaluationOrder: -2147483648
  logoutType: BACK_CHANNEL
  attributeReleasePolicy:
  {
    @class: org.apereo.cas.services.ReturnAllAttributeReleasePolicy
    principalAttributesRepository:
    {
      @class: org.apereo.cas.authentication.principal.DefaultPrincipalAttributesRepository
      expiration: 2
      timeUnit: HOURS
    }
    authorizedToReleaseCredentialPassword: false
    authorizedToReleaseProxyGrantingTicket: false
  }
  multifactorPolicy:
  {
    @class: org.apereo.cas.services.DefaultRegisteredServiceMultifactorPolicy
    failureMode: CLOSED
  }
  accessStrategy:
  {
    @class: org.apereo.cas.services.DefaultRegisteredServiceAccessStrategy
    enabled: true
    ssoEnabled: true
    requireAllAttributes: true
    caseInsensitive: false
  }
}

用JPA方式验证,同样是在数据库中生成一条同样含义的记录。

问题处理

第一步

每次生成的时候,大部分内容都是固定不变的,想到这些中肯定有部分或者全部都是静态变量,于是挨个找,在CasOAuthConfiguration中找到下面一段代码:

@PostConstruct
    public void initializeServletApplicationContext() {
        final String oAuthCallbackUrl = casProperties.getServer().getPrefix() + BASE_OAUTH20_URL + '/'
                + OAuthConstants.CALLBACK_AUTHORIZE_URL_DEFINITION;

        final Service callbackService = this.webApplicationServiceFactory.createService(oAuthCallbackUrl);
        final RegisteredService svc = servicesManager.findServiceBy(callbackService);

        if (svc == null || !svc.getServiceId().equals(oAuthCallbackUrl)) {
            final OAuthCallbackAuthorizeService service = new OAuthCallbackAuthorizeService();
            service.setName("OAuth Callback url");
            service.setDescription("OAuth Wrapper Callback Url");
            service.setServiceId(oAuthCallbackUrl);
            service.setEvaluationOrder(Integer.MIN_VALUE);
            service.setAttributeReleasePolicy(new ReturnAllAttributeReleasePolicy());

            servicesManager.save(service);
            servicesManager.load();
        }

        this.validationServiceSelectionStrategies.add(0, oauth20ValidationServiceSelectionStrategy());
    }

问题就出在casProperties.getServer().getPrefix()上了,这是一个嵌套的属性配置文件,里面的字段是这么定义的:

public class ServerProperties {
    
    private int connectionTimeout = 20000;
    
    private String name = "https://cas.example.org:8443";
    private String prefix = name.concat("/cas");
    private Ajp ajp = new Ajp();
    private Http http = new Http();
    private ExtendedAccessLog extAccessLog = new ExtendedAccessLog();
    }

就是这个prefix字段了,他使用了name变量,也就是配置一下这个name变量就行了。

第二步

于是在application.properties文件中按照命名空间添加下面几个配置:

cas.server.name=https://asdf.com:8443
cas.server.prefix=https://asdf.com:8443/cas

asdf.com是我测试CAS过程中,部署CAS服务的操作系统的域名,此域名添加到了需要访问CAS服务器的操作系统的hosts文件里。

第三步

远程debug了好久,发现还是不行,想到可能是其他地方也有配置,被覆盖了,就在项目底下,各种找,完了一会linux命令之后,已经绝望了。

第四步

折腾了两个多小时,挨个文件看,突然发现bootstrap.properies文件中有这么个配置:

spring.cloud.config.server.native.searchLocations=file:///etc/cas/config

疯了一样找这个目录,果然里面有个cas.properties文件:

cas.server.name: https://cas.example.org:8443
cas.server.prefix: https://cas.example.org:8443/cas

cas.adminPagesSecurity.ip=127\.0\.0\.1

logging.config: file:/etc/cas/config/log4j2.xml
# cas.serviceRegistry.config.location: classpath:/services

呵呵,猜对了一半,是被覆盖了。

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈振阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值