具有 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的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot:提供公共和私有(受限)静态内容

从具有私有和公共 IP 的虚拟机连接到私有 IP 上的 Google Cloud SQL 实例失败

C++ 中具有公共继承的虚函数和私有成员

Spring Security - 公共页面重定向到使用无效会话 ID 登录

具有公共/私有访问权限的 Appsync 身份验证,无需 AWS Cognito

私有的嵌套类(内部或静态)是不是可能具有具有公共访问权限的方法?