如何高度限制具有“特定角色”的用户从“某个地方”访问应用程序?
Posted
技术标签:
【中文标题】如何高度限制具有“特定角色”的用户从“某个地方”访问应用程序?【英文标题】:How to HIGHLY restrict users with "specific roles" to access the application from "a certain place"? 【发布时间】:2013-08-03 03:39:49 【问题描述】:我需要限制特定用户的角色才能在从特定位置访问应用程序时使用它,比如说“具有员工角色的用户只能从办公室或其分支机构访问应用程序”
IP 检查?它是可变的 如果我遵循私钥/公钥呢?这样做的缺点是,如果我将密钥放在 cookie 中,他们可以读取或清除他们的 cookie。 基于mac地址?它是可变的【问题讨论】:
或者您可以简单地编写一个Filter
类,并覆盖/实现doFilter(ServletRequest request, ServletResponse response, FilterChain filter) throws IOException, ServletException
。阅读更多here:
你知道一个例子吗,或者你会进一步解释我不明白你,如果我使用过滤器那么如何根据 IP 检查它们?
你可以根据他们电脑的Mac地址来识别他们。
@J888 有趣但如何?
@TimNorman 不知道只是想到了
【参考方案1】:
“具有员工角色的用户只能从办公室或其分支机构访问应用程序”
使用站点到站点 ***。这有效地将问题转化为内网登录问题,解决起来很简单。
通过站点到站点 ***,您可以确定远程站点的身份,因为连接设置和身份验证通常由站点上的路由器执行,站点上的用户不需要进行配置知道(或在他们的电脑上,所以不能带走)。
一旦转化为 Intranet 问题,只需将应用程序绑定到 Intranet 地址并像保护任何其他 Intranet 资源一样保护它。
【讨论】:
【参考方案2】:要设置这样的授权规则,首先需要定义的是:
“办公室或其分支机构”在计算机识别方面的定义是什么? 通常是来自某些子网的计算机,如上面的答案所述 - 在这种情况下,解决方案是显而易见的。 第二种可能性 - 有人带着他的个人电脑、笔记本电脑或触摸板等来到办公室。如果安全策略允许这样做,我们唯一可以验证的实体是用户。我们可能仍然希望从办公室(作为物理位置,例如建筑物)/从家里来区分访问。在这种情况下,我建议查看一次性密码生成设备,这些设备应该仅供办公室的用户使用。【讨论】:
【参考方案3】:你不能相信 IP,MAC 地址更没用,你唯一的朋友就是密码学。假设您的用户将使用他的凭据进行身份验证,您还需要以某种方式对机器进行身份验证。这是通过在每台机器上放置不同的证书并让客户端使用他的证书向服务器证明他的“身份”来完成的。
如果您的客户端-服务器通信基于 SSL,您可以要求客户端身份验证 - 查看 Java HTTPS client certificate authentication、http://rap.ucar.edu/staff/paddy/cacerts/ 或 http://docs.oracle.com/cd/E11035_01/wls100/security/SSL_client.html。
如果您的通信不是基于 SSL,或者您希望在应用程序级别进行身份验证 - 您仍然可以使用证书。从信任库加载它并通过证明您可以访问私钥来证明您的身份(通常服务器会发送一个质询,用公钥随机加密的东西,您通过使用私钥解密并将其发回来回答。这样您无需出示即可证明您拥有私钥)。
如果您不想存储证书,您可以在每台机器上放置一个不同的加密文件。客户端将能够对其进行解密(使用硬编码密钥)并向服务器发送类似于密码的内容。
您如何保护这些证书?文件上用户的只读权限...
几个注意事项-
您永远不能真正信任客户端计算机。一个足智多谋的敌对用户会破坏任何东西。你“敌人”的资源越多,你需要投入的防御就越多。
您没有指定有关您的环境的详细信息。我确定有一些我不知道的系统级解决方案。例如 - 您的服务器可能会连接到 Active Directory 并监控特定机器上的用户登录。
有时最好的解决方案可能并非来自软件级别。例如,如果您的服务器使用指定端口进行通信。您可以在防火墙\路由器\个人防火墙上允许\阻止此流量 - 在比您的服务器更足以解决此问题的地方。如果您有应用程序控制强制实施,您可以允许客户端本身仅在特定机器上运行。
您还可以寻找一些方法来创建一些唯一的 PC 指纹(主板 ID、cpu id、Active Directory 中的 SID、HDD id、MAC 地址...) - 然后您的服务器可以存储允许的指纹列表您的客户将发送当前计算的指纹。这仍然回到 - 您对客户的信任程度如何?
【讨论】:
【参考方案4】:更新:
在某个地方限制用户的唯一方法是:
您必须在 Office 中定义固定 IP! 或者,至少是办公室及其分支机构的子网掩码。 在您的应用程序中,检查请求中的子网掩码并将其与预先配置的固定办公室子网掩码进行比较。 因此,要么将这些固定 IP 放入 webconf.xml,要么将 IP 的子网掩码放入;无论如何,该解决方案将始终连接到网络解决方案。
您可以尝试这样的方法来检查固定 IP:
public class TestFilter implements Filter
public void destroy()
public void init(FilterConfig arg0) throws ServletException
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filter) throws IOException, ServletException
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
IpAddressMatcher matcher = new IpAddressMatcher("192.168.1.0/24");
try
if(!matcher.matches(req.getHeader("X-Forwarded-For")))
res.sendRedirect("AnotherPage.jsp");
catch (UnsupportedOperationException e)
//Handle IT
此外,您可能需要检查以下内容以了解每种情况:
request.getHeader("Proxy-Client-IP");
request.getHeader("WL-Proxy-Client-IP");
request.getHeader("HTTP_CLIENT_IP");
request.getHeader("HTTP_X_FORWARDED_FOR");
request.getRemoteAddr();
【讨论】:
他们可以将他们的 ip 更改为可接受的应用范围吗? 这是否意味着 IP 由其 ISP 提供且不可更改? @TimNorman 我在考虑基于 IP 的投票系统,因此不应该更改,但使用 Mac 地址,你会强制他们一直使用同一台计算机。 如果你想限制定义的 IP,你手动处理它。否则,你必须想点别的。 白名单是什么意思?这是否意味着将授权的 ips 保存在文件或数据库中并一直检查它们?【参考方案5】:仅当人们来自具有静态 IP 的地方时,IP 限制才有效。像在家里这样有动态的任何地方都行不通。
如果您不能使用静态但仍想通过 IP 进行限制,您可以使用http://dyn.com/dns/ 之类的服务为您的 IP 分配 FQDN。然后您可以通过 FQDN 进行查找以查看它是否返回与请求中的 IP 匹配的 IP。这个查找可以被缓存,所以你每隔几个小时才做一次。棘手的部分是每个位置都必须设置一个动态 DNS 客户端。现在有些路由器已经内置了这个功能。
您无法通过 HttpServlet 类获取 MAC 地址。如果您能从与您的服务器通信的设备获取 MAC 地址,该设备很可能是路由器、负载平衡器、交换机之类的东西。 MAC 地址不可路由。
回复:密钥,您可以使用 x509 证书 - http://static.springsource.org/spring-security/site/docs/3.0.x/reference/x509.html
【讨论】:
感谢您的回答,我对任何可以解决问题的方法不感兴趣。 '对任何东西都不感兴趣'?你的意思是“对任何东西感兴趣”吗?如果您确实有任何意思,请告诉我您是否希望我扩展任何内容。 对不起,我对 IP 或 Mac 地址方法不感兴趣,因为它们很容易更改。我阅读了 x509 的文档,这很有趣,但它似乎依赖于平台,而且我要为授权服务付费,对吗?你知道还有其他方法吗? 是的,部署 PKI 以使用 x509 证书可能会产生成本。人们还可以移动/复制客户端证书,因此它确实是按位置控制访问的一个很好的解决方案。通过 IP 确实是我所知道的唯一一个按位置限制访问的方法。如果您必须处理动态IP,那就有点痛苦了。过去我通过要求用户提供静态 IP 来解决此类问题。 如果你自己签署你的证书,你可以为 PKI 设置一些服务器。如果您需要由受信任的 CA 签名的证书,那将花费您一些钱。但是,我不认为使用证书会起作用。据我所知,受 IP 限制是按位置限制的唯一方法。【参考方案6】:我从here找到了以下代码,你可以根据他们的mac地址来识别他们。
这个one 也很有帮助。
package com.mkyong;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
public class App
public static void main(String[] args)
InetAddress ip;
try
ip = InetAddress.getLocalHost();
System.out.println("Current IP address : " + ip.getHostAddress());
NetworkInterface network = NetworkInterface.getByInetAddress(ip);
byte[] mac = network.getHardwareAddress();
System.out.print("Current MAC address : ");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < mac.length; i++)
sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));
System.out.println(sb.toString());
catch (UnknownHostException e)
e.printStackTrace();
catch (SocketException e)
e.printStackTrace();
【讨论】:
您无法从客户端获取 MAC 地址。您从与您的服务器通信的设备获取 MAC 地址,这很可能是路由器、负载平衡器、交换机之类的设备。 @denov 我知道,但在这种情况下,他可以设置他的应用程序的授权用户使用它的 MAC 地址。世界其他地区将无法访问它。你觉得呢? 让我们从 MAC 地址不可路由的事实开始。 是的,IP 是我所知道的按位置限制的唯一方法。请参阅下面的 cmets。【参考方案7】:我只想解决您问题的这一部分:
我正在尝试实现 IP 方法,但它遇到了以下错误。
java.lang.IncompatibleClassChangeError: com.project.Default and
com.project.Default$IpCheckService disagree on InnerClasses attribute
IncompatibleClassChangeError
表示编译时的类型与运行时的类型之间存在冲突。在这种情况下,您似乎有(拥有)一个嵌套的 IpCheckService
类,该类已从 static
更改为非static
(或反之亦然!),并且不知何故您已成功加载其中一个类的旧版本。
这是一个构建或部署问题。如果你能弄清楚这里出了什么问题,那么你的代码很有可能会起作用。 (至少,你不会再得到 this 异常。)
【讨论】:
以上是关于如何高度限制具有“特定角色”的用户从“某个地方”访问应用程序?的主要内容,如果未能解决你的问题,请参考以下文章
Laravel - 我有一个具有不同角色的用户模型。如何在具有特定角色的用户之间建立关系? [关闭]