小编NoU*_*ame的帖子

如何在需要引用过滤器bean的grails中注册spring bean

我正在尝试使用spring security oauth(库不是grails插件,只有一个非常过时的grails插件).

我希望我的应用程序成为OAuth 1.0a提供程序(而不是OAuth 2).spring-security-oauth的OAuth2部分似乎没有这个问题,因为它不需要在提供者配置中引用过滤链.

我想要的是配置它如下所示:https://github.com/spring-projects/spring-security-oauth/blob/master/samples/oauth/sparklr/src/main/webapp/WEB-INF/applicationContext .XML

我把它翻译成grails的groovy语法:

consumerDetails(InMemoryConsumerDetailsService)
tokenServices(InMemoryProviderTokenServices)

xmlns oauth: "http://www.springframework.org/schema/security/oauth"
oauth.'consumer-details-service'(id:'consumerDetails') {
    oauth.consumer(name: 'AndroidRegisterApp', key:'testkey', secret:"testkey123", resourceName:'mobileApi', resourceDescription:'Register devices via mobile app')
}

oauth.provider(
        'consumer-details-service-ref': "consumerDetails",
        'token-services-ref':'tokenServices',
        'request-token-url':'/oauth/request_token',
        'authenticate-token-url':'/oauth/authorize',
        'access-granted-url':'/requestTokenAuthorized',
        'access-token-url':'/oauth/access_token',
        'filter-chain-ref':'springSecurityFilterChainProxy',
        'require10a':'true'
)
Run Code Online (Sandbox Code Playgroud)

问题是当OAuthProviderBeanDefinitionParser在grails app start期间解析此配置时,springSecurityFilterChainProxy尚不存在,因此它在这里失败:https: //github.com/spring-projects/spring-security-oauth/blob/master/spring-security -oauth/src/main/java/org/springframework/security/oauth/config/OAuthProviderBeanDefinitionParser.java#L179在调用ConfigUtils.findFilterChain时,重要的一行是:

parserContext.getRegistry().getBeanDefinition(filterChainRef)
Run Code Online (Sandbox Code Playgroud)

失败的原因是"springSecurityFilterChainProxy"在parserContext中不存在(我想因为它只是稍后创建的).我也尝试推迟这个初始化,把它放在这样的引导代码中:

def initOauthProvider() {
    def bb = new BeanBuilder(grailsApplication.getMainContext())
    bb.beans {
                   // same bean initialization code as above
            }
     }
Run Code Online (Sandbox Code Playgroud)

这也失败了,因为在这里我只有parserContext中的bean是我定义的一部分(它没有看到任何其他grails bean)

有什么办法可以解决这个问题吗?我已经看到BeanBuilder也可以使用RuntimeSpringConfiguration对象进行初始化,但我还没有找到任何方法如何从我的grails应用程序中获取它.

我在用:

  • Grails 2.2.4
  • spring-security-oauth:1.0.5与这些排除:'spring-security-web','spring-security-core','spring-asm'
  • spring-security-core:2.0-RC2 …

java grails spring oauth spring-security

14
推荐指数
1
解决办法
1565
查看次数

通过angular1 ui-router导航后,更改检测在ng2组件中无法正常工作

在使用ng-upgrade在大型ng1(V1.5.9)应用程序(使用ui-router)中使用一些新的ng2(V2.2.4)组件的应用程序中,我目前看到一个非常奇怪的变化检测问题.据我所知,这已经在ng2的一些升级中引入,但遗憾的是我目前无法轻易验证.

我现在把它简化为一个最小的例子,我只需要这个组件:

@Component({
    selector:'my-ng2-demo',
    template: '<div>{{status}}</div>'
})
export class MyNg2Demo implements OnDestroy {
    public status:boolean = true;
    private interval:any;

    constructor() {
        this.interval = setInterval(() => {
            this.status = !this.status;
            console.log('status: ' + this.status);
        }, 2000);
    }

    ngOnDestroy():void {
        clearInterval(this.interval);
    }

}
Run Code Online (Sandbox Code Playgroud)

该组件在升级适配器中升级,并在模块中注册为入口组件.

该组件用于ng1控制器的模板,如下所示:

<my-ng2-demo></my-ng2-demo>
Run Code Online (Sandbox Code Playgroud)

当我打开浏览器并直接导航到该页面(ng1控制器的路径)时,一切都按预期工作:ui每2秒显示一次真/假.

然而:当我离开然后回到页面(访问一些不同的路线)然后突然改变检测似乎不起作用.显示的值仅交替大约每5-6秒,看起来很随机,虽然在控制台中我仍然看到预期的值.

当我将组件的构造函数更改为:

constructor(private zone: NgZone) {
    this.interval = setInterval(() => {
        zone.run(() => {
            this.status = !this.status;
            console.log('status: ' + this.status);
        });
    }, 2000);
}
Run Code Online (Sandbox Code Playgroud)

它突然再次起作用.

显然这不是一个可行的解决方案,因为我在真实应用程序中看到的行为要复杂得多(我可能需要zone.run在几十个地方添加,这是不可维护的).

我已经调试了几个小时,不明白发生了什么.在Chrome的JavaScript分析器中,我基本上看到该页面在5-6秒内几乎整天都没有发生任何事情.

探查 这不是该演示组件的屏幕截图(但它看起来基本相同),但是从我最初测试的标签组件进行剖析(标签切换时间也很长,中间没有可见的操作).

更新:

经过一些实验后,我发现相当令人惊讶的是,当我不再将状态改变代码放入zone.run呼叫中时,我添加了一个调用 …

angularjs angular-ui-router ng-upgrade angular

14
推荐指数
1
解决办法
659
查看次数