具有 Spring Security 的公共和私有 REST API
Posted
技术标签:
【中文标题】具有 Spring Security 的公共和私有 REST API【英文标题】:Public & Private REST APIs with Spring Security 【发布时间】:2014-02-03 20:50:46 【问题描述】:我有一个用 Spring 3.2 编写的 REST Web 服务,它通过 Spring Security 使用 CAS 进行保护,我希望它提供一个相同的私有内部 API,可以由我们专用网络上的其他服务器使用而无需身份验证.
例如,/app/public/people/id
和 /app/private/people/id
这两个端点都将映射到同一个处理程序,但后者会绕过安全性,而前者需要 CAS 身份验证。
我可以将两者都放在同一个@RequestMapping
注释中并指定不同的安全拦截吗?例如,
安全拦截:
<security:intercept-url pattern="/private/**" access="permitAll() />
<security:intercept-url pattern="/public/**" access="isAuthenticated()" requires-channel="https"/>
请求映射:@RequestMapping(value="/public/people/id", "/private/people/id")
【问题讨论】:
【参考方案1】:如何使用IP地址来区分来自私有网络和公共网络的访问?然后,您可以只为两者定义一个端点。例如,如果你的私网是 192.168.1.0/24,那么:
<security:intercept-url pattern="/**"
access="isAuthenticated() or hasIpAddress('192.168.1.0/24')"
requires-channel="https" />
如果您在反向代理后面有 Servlet 容器,请不要忘记设置 X-Forwarded-For
(或 X-Real-IP
)标头并配置您的容器以使用它;否则 Spring Security 将看到反向代理的 IP,而不是客户端。
【讨论】:
以上是关于具有 Spring Security 的公共和私有 REST API的主要内容,如果未能解决你的问题,请参考以下文章
从具有私有和公共 IP 的虚拟机连接到私有 IP 上的 Google Cloud SQL 实例失败
Spring Security - 公共页面重定向到使用无效会话 ID 登录