【问题标题】:Ensuring Users are Authenticated in Java Web App确保用户在 Java Web App 中经过身份验证
【发布时间】:2008-12-07 21:20:33
【问题描述】:

我的网络应用程序有一个安全区域,用户可以通过 JSP 登录。 JSP 将用户名和密码发送到一个 servlet,然后由该 servlet 检查用户凭证是否有效。如果它们有效,则将用户定向到安全资源。如何确保用户不能在不先验证的情况下导航到安全资源?

【问题讨论】:

  • 我认为声明式身份验证不是应用程序的选项(通过部署描述符的容器管理身份验证)。

标签: java security jsp servlets web-applications


【解决方案1】:

一种常见的方法是在用户的会话中设置一个令牌,即,

session.setAttribute("loggedIn", "true");

甚至

session.setAttribute("loggedInUser", "someUserName");

并在任何应保护的页面上进行检查。一个好的策略是使用附加到任何要保护的页面的 servlet 过滤器来执行检查。如果他们没有通过检查,过滤器可以重定向到登录页面。另见此处:http://java.sun.com/products/servlet/Filters.html

这是一篇关于使用过滤器进行身份验证的好文章:http://www.developer.com/java/ent/article.php/3467801

【讨论】:

  • 为什么这种方法比容器管理的身份验证更好?
  • 这取决于您的需求。对于一个简单的应用程序,这更容易,但 cma 是一个很好的健壮解决方案,可以满足更高级的需求。与往常一样,您的里程可能会有所不同。
  • 我更喜欢类似 session.setAttribute("user", userBean);当然没有敏感信息。
【解决方案2】:

如何在 web.xml 中使用安全约束:

<security-constraint>
      <web-resource-collection>
         <web-resource-name>Secure</web-resource-name>
         <url-pattern>/secure/*</url-pattern>
      </web-resource-collection>

【讨论】:

【解决方案3】:

确保人们始终通过单个 servlet 访问您的应用程序,其中 servlet 将请求发送到 JSP,并将结果响应返回给浏览器。这样,您将始终可以控制发生的事情,因为只有一个入口点。

另一种方法是使用会话变量(服务器端,甚至在 cookie 中),每个需要身份验证的 JSP 都会检查该变量。

【讨论】:

    【解决方案4】:

    安全性真的很难做到。比你通常想象的要多得多。必须使用框架(想到Acegi)或web.xml 的标准“”部分作为LenW pointed out!至少使用过滤器来处理安全的授权部分。

    我不太喜欢使用单点入口的解决方案(如suggested by Rolf)。在我看来,这似乎是对您的架构施加的人为约束。在一个 web 应用中拥有多个 servlet 有很多充分的理由。

    无论您做什么,都不要使用在每个页面上都依赖手动代码的技术(例如:每个 JSP 都以“if user_authentified ...”开头)。你会忘记把它放在某个地方...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-15
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多