我的 Web 应用程序有一个安全区域,用户可以通过 JSP 登录该区域。JSP 将用户名和密码发送到一个 servlet,然后由该 servlet 检查用户凭证是否有效。如果它们有效,则将用户定向到安全资源。如何确保用户不能在不先验证的情况下导航到安全资源?
4 回答
一种常见的方法是在用户的会话中设置一个令牌,即
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
在 web.xml 中使用安全约束怎么样:
<security-constraint>
<web-resource-collection>
<web-resource-name>Secure</web-resource-name>
<url-pattern>/secure/*</url-pattern>
</web-resource-collection>
确保人们始终通过单个 servlet 访问您的应用程序,其中 servlet 将请求发送到 JSP,并将结果响应返回给浏览器。这样,您将始终控制发生的事情,因为只有一个入口点。
另一种方法是使用会话变量(服务器端,甚至在 cookie 中),每个需要身份验证的 JSP 都会对其进行检查。
安全性真的很难做到。比你通常想象的要多得多。必须使用框架(想到Acegi ),或者LenW 指出的 web.xml 的标准“”部分是必须的!至少使用过滤器来处理安全的授权部分。
我不太喜欢使用单点入口的解决方案(如Rolf 所建议的)。在我看来,这似乎是对您的架构施加的人为约束。在一个 webapp 中有多个 servlet 有很多很好的理由。
无论您做什么,都不要使用在每个页面上都依赖手动代码的技术(例如:每个 JSP 都以“if user_authentified ...”开头)。你会忘记把它放在某个地方......