我有一个Restful示例,它使用 Spring Security 和 OAuth2 ,效果很好。基本上,我可以获得access_token
并使用access_token
来访问受保护的资源。这里的类似示例:Securing Restful Web Services with Spring Security and OAuth
我通过添加customUserAuthenticationProvider
来通过 Hibernate 对 Mysql 进行身份验证来更改该示例。与此示例中描述的内容类似:spring4-rest-oauth2
我将InMemoryTokenStore
替换为JdbcTokenStore
。 oauth_access_token
表的MySQL模式如下所示:
CREATE TABLE `oauth_access_token` (
`token_id` varchar(256) DEFAULT NULL,
`token` blob,
`authentication_id` varchar(255) DEFAULT NULL,
`user_name` varchar(256) DEFAULT NULL,
`client_id` varchar(256) DEFAULT NULL,
`authentication` blob,
`refresh_token` varchar(256) DEFAULT NULL,
`access_token_validity` int(11) DEFAULT NULL,
`refresh_token_validity` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
到目前为止没问题。一切都很好。每次登录时都会有一行添加到oauth_access_token
表(我可以使用MySQL工作台查看blob列(令牌))。我可以使用此访问令牌来访问受保护的源,而不会出现任何问题。
现在,我运行了2个Jetty实例,每个实例都有自己的端口,即 8080 和 8888 。每个实例都有相同的war文件。我在第一个实例上登录以获取access_token
,之后我使用此access_token从第二个实例访问受保护资源。但是,它始终返回401 error: Invalid access token
。
如果我在第一个实例中使用此access_token
来访问资源,那么它运行良好。
另一个奇怪的观察是,如果我尝试从第二个实例访问资源,access_token
中的oauth_access_token
将被删除。我必须重新登录才能再次将这一行插入表中。
springSecurity.xml
文件:
SpringSecurity 我的问题是:
- 有没有人遇到类似我的问题?我知道使用JdbcTokenStore在某种程度上是直截了当的,但我不知道为什么它发生在我的情况下。
- 如何解决这个问题?
任何评论,指示,建议都非常感谢。