我们现有的Web应用程序是用Spring security 3.1构建的,Wink(用于休息) 我们现在需要为几个资源添加oauth2(client_credentials流),我查看了许多示例,并使用Http命名空间配置以及spring调度程序servlet(我们迄今为止没有这样做)所有示例
问题是http命名空间正在创建我们已经在应用程序中使用的springSecurityFilterChain,所以首先我重命名现有的过滤器,以便默认可以与旧的过滤器共存。 但这不起作用,它既可以是现有的链条,也可以是新的链条。 我已经尝试过以下几种了 1.通过给出空配置位置(在web.xml中)禁用调度程序servlet上下文 2.尝试在application-context.xml中使用oauth配置(右边是现有的FilterChainProxy) 3.通过将其过滤器设置为none(因此新的可以接管)来允许现有链中的/ oauth / token 4.试图在现有链中声明oauth过滤器,但是它没有得到正确的客户端验证的问题
我真的不知道还有什么可以尝试 - 所以问题是:是否有可能在同一个webapp中声明两者?或者是否可以旧方式声明oauth2配置。
感谢 施洛米
答案 0 :(得分:2)
我最终设法做到了这一点,让API(用oauth保护)完全分离的url与应用程序的其余部分。 所以Http命名空间正在创建springSecurityFilterChain bean,而其他bean只有不同的bean名称。每个人都通过web.xml中的DelegatingProxy委派
我需要将API URL前缀放在其他链中并允许所有请求通过,留下oauth安全通道来处理安全性。 (即filter-chain pattern =“/ api / **”filters =“none)
关于弹簧oauth2受限于弹簧MVC这么紧,我认为不是一个好的实现。 调度程序servlet的映射不能用于/ *,但必须是/ auth / *所以需要一个特殊的过滤器从ClientCredentialsTokenEndpointFilter继承,需要特殊的路径,比如super(“/ auth / oauth / token”)。
它也不能是/ api / *,因为这是我们的rest框架映射的真实API URI(wink RestServlet) 所以我们有这样的东西
http://server:port/context/auth/oauth/token
http://server:port/context/api/someresource (protected with oauth2)
http://server:port/context/rest/someresource (old rest for application)
施洛米