我在这里已经阅读了很好的答案,如何保护REST服务,但所有这些都只是纯粹的理论,并没有多大帮助。如何在使用REST时实现JDBCRealm-FORM身份验证?
登录表单
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Login Form</title>
</head>
<body>
<form method="post" action="j_security_check">
<p>You need to log in to access protected information.</p>
<table>
<tr>
<td>User name:</td>
<td><input type="text" name="j_username" /></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="j_password" /></td>
</tr>
</table>
<p><input type="submit" value="Login" /></p>
</form>
</body>
</html>
的web.xml
<security-constraint>
<web-resource-collection>
<web-resource-name>How to protect REST</web-resource-name>
<url-pattern>/protected/*</url-pattern>----> What is that in case of rest?
<http-method>GET</http-method>
<http-method>POST</http-method>
<http-method>HEAD</http-method>
<http-method>PUT</http-method>
<http-method>OPTIONS</http-method>
<http-method>TRACE</http-method>
<http-method>DELETE</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
<role-name>customer</role-name>
<role-name>user</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>jdbcRealm</realm-name>
</login-config>
<security-role>
<role-name>admin</role-name>
</security-role>
<security-role>
<role-name>user</role-name>
</security-role>
<security-role>
<description/>
<role-name>customer</role-name>
</security-role>
问题:
1)我在Glassfish中创建了JDBCRealm,它正在运行。我用另一个jsf-app测试了它。在clien-REST-service的情况下,例如:<url-pattern>/protected/*</url-pattern>
在正常情况下,它引用受保护的jsp / jsf / xhtml等页面的“文件夹”,但现在在哪里?
2)会话怎么样?我认为在无状态上下文中使用会话是不可能的
3)甚至可以在REST中使用基于FORM的身份验证吗?
4)教程的任何链接,其中有人比我更聪明,解释如何保护客户端 - 服务器休息应用程序。
答案 0 :(得分:1)
您无法使用REST进行FORM身份验证,因为每个请求本身都必须完整且无状态。具有重定向的表单不是。您需要使用标准的基于HTTP头的机制,如Basic,Digest等。
答案 1 :(得分:1)
1)我在Glassfish中创建了JDBCRealm,它正在运行。我测试过了 它与另一个jsf-app。在clien-REST-service的情况下是什么 实例:/ protected / *正常情况下 它指的是受保护的jsp / jsf / xhtml等页面所在的“文件夹”,但是 现在在哪里?
您可以选择保护整个REST服务子域或其中的一部分。假设您将根配置为/rest
,那就是您在网址模式中添加的内容。
2)会话怎么样?我认为不可能使用会话 无国籍语境
取决于您的REST实施。使用JAX-RS(Jersey),答案绝对是肯定的,您可以使用HTTP会话。您可以通过@Context
注释将其注入资源类:
@Path("/echo")
public class EchoServiceImpl {
@Context
private HttpSession session;
}
确认你可以使用会话后,我强烈建议反对它,因为RESTful调用应该是无状态的。
3)甚至可以在REST中使用基于FORM的身份验证吗?
使用基于表单的REST身份验证没有意义,没有。您正在设计供其他计算机系统使用的服务,而不是人类使用的服务。该过程中不应包含任何交互式UI。
4)任何链接到教程,其中有人比我更聪明解释如何 安全客户端 - 服务器休息应用程序。
这是一个艰难的,有很多指南,但其中很多都非常特定于REST实现中使用的特定技术堆栈。首先,我建议您将当前配置从FORM更改为BASIC,并考虑使用SSL保护端点。请记住,当您使用基本身份验证时,您需要在Authorization标头中包含用户凭据:
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
您可以阅读有关如何计算标题here
的信息熟悉基本/摘要式身份验证后,您就可以开始寻找更高级的安全选项,例如OAuth。